mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 22:28:56 +00:00
(svn r3138) -Fix: [clone vehicles] fixed assert when it was possible to allocate some vehicles to clone a train, but not for all cars
Now it gives "too many vehicles" error message instead To make this work, AllocateVehicles() needed to be moved to vehicle.c (from aircraft_cmd.c) and made non-static
This commit is contained in:
parent
7d4d13df35
commit
d86829d0e0
@ -121,29 +121,6 @@ void DrawAircraftEngine(int x, int y, EngineID engine, uint32 image_ormod)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate many vehicles */
|
|
||||||
static bool AllocateVehicles(Vehicle **vl, int num)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
Vehicle *v;
|
|
||||||
bool success = true;
|
|
||||||
|
|
||||||
for(i=0; i!=num; i++) {
|
|
||||||
vl[i] = v = AllocateVehicle();
|
|
||||||
if (v == NULL) {
|
|
||||||
success = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
v->type = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (--i >= 0) {
|
|
||||||
vl[i]->type = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32 EstimateAircraftCost(EngineID engine_type)
|
int32 EstimateAircraftCost(EngineID engine_type)
|
||||||
{
|
{
|
||||||
return AircraftVehInfo(engine_type)->base_cost * (_price.aircraft_base>>3)>>5;
|
return AircraftVehInfo(engine_type)->base_cost * (_price.aircraft_base>>3)>>5;
|
||||||
|
48
vehicle.c
48
vehicle.c
@ -315,6 +315,34 @@ Vehicle *AllocateVehicle(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Allocates a lot of vehicles and frees them again
|
||||||
|
* @param vl pointer to an array of vehicles that can store all the vehicles in the test
|
||||||
|
* @param num number of vehicles to test for
|
||||||
|
* returns true if there is room to allocate all the vehicles
|
||||||
|
*/
|
||||||
|
bool AllocateVehicles(Vehicle **vl, int num)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Vehicle *v;
|
||||||
|
bool success = true;
|
||||||
|
|
||||||
|
for(i = 0; i != num; i++) {
|
||||||
|
vl[i] = v = AllocateVehicle();
|
||||||
|
if (v == NULL) {
|
||||||
|
success = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
v->type = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (--i >= 0) {
|
||||||
|
vl[i]->type = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc)
|
void *VehicleFromPos(TileIndex tile, void *data, VehicleFromPosProc *proc)
|
||||||
{
|
{
|
||||||
int x,y,x2,y2;
|
int x,y,x2,y2;
|
||||||
@ -1482,7 +1510,6 @@ int32 CmdCloneVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||||||
Vehicle *v_front, *v;
|
Vehicle *v_front, *v;
|
||||||
Vehicle *w_front, *w, *w_rear;
|
Vehicle *w_front, *w, *w_rear;
|
||||||
int cost, total_cost = 0;
|
int cost, total_cost = 0;
|
||||||
// VehicleID *new_id;
|
|
||||||
|
|
||||||
if (!IsVehicleIndex(p1))
|
if (!IsVehicleIndex(p1))
|
||||||
return CMD_ERROR;
|
return CMD_ERROR;
|
||||||
@ -1506,6 +1533,25 @@ int32 CmdCloneVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||||||
|
|
||||||
if (v->type == VEH_Train && v->subtype != TS_Front_Engine) return CMD_ERROR;
|
if (v->type == VEH_Train && v->subtype != TS_Front_Engine) return CMD_ERROR;
|
||||||
|
|
||||||
|
// check that we can allocate enough vehicles
|
||||||
|
if (!(flags & DC_EXEC)) {
|
||||||
|
int veh_counter = 0;
|
||||||
|
do {
|
||||||
|
veh_counter++;
|
||||||
|
} while ((v = v->next) != NULL);
|
||||||
|
|
||||||
|
{
|
||||||
|
Vehicle **vl = malloc(sizeof(Vehicle*) * veh_counter); // some platforms do not support Vehicle *vl[veh_counter]
|
||||||
|
bool can_allocate_vehicles = AllocateVehicles(vl, veh_counter);
|
||||||
|
free(vl);
|
||||||
|
if (!can_allocate_vehicles) {
|
||||||
|
return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
v = v_front;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
cost = DoCommand(x, y, v->engine_type, 3, flags, CMD_BUILD_VEH(v->type));
|
cost = DoCommand(x, y, v->engine_type, 3, flags, CMD_BUILD_VEH(v->type));
|
||||||
|
|
||||||
|
@ -274,6 +274,7 @@ typedef void *VehicleFromPosProc(Vehicle *v, void *data);
|
|||||||
|
|
||||||
void VehicleServiceInDepot(Vehicle *v);
|
void VehicleServiceInDepot(Vehicle *v);
|
||||||
Vehicle *AllocateVehicle(void);
|
Vehicle *AllocateVehicle(void);
|
||||||
|
bool AllocateVehicles(Vehicle **vl, int num);
|
||||||
Vehicle *ForceAllocateVehicle(void);
|
Vehicle *ForceAllocateVehicle(void);
|
||||||
Vehicle *ForceAllocateSpecialVehicle(void);
|
Vehicle *ForceAllocateSpecialVehicle(void);
|
||||||
void UpdateVehiclePosHash(Vehicle *v, int x, int y);
|
void UpdateVehiclePosHash(Vehicle *v, int x, int y);
|
||||||
|
Loading…
Reference in New Issue
Block a user