summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aircraft_cmd.c4
-rw-r--r--roadveh_cmd.c4
-rw-r--r--ship_cmd.c7
-rw-r--r--train_cmd.c18
-rw-r--r--vehicle.c5
5 files changed, 18 insertions, 20 deletions
diff --git a/aircraft_cmd.c b/aircraft_cmd.c
index 54b881537..fd7dad834 100644
--- a/aircraft_cmd.c
+++ b/aircraft_cmd.c
@@ -158,7 +158,7 @@ static int32 EstimateAircraftCost(EngineID engine_type)
/** Build an aircraft.
* @param tile tile of depot where aircraft is built
* @param p1 aircraft type being built (engine)
- * @param p2 unused
+ * @param p2 bit 0 when set, the unitnumber will be 0, otherwise it will be a free number
*/
int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
@@ -186,7 +186,7 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
}
- unit_num = GetFreeUnitNumber(VEH_Aircraft);
+ unit_num = (HASBIT(p2, 0) == true) ? 0 : GetFreeUnitNumber(VEH_Aircraft);
if (unit_num > _patches.max_aircraft)
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
diff --git a/roadveh_cmd.c b/roadveh_cmd.c
index c9d1176f8..963f635ec 100644
--- a/roadveh_cmd.c
+++ b/roadveh_cmd.c
@@ -103,7 +103,7 @@ static int32 EstimateRoadVehCost(EngineID engine_type)
/** Build a road vehicle.
* @param tile tile of depot where road vehicle is built
* @param p1 bus/truck type being built (engine)
- * @param p2 unused
+ * @param p2 bit 0 when set, the unitnumber will be 0, otherwise it will be a free number
*/
int32 CmdBuildRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
@@ -129,7 +129,7 @@ int32 CmdBuildRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
/* find the first free roadveh id */
- unit_num = GetFreeUnitNumber(VEH_Road);
+ unit_num = (HASBIT(p2, 0) == true) ? 0 : GetFreeUnitNumber(VEH_Road);
if (unit_num > _patches.max_roadveh)
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
diff --git a/ship_cmd.c b/ship_cmd.c
index 3cb66e430..1d6e1383d 100644
--- a/ship_cmd.c
+++ b/ship_cmd.c
@@ -811,7 +811,7 @@ void ShipsYearlyLoop(void)
/** Build a ship.
* @param tile tile of depot where ship is built
* @param p1 ship type being built (engine)
- * @param p2 unused
+ * @param p2 bit 0 when set, the unitnumber will be 0, otherwise it will be a free number
*/
int32 CmdBuildShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
@@ -833,8 +833,9 @@ int32 CmdBuildShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (!IsTileOwner(tile, _current_player)) return CMD_ERROR;
v = AllocateVehicle();
- if (v == NULL || IsOrderPoolFull() ||
- (unit_num = GetFreeUnitNumber(VEH_Ship)) > _patches.max_ships)
+ unit_num = (HASBIT(p2, 0) == true) ? 0 : GetFreeUnitNumber(VEH_Ship);
+
+ if (v == NULL || IsOrderPoolFull() || unit_num > _patches.max_ships)
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
if (flags & DC_EXEC) {
diff --git a/train_cmd.c b/train_cmd.c
index 81cccfc04..35f5d41af 100644
--- a/train_cmd.c
+++ b/train_cmd.c
@@ -699,8 +699,8 @@ static void AddRearEngineToMultiheadedTrain(Vehicle* v, Vehicle* u, bool buildin
/** Build a railroad vehicle.
* @param tile tile of the depot where rail-vehicle is built
* @param p1 engine type id
- * @param p2 bit 0 prevents any free cars from being added to the train
- * bit 1 when set, the train will get number 0, otherwise it will get a free number
+ * @param p2 bit 0 when set, the train will get number 0, otherwise it will get a free number
+ * bit 1 prevents any free cars from being added to the train
*/
int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
@@ -744,14 +744,10 @@ int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
v = vl[0];
- if (HASBIT(p2, 1)) {
- // no number is needed, so we assign 0. The engine is likely intended for a train with more than one engine
- unit_num = 0;
- } else {
- unit_num = GetFreeUnitNumber(VEH_Train);
- if (unit_num > _patches.max_trains)
- return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
- }
+ unit_num = (HASBIT(p2, 0) == true) ? 0 : GetFreeUnitNumber(VEH_Train);
+ if (unit_num > _patches.max_trains)
+ return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
+
if (flags & DC_EXEC) {
DiagDirection dir = GetRailDepotDirection(tile);
int x = TileX(tile) * TILE_SIZE + _vehicle_initial_x_fract[dir];
@@ -815,7 +811,7 @@ int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
TrainConsistChanged(v);
UpdateTrainAcceleration(v);
- if (!HASBIT(p2, 0)) { // check if the cars should be added to the new vehicle
+ if (!HASBIT(p2, 1)) { // check if the cars should be added to the new vehicle
NormalizeTrainVehInDepot(v);
}
diff --git a/vehicle.c b/vehicle.c
index 9404a6db2..3d1103014 100644
--- a/vehicle.c
+++ b/vehicle.c
@@ -1490,7 +1490,7 @@ int32 CmdCloneVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
Vehicle *v_front, *v;
Vehicle *w_front, *w, *w_rear;
int cost, total_cost = 0;
- uint32 build_argument = 1;
+ uint32 build_argument = 2;
if (!IsVehicleIndex(p1)) return CMD_ERROR;
v = GetVehicle(p1);
@@ -1624,7 +1624,7 @@ static int32 ReplaceVehicle(Vehicle **w, byte flags)
new_engine_type = EngineReplacementForPlayer(p, old_v->engine_type);
if (new_engine_type == INVALID_ENGINE) new_engine_type = old_v->engine_type;
- cost = DoCommand(old_v->tile, new_engine_type, 1, flags, CMD_BUILD_VEH(old_v->type));
+ cost = DoCommand(old_v->tile, new_engine_type, 3, flags, CMD_BUILD_VEH(old_v->type));
if (CmdFailed(cost)) return cost;
if (flags & DC_EXEC) {
@@ -1660,6 +1660,7 @@ static int32 ReplaceVehicle(Vehicle **w, byte flags)
new_v->profit_last_year = old_v->profit_last_year;
new_v->service_interval = old_v->service_interval;
new_front = true;
+ new_v->unitnumber = old_v->unitnumber; // use the same unit number
new_v->current_order = old_v->current_order;
if (old_v->type == VEH_Train && GetNextVehicle(old_v) != NULL){