equal
deleted
inserted
replaced
126 int32 cost; |
126 int32 cost; |
127 Vehicle *v; |
127 Vehicle *v; |
128 UnitID unit_num; |
128 UnitID unit_num; |
129 Engine *e; |
129 Engine *e; |
130 |
130 |
131 if (!IsEngineBuildable(p1, VEH_Road, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE); |
131 if (!IsEngineBuildable(p1, VEH_ROAD, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE); |
132 |
132 |
133 SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); |
133 SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); |
134 |
134 |
135 cost = EstimateRoadVehCost(p1); |
135 cost = EstimateRoadVehCost(p1); |
136 if (flags & DC_QUERY_COST) return cost; |
136 if (flags & DC_QUERY_COST) return cost; |
142 |
142 |
143 v = AllocateVehicle(); |
143 v = AllocateVehicle(); |
144 if (v == NULL) return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); |
144 if (v == NULL) return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); |
145 |
145 |
146 /* find the first free roadveh id */ |
146 /* find the first free roadveh id */ |
147 unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_Road); |
147 unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_ROAD); |
148 if (unit_num > _patches.max_roadveh) |
148 if (unit_num > _patches.max_roadveh) |
149 return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); |
149 return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME); |
150 |
150 |
151 if (flags & DC_EXEC) { |
151 if (flags & DC_EXEC) { |
152 int x; |
152 int x; |
198 v->service_interval = _patches.servint_roadveh; |
198 v->service_interval = _patches.servint_roadveh; |
199 |
199 |
200 v->date_of_last_service = _date; |
200 v->date_of_last_service = _date; |
201 v->build_year = _cur_year; |
201 v->build_year = _cur_year; |
202 |
202 |
203 v->type = VEH_Road; |
203 v->type = VEH_ROAD; |
204 v->cur_image = 0xC15; |
204 v->cur_image = 0xC15; |
205 v->random_bits = VehicleRandomBits(); |
205 v->random_bits = VehicleRandomBits(); |
206 |
206 |
207 v->vehicle_flags = 0; |
207 v->vehicle_flags = 0; |
208 if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE); |
208 if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE); |
211 |
211 |
212 InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); |
212 InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile); |
213 RebuildVehicleLists(); |
213 RebuildVehicleLists(); |
214 InvalidateWindow(WC_COMPANY, v->owner); |
214 InvalidateWindow(WC_COMPANY, v->owner); |
215 if (IsLocalPlayer()) |
215 if (IsLocalPlayer()) |
216 InvalidateAutoreplaceWindow(VEH_Road); // updates the replace Road window |
216 InvalidateAutoreplaceWindow(VEH_ROAD); // updates the replace Road window |
217 |
217 |
218 GetPlayer(_current_player)->num_engines[p1]++; |
218 GetPlayer(_current_player)->num_engines[p1]++; |
219 } |
219 } |
220 |
220 |
221 return cost; |
221 return cost; |
233 |
233 |
234 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
234 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
235 |
235 |
236 v = GetVehicle(p1); |
236 v = GetVehicle(p1); |
237 |
237 |
238 if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR; |
238 if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; |
239 |
239 |
240 /* Check if this road veh can be started/stopped. The callback will fail or |
240 /* Check if this road veh can be started/stopped. The callback will fail or |
241 * return 0xFF if it can. */ |
241 * return 0xFF if it can. */ |
242 callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); |
242 callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v); |
243 if (callback != CALLBACK_FAILED && callback != 0xFF) { |
243 if (callback != CALLBACK_FAILED && callback != 0xFF) { |
283 |
283 |
284 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
284 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
285 |
285 |
286 v = GetVehicle(p1); |
286 v = GetVehicle(p1); |
287 |
287 |
288 if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR; |
288 if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; |
289 |
289 |
290 SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); |
290 SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES); |
291 |
291 |
292 if (!IsRoadVehInDepotStopped(v)) { |
292 if (!IsRoadVehInDepotStopped(v)) { |
293 return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE); |
293 return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE); |
382 const Depot *dep; |
382 const Depot *dep; |
383 |
383 |
384 if (p2 & DEPOT_MASS_SEND) { |
384 if (p2 & DEPOT_MASS_SEND) { |
385 /* Mass goto depot requested */ |
385 /* Mass goto depot requested */ |
386 if (!ValidVLWFlags(p2 & VLW_MASK)) return CMD_ERROR; |
386 if (!ValidVLWFlags(p2 & VLW_MASK)) return CMD_ERROR; |
387 return SendAllVehiclesToDepot(VEH_Road, flags, p2 & DEPOT_SERVICE, _current_player, (p2 & VLW_MASK), p1); |
387 return SendAllVehiclesToDepot(VEH_ROAD, flags, p2 & DEPOT_SERVICE, _current_player, (p2 & VLW_MASK), p1); |
388 } |
388 } |
389 |
389 |
390 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
390 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
391 |
391 |
392 v = GetVehicle(p1); |
392 v = GetVehicle(p1); |
393 |
393 |
394 if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR; |
394 if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; |
395 |
395 |
396 if (v->vehstatus & VS_CRASHED) return CMD_ERROR; |
396 if (v->vehstatus & VS_CRASHED) return CMD_ERROR; |
397 |
397 |
398 if (IsRoadVehInDepot(v)) return CMD_ERROR; |
398 if (IsRoadVehInDepot(v)) return CMD_ERROR; |
399 |
399 |
452 |
452 |
453 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
453 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
454 |
454 |
455 v = GetVehicle(p1); |
455 v = GetVehicle(p1); |
456 |
456 |
457 if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR; |
457 if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; |
458 |
458 |
459 if (v->vehstatus & VS_STOPPED || |
459 if (v->vehstatus & VS_STOPPED || |
460 v->u.road.crashed_ctr != 0 || |
460 v->u.road.crashed_ctr != 0 || |
461 v->breakdown_ctr != 0 || |
461 v->breakdown_ctr != 0 || |
462 v->u.road.overtaking != 0 || |
462 v->u.road.overtaking != 0 || |
575 static void* EnumCheckRoadVehCrashTrain(Vehicle* v, void* data) |
575 static void* EnumCheckRoadVehCrashTrain(Vehicle* v, void* data) |
576 { |
576 { |
577 const Vehicle* u = (Vehicle*)data; |
577 const Vehicle* u = (Vehicle*)data; |
578 |
578 |
579 return |
579 return |
580 v->type == VEH_Train && |
580 v->type == VEH_TRAIN && |
581 myabs(v->z_pos - u->z_pos) <= 6 && |
581 myabs(v->z_pos - u->z_pos) <= 6 && |
582 myabs(v->x_pos - u->x_pos) <= 4 && |
582 myabs(v->x_pos - u->x_pos) <= 4 && |
583 myabs(v->y_pos - u->y_pos) <= 4 ? |
583 myabs(v->y_pos - u->y_pos) <= 4 ? |
584 v : NULL; |
584 v : NULL; |
585 } |
585 } |
802 short x_diff = v->x_pos - rvf->x; |
802 short x_diff = v->x_pos - rvf->x; |
803 short y_diff = v->y_pos - rvf->y; |
803 short y_diff = v->y_pos - rvf->y; |
804 |
804 |
805 return |
805 return |
806 rvf->veh != v && |
806 rvf->veh != v && |
807 v->type == VEH_Road && |
807 v->type == VEH_ROAD && |
808 !IsRoadVehInDepot(v) && |
808 !IsRoadVehInDepot(v) && |
809 myabs(v->z_pos - rvf->veh->z_pos) < 6 && |
809 myabs(v->z_pos - rvf->veh->z_pos) < 6 && |
810 v->direction == rvf->dir && |
810 v->direction == rvf->dir && |
811 (dist_x[v->direction] >= 0 || (x_diff > dist_x[v->direction] && x_diff <= 0)) && |
811 (dist_x[v->direction] >= 0 || (x_diff > dist_x[v->direction] && x_diff <= 0)) && |
812 (dist_x[v->direction] <= 0 || (x_diff < dist_x[v->direction] && x_diff >= 0)) && |
812 (dist_x[v->direction] <= 0 || (x_diff < dist_x[v->direction] && x_diff >= 0)) && |
943 static void* EnumFindVehToOvertake(Vehicle* v, void* data) |
943 static void* EnumFindVehToOvertake(Vehicle* v, void* data) |
944 { |
944 { |
945 const OvertakeData* od = (OvertakeData*)data; |
945 const OvertakeData* od = (OvertakeData*)data; |
946 |
946 |
947 return |
947 return |
948 v->tile == od->tile && v->type == VEH_Road && v != od->u && v != od->v ? |
948 v->tile == od->tile && v->type == VEH_ROAD && v != od->u && v != od->v ? |
949 v : NULL; |
949 v : NULL; |
950 } |
950 } |
951 |
951 |
952 static bool FindRoadVehToOvertake(OvertakeData *od) |
952 static bool FindRoadVehToOvertake(OvertakeData *od) |
953 { |
953 { |
1827 void RoadVehiclesYearlyLoop() |
1827 void RoadVehiclesYearlyLoop() |
1828 { |
1828 { |
1829 Vehicle *v; |
1829 Vehicle *v; |
1830 |
1830 |
1831 FOR_ALL_VEHICLES(v) { |
1831 FOR_ALL_VEHICLES(v) { |
1832 if (v->type == VEH_Road) { |
1832 if (v->type == VEH_ROAD) { |
1833 v->profit_last_year = v->profit_this_year; |
1833 v->profit_last_year = v->profit_this_year; |
1834 v->profit_this_year = 0; |
1834 v->profit_this_year = 0; |
1835 InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
1835 InvalidateWindow(WC_VEHICLE_DETAILS, v->index); |
1836 } |
1836 } |
1837 } |
1837 } |
1854 |
1854 |
1855 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
1855 if (!IsValidVehicleID(p1)) return CMD_ERROR; |
1856 |
1856 |
1857 v = GetVehicle(p1); |
1857 v = GetVehicle(p1); |
1858 |
1858 |
1859 if (v->type != VEH_Road || !CheckOwnership(v->owner)) return CMD_ERROR; |
1859 if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR; |
1860 if (!IsRoadVehInDepotStopped(v)) return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE); |
1860 if (!IsRoadVehInDepotStopped(v)) return_cmd_error(STR_9013_MUST_BE_STOPPED_INSIDE); |
1861 |
1861 |
1862 if (new_cid > NUM_CARGO || !CanRefitTo(v->engine_type, new_cid)) return CMD_ERROR; |
1862 if (new_cid > NUM_CARGO || !CanRefitTo(v->engine_type, new_cid)) return CMD_ERROR; |
1863 |
1863 |
1864 SET_EXPENSES_TYPE(EXPENSES_ROADVEH_RUN); |
1864 SET_EXPENSES_TYPE(EXPENSES_ROADVEH_RUN); |