(svn r16385) -Codechange: move u.disaster to DisasterVehicle.

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
rubidium 15 years ago
parent 6d1c974254
commit 74ea34ca66

@ -111,16 +111,16 @@ static const SpriteID * const _disaster_images[] = {
_disaster_images_4, _disaster_images_5, ///< small and big submarine sprites _disaster_images_4, _disaster_images_5, ///< small and big submarine sprites
}; };
static void DisasterVehicleUpdateImage(Vehicle *v) static void DisasterVehicleUpdateImage(DisasterVehicle *v)
{ {
SpriteID img = v->u.disaster.image_override; SpriteID img = v->image_override;
if (img == 0) img = _disaster_images[v->subtype][v->direction]; if (img == 0) img = _disaster_images[v->subtype][v->direction];
v->cur_image = img; v->cur_image = img;
} }
/** Initialize a disaster vehicle. These vehicles are of type VEH_DISASTER, are unclickable /** Initialize a disaster vehicle. These vehicles are of type VEH_DISASTER, are unclickable
* and owned by nobody */ * and owned by nobody */
static void InitializeDisasterVehicle(Vehicle *v, int x, int y, byte z, Direction direction, byte subtype) static void InitializeDisasterVehicle(DisasterVehicle *v, int x, int y, byte z, Direction direction, byte subtype)
{ {
v->x_pos = x; v->x_pos = x;
v->y_pos = y; v->y_pos = y;
@ -131,7 +131,7 @@ static void InitializeDisasterVehicle(Vehicle *v, int x, int y, byte z, Directio
v->UpdateDeltaXY(INVALID_DIR); v->UpdateDeltaXY(INVALID_DIR);
v->owner = OWNER_NONE; v->owner = OWNER_NONE;
v->vehstatus = VS_UNCLICKABLE; v->vehstatus = VS_UNCLICKABLE;
v->u.disaster.image_override = 0; v->image_override = 0;
v->current_order.Free(); v->current_order.Free();
DisasterVehicleUpdateImage(v); DisasterVehicleUpdateImage(v);
@ -139,7 +139,7 @@ static void InitializeDisasterVehicle(Vehicle *v, int x, int y, byte z, Directio
MarkSingleVehicleDirty(v); MarkSingleVehicleDirty(v);
} }
static void SetDisasterVehiclePos(Vehicle *v, int x, int y, byte z) static void SetDisasterVehiclePos(DisasterVehicle *v, int x, int y, byte z)
{ {
v->x_pos = x; v->x_pos = x;
v->y_pos = y; v->y_pos = y;
@ -149,7 +149,7 @@ static void SetDisasterVehiclePos(Vehicle *v, int x, int y, byte z)
DisasterVehicleUpdateImage(v); DisasterVehicleUpdateImage(v);
VehicleMove(v, true); VehicleMove(v, true);
Vehicle *u = v->Next(); DisasterVehicle *u = v->Next();
if (u != NULL) { if (u != NULL) {
int safe_x = Clamp(x, 0, MapMaxX() * TILE_SIZE); int safe_x = Clamp(x, 0, MapMaxX() * TILE_SIZE);
int safe_y = Clamp(y - 1, 0, MapMaxY() * TILE_SIZE); int safe_y = Clamp(y - 1, 0, MapMaxY() * TILE_SIZE);
@ -180,7 +180,7 @@ static void SetDisasterVehiclePos(Vehicle *v, int x, int y, byte z)
* 2: Clear the runway after some time and remove crashed zeppeliner * 2: Clear the runway after some time and remove crashed zeppeliner
* If not airport was found, only state 0 is reached until zeppeliner leaves map * If not airport was found, only state 0 is reached until zeppeliner leaves map
*/ */
static bool DisasterTick_Zeppeliner(Vehicle *v) static bool DisasterTick_Zeppeliner(DisasterVehicle *v)
{ {
v->tick_counter++; v->tick_counter++;
@ -248,9 +248,9 @@ static bool DisasterTick_Zeppeliner(Vehicle *v)
if (++v->age == 1) { if (++v->age == 1) {
CreateEffectVehicleRel(v, 0, 7, 8, EV_EXPLOSION_LARGE); CreateEffectVehicleRel(v, 0, 7, 8, EV_EXPLOSION_LARGE);
SndPlayVehicleFx(SND_12_EXPLOSION, v); SndPlayVehicleFx(SND_12_EXPLOSION, v);
v->u.disaster.image_override = SPR_BLIMP_CRASHING; v->image_override = SPR_BLIMP_CRASHING;
} else if (v->age == 70) { } else if (v->age == 70) {
v->u.disaster.image_override = SPR_BLIMP_CRASHED; v->image_override = SPR_BLIMP_CRASHED;
} else if (v->age <= 300) { } else if (v->age <= 300) {
if (GB(v->tick_counter, 0, 3) == 0) { if (GB(v->tick_counter, 0, 3) == 0) {
uint32 r = Random(); uint32 r = Random();
@ -281,9 +281,9 @@ static bool DisasterTick_Zeppeliner(Vehicle *v)
* 1: Home in on a road vehicle and crash it >:) * 1: Home in on a road vehicle and crash it >:)
* If not road vehicle was found, only state 0 is used and Ufo disappears after a while * If not road vehicle was found, only state 0 is used and Ufo disappears after a while
*/ */
static bool DisasterTick_Ufo(Vehicle *v) static bool DisasterTick_Ufo(DisasterVehicle *v)
{ {
v->u.disaster.image_override = (HasBit(++v->tick_counter, 3)) ? SPR_UFO_SMALL_SCOUT_DARKER : SPR_UFO_SMALL_SCOUT; v->image_override = (HasBit(++v->tick_counter, 3)) ? SPR_UFO_SMALL_SCOUT_DARKER : SPR_UFO_SMALL_SCOUT;
if (v->current_order.GetDestination() == 0) { if (v->current_order.GetDestination() == 0) {
/* Fly around randomly */ /* Fly around randomly */
@ -388,10 +388,10 @@ static void DestructIndustry(Industry *i)
* @param news_message The string that's used as news message. * @param news_message The string that's used as news message.
* @param industry_flag Only attack industries that have this flag set. * @param industry_flag Only attack industries that have this flag set.
*/ */
static bool DisasterTick_Aircraft(Vehicle *v, uint16 image_override, bool leave_at_top, StringID news_message, IndustryBehaviour industry_flag) static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16 image_override, bool leave_at_top, StringID news_message, IndustryBehaviour industry_flag)
{ {
v->tick_counter++; v->tick_counter++;
v->u.disaster.image_override = (v->current_order.GetDestination() == 1 && HasBit(v->tick_counter, 2)) ? image_override : 0; v->image_override = (v->current_order.GetDestination() == 1 && HasBit(v->tick_counter, 2)) ? image_override : 0;
GetNewVehiclePosResult gp = GetNewVehiclePos(v); GetNewVehiclePosResult gp = GetNewVehiclePos(v);
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos); SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@ -450,19 +450,19 @@ static bool DisasterTick_Aircraft(Vehicle *v, uint16 image_override, bool leave_
} }
/** Airplane handling. */ /** Airplane handling. */
static bool DisasterTick_Airplane(Vehicle *v) static bool DisasterTick_Airplane(DisasterVehicle *v)
{ {
return DisasterTick_Aircraft(v, SPR_F_15_FIRING, true, STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY, INDUSTRYBEH_AIRPLANE_ATTACKS); return DisasterTick_Aircraft(v, SPR_F_15_FIRING, true, STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY, INDUSTRYBEH_AIRPLANE_ATTACKS);
} }
/** Helicopter handling. */ /** Helicopter handling. */
static bool DisasterTick_Helicopter(Vehicle *v) static bool DisasterTick_Helicopter(DisasterVehicle *v)
{ {
return DisasterTick_Aircraft(v, SPR_AH_64A_FIRING, false, STR_NEWS_DISASTER_HELICOPTER_FACTORY, INDUSTRYBEH_CHOPPER_ATTACKS); return DisasterTick_Aircraft(v, SPR_AH_64A_FIRING, false, STR_NEWS_DISASTER_HELICOPTER_FACTORY, INDUSTRYBEH_CHOPPER_ATTACKS);
} }
/** Helicopter rotor blades; keep these spinning */ /** Helicopter rotor blades; keep these spinning */
static bool DisasterTick_Helicopter_Rotors(Vehicle *v) static bool DisasterTick_Helicopter_Rotors(DisasterVehicle *v)
{ {
v->tick_counter++; v->tick_counter++;
if (HasBit(v->tick_counter, 0)) return true; if (HasBit(v->tick_counter, 0)) return true;
@ -480,7 +480,7 @@ static bool DisasterTick_Helicopter_Rotors(Vehicle *v)
* 1: Land there and breakdown all trains in a radius of 12 tiles; and now we wait... * 1: Land there and breakdown all trains in a radius of 12 tiles; and now we wait...
* because as soon as the Ufo lands, a fighter jet, a Skyranger, is called to clear up the mess * because as soon as the Ufo lands, a fighter jet, a Skyranger, is called to clear up the mess
*/ */
static bool DisasterTick_Big_Ufo(Vehicle *v) static bool DisasterTick_Big_Ufo(DisasterVehicle *v)
{ {
v->tick_counter++; v->tick_counter++;
@ -509,12 +509,12 @@ static bool DisasterTick_Big_Ufo(Vehicle *v)
v->current_order.SetDestination(2); v->current_order.SetDestination(2);
Vehicle *u; Vehicle *target;
FOR_ALL_VEHICLES(u) { FOR_ALL_VEHICLES(target) {
if (u->type == VEH_TRAIN || u->type == VEH_ROAD) { if (target->type == VEH_TRAIN || target->type == VEH_ROAD) {
if (Delta(u->x_pos, v->x_pos) + Delta(u->y_pos, v->y_pos) <= 12 * TILE_SIZE) { if (Delta(target->x_pos, v->x_pos) + Delta(target->y_pos, v->y_pos) <= 12 * TILE_SIZE) {
u->breakdown_ctr = 5; target->breakdown_ctr = 5;
u->breakdown_delay = 0xF0; target->breakdown_delay = 0xF0;
} }
} }
} }
@ -530,12 +530,12 @@ static bool DisasterTick_Big_Ufo(Vehicle *v)
delete v; delete v;
return false; return false;
} }
u = new DisasterVehicle(); DisasterVehicle *u = new DisasterVehicle();
InitializeDisasterVehicle(u, -6 * TILE_SIZE, v->y_pos, 135, DIR_SW, ST_BIG_UFO_DESTROYER); InitializeDisasterVehicle(u, -6 * TILE_SIZE, v->y_pos, 135, DIR_SW, ST_BIG_UFO_DESTROYER);
u->u.disaster.big_ufo_destroyer_target = v->index; u->big_ufo_destroyer_target = v->index;
Vehicle *w = new DisasterVehicle(); DisasterVehicle *w = new DisasterVehicle();
u->SetNext(w); u->SetNext(w);
InitializeDisasterVehicle(w, -6 * TILE_SIZE, v->y_pos, 0, DIR_SW, ST_BIG_UFO_DESTROYER_SHADOW); InitializeDisasterVehicle(w, -6 * TILE_SIZE, v->y_pos, 0, DIR_SW, ST_BIG_UFO_DESTROYER_SHADOW);
@ -576,7 +576,7 @@ static bool DisasterTick_Big_Ufo(Vehicle *v)
* Skyranger destroying (Big) Ufo handling, v->current_order.dest states: * Skyranger destroying (Big) Ufo handling, v->current_order.dest states:
* 0: Home in on landed Ufo and shoot it down * 0: Home in on landed Ufo and shoot it down
*/ */
static bool DisasterTick_Big_Ufo_Destroyer(Vehicle *v) static bool DisasterTick_Big_Ufo_Destroyer(DisasterVehicle *v)
{ {
v->tick_counter++; v->tick_counter++;
@ -589,7 +589,7 @@ static bool DisasterTick_Big_Ufo_Destroyer(Vehicle *v)
} }
if (v->current_order.GetDestination() == 0) { if (v->current_order.GetDestination() == 0) {
Vehicle *u = Vehicle::Get(v->u.disaster.big_ufo_destroyer_target); Vehicle *u = Vehicle::Get(v->big_ufo_destroyer_target);
if (Delta(v->x_pos, u->x_pos) > TILE_SIZE) return true; if (Delta(v->x_pos, u->x_pos) > TILE_SIZE) return true;
v->current_order.SetDestination(1); v->current_order.SetDestination(1);
@ -622,7 +622,7 @@ static bool DisasterTick_Big_Ufo_Destroyer(Vehicle *v)
* Submarine, v->current_order.dest states: * Submarine, v->current_order.dest states:
* Unused, just float around aimlessly and pop up at different places, turning around * Unused, just float around aimlessly and pop up at different places, turning around
*/ */
static bool DisasterTick_Submarine(Vehicle *v) static bool DisasterTick_Submarine(DisasterVehicle *v)
{ {
v->tick_counter++; v->tick_counter++;
@ -649,12 +649,12 @@ static bool DisasterTick_Submarine(Vehicle *v)
} }
static bool DisasterTick_NULL(Vehicle *v) static bool DisasterTick_NULL(DisasterVehicle *v)
{ {
return true; return true;
} }
typedef bool DisasterVehicleTickProc(Vehicle *v); typedef bool DisasterVehicleTickProc(DisasterVehicle *v);
static DisasterVehicleTickProc * const _disastervehicle_tick_procs[] = { static DisasterVehicleTickProc * const _disastervehicle_tick_procs[] = {
DisasterTick_Zeppeliner, DisasterTick_NULL, DisasterTick_Zeppeliner, DisasterTick_NULL,
@ -693,11 +693,11 @@ static void Disaster_Zeppeliner_Init()
} }
} }
Vehicle *v = new DisasterVehicle(); DisasterVehicle *v = new DisasterVehicle();
InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_ZEPPELINER); InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_ZEPPELINER);
/* Allocate shadow */ /* Allocate shadow */
Vehicle *u = new DisasterVehicle(); DisasterVehicle *u = new DisasterVehicle();
v->SetNext(u); v->SetNext(u);
InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_ZEPPELINER_SHADOW); InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_ZEPPELINER_SHADOW);
u->vehstatus |= VS_SHADOW; u->vehstatus |= VS_SHADOW;
@ -710,7 +710,7 @@ static void Disaster_Small_Ufo_Init()
{ {
if (!Vehicle::CanAllocateItem(2)) return; if (!Vehicle::CanAllocateItem(2)) return;
Vehicle *v = new DisasterVehicle(); DisasterVehicle *v = new DisasterVehicle();
int x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2; int x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2;
InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_SMALL_UFO); InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_SMALL_UFO);
@ -718,7 +718,7 @@ static void Disaster_Small_Ufo_Init()
v->age = 0; v->age = 0;
/* Allocate shadow */ /* Allocate shadow */
Vehicle *u = new DisasterVehicle(); DisasterVehicle *u = new DisasterVehicle();
v->SetNext(u); v->SetNext(u);
InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_SMALL_UFO_SHADOW); InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_SMALL_UFO_SHADOW);
u->vehstatus |= VS_SHADOW; u->vehstatus |= VS_SHADOW;
@ -741,7 +741,7 @@ static void Disaster_Airplane_Init()
if (found == NULL) return; if (found == NULL) return;
Vehicle *v = new DisasterVehicle(); DisasterVehicle *v = new DisasterVehicle();
/* Start from the bottom (south side) of the map */ /* Start from the bottom (south side) of the map */
int x = (MapSizeX() + 9) * TILE_SIZE - 1; int x = (MapSizeX() + 9) * TILE_SIZE - 1;
@ -749,7 +749,7 @@ static void Disaster_Airplane_Init()
InitializeDisasterVehicle(v, x, y, 135, DIR_NE, ST_AIRPLANE); InitializeDisasterVehicle(v, x, y, 135, DIR_NE, ST_AIRPLANE);
Vehicle *u = new DisasterVehicle(); DisasterVehicle *u = new DisasterVehicle();
v->SetNext(u); v->SetNext(u);
InitializeDisasterVehicle(u, x, y, 0, DIR_SE, ST_AIRPLANE_SHADOW); InitializeDisasterVehicle(u, x, y, 0, DIR_SE, ST_AIRPLANE_SHADOW);
u->vehstatus |= VS_SHADOW; u->vehstatus |= VS_SHADOW;
@ -772,19 +772,19 @@ static void Disaster_Helicopter_Init()
if (found == NULL) return; if (found == NULL) return;
Vehicle *v = new DisasterVehicle(); DisasterVehicle *v = new DisasterVehicle();
int x = -16 * TILE_SIZE; int x = -16 * TILE_SIZE;
int y = TileY(found->xy) * TILE_SIZE + 37; int y = TileY(found->xy) * TILE_SIZE + 37;
InitializeDisasterVehicle(v, x, y, 135, DIR_SW, ST_HELICOPTER); InitializeDisasterVehicle(v, x, y, 135, DIR_SW, ST_HELICOPTER);
Vehicle *u = new DisasterVehicle(); DisasterVehicle *u = new DisasterVehicle();
v->SetNext(u); v->SetNext(u);
InitializeDisasterVehicle(u, x, y, 0, DIR_SW, ST_HELICOPTER_SHADOW); InitializeDisasterVehicle(u, x, y, 0, DIR_SW, ST_HELICOPTER_SHADOW);
u->vehstatus |= VS_SHADOW; u->vehstatus |= VS_SHADOW;
Vehicle *w = new DisasterVehicle(); DisasterVehicle *w = new DisasterVehicle();
u->SetNext(w); u->SetNext(w);
InitializeDisasterVehicle(w, x, y, 140, DIR_SW, ST_HELICOPTER_ROTORS); InitializeDisasterVehicle(w, x, y, 140, DIR_SW, ST_HELICOPTER_ROTORS);
} }
@ -796,7 +796,7 @@ static void Disaster_Big_Ufo_Init()
{ {
if (!Vehicle::CanAllocateItem(2)) return; if (!Vehicle::CanAllocateItem(2)) return;
Vehicle *v = new DisasterVehicle(); DisasterVehicle *v = new DisasterVehicle();
int x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2; int x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2;
int y = MapMaxX() * TILE_SIZE - 1; int y = MapMaxX() * TILE_SIZE - 1;
@ -805,7 +805,7 @@ static void Disaster_Big_Ufo_Init()
v->age = 0; v->age = 0;
/* Allocate shadow */ /* Allocate shadow */
Vehicle *u = new DisasterVehicle(); DisasterVehicle *u = new DisasterVehicle();
v->SetNext(u); v->SetNext(u);
InitializeDisasterVehicle(u, x, y, 0, DIR_NW, ST_BIG_UFO_SHADOW); InitializeDisasterVehicle(u, x, y, 0, DIR_NW, ST_BIG_UFO_SHADOW);
u->vehstatus |= VS_SHADOW; u->vehstatus |= VS_SHADOW;
@ -831,7 +831,7 @@ static void Disaster_Submarine_Init(DisasterSubType subtype)
} }
if (!IsWaterTile(TileVirtXY(x, y))) return; if (!IsWaterTile(TileVirtXY(x, y))) return;
Vehicle *v = new DisasterVehicle(); DisasterVehicle *v = new DisasterVehicle();
InitializeDisasterVehicle(v, x, y, 0, dir, subtype); InitializeDisasterVehicle(v, x, y, 0, dir, subtype);
v->age = 0; v->age = 0;
} }

@ -1131,8 +1131,8 @@ static const OldChunks vehicle_effect_chunk[] = {
}; };
static const OldChunks vehicle_disaster_chunk[] = { static const OldChunks vehicle_disaster_chunk[] = {
OCL_SVAR( OC_UINT16, VehicleDisaster, image_override ), OCL_SVAR( OC_UINT16, DisasterVehicle, image_override ),
OCL_SVAR( OC_UINT16, VehicleDisaster, big_ufo_destroyer_target ), OCL_SVAR( OC_UINT16, DisasterVehicle, big_ufo_destroyer_target ),
OCL_NULL( 6 ), ///< Junk OCL_NULL( 6 ), ///< Junk
@ -1161,7 +1161,7 @@ static bool LoadOldVehicleUnion(LoadgameState *ls, int num)
case VEH_SHIP : res = LoadChunk(ls, v, vehicle_ship_chunk); break; case VEH_SHIP : res = LoadChunk(ls, v, vehicle_ship_chunk); break;
case VEH_AIRCRAFT: res = LoadChunk(ls, &v->u.air, vehicle_air_chunk); break; case VEH_AIRCRAFT: res = LoadChunk(ls, &v->u.air, vehicle_air_chunk); break;
case VEH_EFFECT : res = LoadChunk(ls, v, vehicle_effect_chunk); break; case VEH_EFFECT : res = LoadChunk(ls, v, vehicle_effect_chunk); break;
case VEH_DISASTER: res = LoadChunk(ls, &v->u.disaster, vehicle_disaster_chunk); break; case VEH_DISASTER: res = LoadChunk(ls, v, vehicle_disaster_chunk); break;
} }
} }

@ -646,8 +646,8 @@ const SaveLoad *GetVehicleDescription(VehicleType vt)
SLE_CONDVAR(Vehicle, age, SLE_INT32, 31, SL_MAX_VERSION), SLE_CONDVAR(Vehicle, age, SLE_INT32, 31, SL_MAX_VERSION),
SLE_VAR(Vehicle, tick_counter, SLE_UINT8), SLE_VAR(Vehicle, tick_counter, SLE_UINT8),
SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, image_override), SLE_UINT16), SLE_VAR(DisasterVehicle, image_override, SLE_UINT16),
SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, big_ufo_destroyer_target), SLE_UINT16), SLE_VAR(DisasterVehicle, big_ufo_destroyer_target, SLE_UINT16),
/* reserve extra space in savegame here. (currently 16 bytes) */ /* reserve extra space in savegame here. (currently 16 bytes) */
SLE_CONDNULL(16, 2, SL_MAX_VERSION), SLE_CONDNULL(16, 2, SL_MAX_VERSION),

@ -175,11 +175,6 @@ struct VehicleRoad {
RoadTypes compatible_roadtypes; RoadTypes compatible_roadtypes;
}; };
struct VehicleDisaster {
uint16 image_override;
VehicleID big_ufo_destroyer_target;
};
typedef Pool<Vehicle, VehicleID, 512, 64000> VehiclePool; typedef Pool<Vehicle, VehicleID, 512, 64000> VehiclePool;
extern VehiclePool _vehicle_pool; extern VehiclePool _vehicle_pool;
@ -311,7 +306,6 @@ public:
VehicleRail rail; VehicleRail rail;
VehicleAir air; VehicleAir air;
VehicleRoad road; VehicleRoad road;
VehicleDisaster disaster;
} u; } u;
/* cached oftenly queried NewGRF values */ /* cached oftenly queried NewGRF values */
@ -621,6 +615,9 @@ public:
* As side-effect the vehicle type is set correctly. * As side-effect the vehicle type is set correctly.
*/ */
struct DisasterVehicle : public Vehicle { struct DisasterVehicle : public Vehicle {
uint16 image_override;
VehicleID big_ufo_destroyer_target;
/** Initializes the Vehicle to a disaster vehicle */ /** Initializes the Vehicle to a disaster vehicle */
DisasterVehicle() { this->type = VEH_DISASTER; } DisasterVehicle() { this->type = VEH_DISASTER; }
@ -630,6 +627,7 @@ struct DisasterVehicle : public Vehicle {
const char *GetTypeString() const { return "disaster vehicle"; } const char *GetTypeString() const { return "disaster vehicle"; }
void UpdateDeltaXY(Direction direction); void UpdateDeltaXY(Direction direction);
bool Tick(); bool Tick();
DisasterVehicle *Next() { return (DisasterVehicle*)this->Vehicle::Next(); }
}; };
#define FOR_ALL_VEHICLES_FROM(var, start) FOR_ALL_ITEMS_FROM(Vehicle, vehicle_index, var, start) #define FOR_ALL_VEHICLES_FROM(var, start) FOR_ALL_ITEMS_FROM(Vehicle, vehicle_index, var, start)

Loading…
Cancel
Save