(svn r4921) - Backport from trunk (r4825, r4826, r4829): 0.4
authorDarkvater
Sat, 20 May 2006 17:11:09 +0000
branch0.4
changeset 10014 9157e384afb6
parent 10013 b6dc91f0cd71
child 10015 924c183a6045
(svn r4921) - Backport from trunk (r4825, r4826, r4829):
Game crashes when cloning/autoreplace reaches train-limit
aircraft_cmd.c
roadveh_cmd.c
ship_cmd.c
train_cmd.c
vehicle.c
--- a/aircraft_cmd.c	Sat May 20 15:54:46 2006 +0000
+++ b/aircraft_cmd.c	Sat May 20 17:11:09 2006 +0000
@@ -130,7 +130,7 @@
 /** Build an aircraft.
  * @param x,y tile coordinates 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(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -159,7 +159,7 @@
 		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);
 
--- a/roadveh_cmd.c	Sat May 20 15:54:46 2006 +0000
+++ b/roadveh_cmd.c	Sat May 20 17:11:09 2006 +0000
@@ -99,7 +99,7 @@
 /** Build a road vehicle.
  * @param x,y tile coordinates 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(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -126,7 +126,7 @@
 		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);
 
--- a/ship_cmd.c	Sat May 20 15:54:46 2006 +0000
+++ b/ship_cmd.c	Sat May 20 17:11:09 2006 +0000
@@ -824,7 +824,7 @@
 /** Build a ship.
  * @param x,y tile coordinates 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(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -847,8 +847,9 @@
 	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) {
--- a/train_cmd.c	Sat May 20 15:54:46 2006 +0000
+++ b/train_cmd.c	Sat May 20 17:11:09 2006 +0000
@@ -670,7 +670,8 @@
 /** Build a railroad vehicle.
  * @param x,y tile coordinates (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
+ * @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(int x, int y, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -714,7 +715,7 @@
 
 		v = vl[0];
 
-		unit_num = GetFreeUnitNumber(VEH_Train);
+		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);
 
@@ -782,7 +783,7 @@
 			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);
 			}
 
--- a/vehicle.c	Sat May 20 15:54:46 2006 +0000
+++ b/vehicle.c	Sat May 20 17:11:09 2006 +0000
@@ -1495,6 +1495,7 @@
 	Vehicle *v_front, *v;
 	Vehicle *w_front, *w, *w_rear;
 	int cost, total_cost = 0;
+	uint32 build_argument = 2;
 
 	if (!IsVehicleIndex(p1)) return CMD_ERROR;
 	v = GetVehicle(p1);
@@ -1537,7 +1538,8 @@
 			continue;
 		}
 
-		cost = DoCommand(x, y, v->engine_type, 1, flags, CMD_BUILD_VEH(v->type));
+		cost = DoCommand(x, y, v->engine_type, build_argument, flags, CMD_BUILD_VEH(v->type));
+		build_argument = 3; // ensure that we only assign a number to the first engine
 
 		if (CmdFailed(cost)) return cost;
 
@@ -1625,7 +1627,7 @@
 	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->x_pos, old_v->y_pos, new_engine_type, 1, flags, CMD_BUILD_VEH(old_v->type));
+	cost = DoCommand(old_v->x_pos, old_v->y_pos, new_engine_type, 3, flags, CMD_BUILD_VEH(old_v->type));
 	if (CmdFailed(cost)) return cost;
 
 	if (flags & DC_EXEC) {
@@ -1661,6 +1663,7 @@
 			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){