summaryrefslogtreecommitdiff
path: root/src/disaster_cmd.cpp
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2009-05-22 13:53:14 +0000
committersmatz <smatz@openttd.org>2009-05-22 13:53:14 +0000
commitb687ac51ee5e8628ed56319df573c903c0c86ef3 (patch)
tree26a2219b3bac39dd367deb2de9fcbac64570a93d /src/disaster_cmd.cpp
parent561d97880d3c2be7d8160f67d18d3e3b85c284e6 (diff)
downloadopenttd-b687ac51ee5e8628ed56319df573c903c0c86ef3.tar.xz
(svn r16376) -Codechange: Vehicle::Tick() now returns false if the vehicle was deleted
Diffstat (limited to 'src/disaster_cmd.cpp')
-rw-r--r--src/disaster_cmd.cpp102
1 files changed, 63 insertions, 39 deletions
diff --git a/src/disaster_cmd.cpp b/src/disaster_cmd.cpp
index d83f55fe3..e262ca288 100644
--- a/src/disaster_cmd.cpp
+++ b/src/disaster_cmd.cpp
@@ -180,12 +180,12 @@ static void SetDisasterVehiclePos(Vehicle *v, int x, int y, byte z)
* 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
*/
-static void DisasterTick_Zeppeliner(Vehicle *v)
+static bool DisasterTick_Zeppeliner(Vehicle *v)
{
v->tick_counter++;
if (v->current_order.GetDestination() < 2) {
- if (HasBit(v->tick_counter, 0)) return;
+ if (HasBit(v->tick_counter, 0)) return true;
GetNewVehiclePosResult gp = GetNewVehiclePos(v);
@@ -215,12 +215,16 @@ static void DisasterTick_Zeppeliner(Vehicle *v)
}
}
- if (v->y_pos >= ((int)MapSizeY() + 9) * TILE_SIZE - 1) delete v;
- return;
+ if (v->y_pos >= ((int)MapSizeY() + 9) * TILE_SIZE - 1) {
+ delete v;
+ return false;
+ }
+
+ return true;
}
if (v->current_order.GetDestination() > 2) {
- if (++v->age <= 13320) return;
+ if (++v->age <= 13320) return true;
if (IsValidTile(v->tile) &&
IsTileType(v->tile, MP_STATION) &&
@@ -232,7 +236,7 @@ static void DisasterTick_Zeppeliner(Vehicle *v)
SetDisasterVehiclePos(v, v->x_pos, v->y_pos, v->z_pos);
delete v;
- return;
+ return false;
}
int x = v->x_pos;
@@ -267,6 +271,8 @@ static void DisasterTick_Zeppeliner(Vehicle *v)
IsAirport(v->tile)) {
SETBITS(GetStationByTile(v->tile)->airport_flags, RUNWAY_IN_block);
}
+
+ return true;
}
/**
@@ -275,7 +281,7 @@ static void DisasterTick_Zeppeliner(Vehicle *v)
* 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
*/
-static void DisasterTick_Ufo(Vehicle *v)
+static bool DisasterTick_Ufo(Vehicle *v)
{
v->u.disaster.image_override = (HasBit(++v->tick_counter, 3)) ? SPR_UFO_SMALL_SCOUT_DARKER : SPR_UFO_SMALL_SCOUT;
@@ -287,11 +293,11 @@ static void DisasterTick_Ufo(Vehicle *v)
v->direction = GetDirectionTowards(v, x, y);
GetNewVehiclePosResult gp = GetNewVehiclePos(v);
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
- return;
+ return true;
}
if (++v->age < 6) {
v->dest_tile = RandomTile();
- return;
+ return true;
}
v->current_order.SetDestination(1);
@@ -300,17 +306,18 @@ static void DisasterTick_Ufo(Vehicle *v)
if (u->type == VEH_ROAD && IsRoadVehFront(u)) {
v->dest_tile = u->index;
v->age = 0;
- return;
+ return true;
}
}
delete v;
+ return false;
} else {
/* Target a vehicle */
Vehicle *u = Vehicle::Get(v->dest_tile);
if (u->type != VEH_ROAD || !IsRoadVehFront(u)) {
delete v;
- return;
+ return false;
}
uint dist = Delta(v->x_pos, u->x_pos) + Delta(v->y_pos, u->y_pos);
@@ -351,8 +358,11 @@ static void DisasterTick_Ufo(Vehicle *v)
CreateEffectVehicleRel(v, 0, 7, 8, EV_EXPLOSION_LARGE);
SndPlayVehicleFx(SND_12_EXPLOSION, v);
delete v;
+ return false;
}
}
+
+ return true;
}
static void DestructIndustry(Industry *i)
@@ -378,7 +388,7 @@ static void DestructIndustry(Industry *i)
* @param news_message The string that's used as news message.
* @param industry_flag Only attack industries that have this flag set.
*/
-static void DisasterTick_Aircraft(Vehicle *v, uint16 image_override, bool leave_at_top, StringID news_message, IndustryBehaviour industry_flag)
+static bool DisasterTick_Aircraft(Vehicle *v, uint16 image_override, bool leave_at_top, StringID news_message, IndustryBehaviour industry_flag)
{
v->tick_counter++;
v->u.disaster.image_override = (v->current_order.GetDestination() == 1 && HasBit(v->tick_counter, 2)) ? image_override : 0;
@@ -388,7 +398,7 @@ static void DisasterTick_Aircraft(Vehicle *v, uint16 image_override, bool leave_
if ((leave_at_top && gp.x < (-10 * TILE_SIZE)) || (!leave_at_top && gp.x > (int)MapSizeX() * TILE_SIZE + 9 * TILE_SIZE - 1)) {
delete v;
- return;
+ return false;
}
if (v->current_order.GetDestination() == 2) {
@@ -422,10 +432,10 @@ static void DisasterTick_Aircraft(Vehicle *v, uint16 image_override, bool leave_
int x = v->x_pos - (15 * TILE_SIZE);
int y = v->y_pos;
- if ((uint)x > MapMaxX() * TILE_SIZE - 1) return;
+ if ((uint)x > MapMaxX() * TILE_SIZE - 1) return true;
TileIndex tile = TileVirtXY(x, y);
- if (!IsTileType(tile, MP_INDUSTRY)) return;
+ if (!IsTileType(tile, MP_INDUSTRY)) return true;
IndustryID ind = GetIndustryIndex(tile);
v->dest_tile = ind;
@@ -435,29 +445,33 @@ static void DisasterTick_Aircraft(Vehicle *v, uint16 image_override, bool leave_
v->age = 0;
}
}
+
+ return true;
}
/** Airplane handling. */
-static void DisasterTick_Airplane(Vehicle *v)
+static bool DisasterTick_Airplane(Vehicle *v)
{
- 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. */
-static void DisasterTick_Helicopter(Vehicle *v)
+static bool DisasterTick_Helicopter(Vehicle *v)
{
- 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 */
-static void DisasterTick_Helicopter_Rotors(Vehicle *v)
+static bool DisasterTick_Helicopter_Rotors(Vehicle *v)
{
v->tick_counter++;
- if (HasBit(v->tick_counter, 0)) return;
+ if (HasBit(v->tick_counter, 0)) return true;
if (++v->cur_image > SPR_ROTOR_MOVING_3) v->cur_image = SPR_ROTOR_MOVING_1;
VehicleMove(v, true);
+
+ return true;
}
/**
@@ -466,7 +480,7 @@ static void DisasterTick_Helicopter_Rotors(Vehicle *v)
* 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
*/
-static void DisasterTick_Big_Ufo(Vehicle *v)
+static bool DisasterTick_Big_Ufo(Vehicle *v)
{
v->tick_counter++;
@@ -478,19 +492,19 @@ static void DisasterTick_Big_Ufo(Vehicle *v)
GetNewVehiclePosResult gp = GetNewVehiclePos(v);
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
- return;
+ return true;
}
if (!IsValidTile(v->dest_tile)) {
/* Make sure we don't land outside the map. */
delete v;
- return;
+ return false;
}
byte z = GetSlopeZ(v->x_pos, v->y_pos);
if (z < v->z_pos) {
SetDisasterVehiclePos(v, v->x_pos, v->y_pos, v->z_pos - 1);
- return;
+ return true;
}
v->current_order.SetDestination(2);
@@ -514,7 +528,7 @@ static void DisasterTick_Big_Ufo(Vehicle *v)
if (!Vehicle::CanAllocateItem(2)) {
delete v;
- return;
+ return false;
}
u = new DisasterVehicle();
@@ -533,12 +547,12 @@ static void DisasterTick_Big_Ufo(Vehicle *v)
v->direction = GetDirectionTowards(v, x, y);
GetNewVehiclePosResult gp = GetNewVehiclePos(v);
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
- return;
+ return true;
}
if (++v->age < 6) {
v->dest_tile = RandomTile();
- return;
+ return true;
}
v->current_order.SetDestination(1);
@@ -554,13 +568,15 @@ static void DisasterTick_Big_Ufo(Vehicle *v)
v->dest_tile = tile;
v->age = 0;
}
+
+ return true;
}
/**
* Skyranger destroying (Big) Ufo handling, v->current_order.dest states:
* 0: Home in on landed Ufo and shoot it down
*/
-static void DisasterTick_Big_Ufo_Destroyer(Vehicle *v)
+static bool DisasterTick_Big_Ufo_Destroyer(Vehicle *v)
{
v->tick_counter++;
@@ -569,12 +585,12 @@ static void DisasterTick_Big_Ufo_Destroyer(Vehicle *v)
if (gp.x > (int)MapSizeX() * TILE_SIZE + 9 * TILE_SIZE - 1) {
delete v;
- return;
+ return false;
}
if (v->current_order.GetDestination() == 0) {
Vehicle *u = Vehicle::Get(v->u.disaster.big_ufo_destroyer_target);
- if (Delta(v->x_pos, u->x_pos) > TILE_SIZE) return;
+ if (Delta(v->x_pos, u->x_pos) > TILE_SIZE) return true;
v->current_order.SetDestination(1);
CreateEffectVehicleRel(u, 0, 7, 8, EV_EXPLOSION_LARGE);
@@ -598,22 +614,24 @@ static void DisasterTick_Big_Ufo_Destroyer(Vehicle *v)
}
}
}
+
+ return true;
}
/**
* Submarine, v->current_order.dest states:
* Unused, just float around aimlessly and pop up at different places, turning around
*/
-static void DisasterTick_Submarine(Vehicle *v)
+static bool DisasterTick_Submarine(Vehicle *v)
{
v->tick_counter++;
if (++v->age > 8880) {
delete v;
- return;
+ return false;
}
- if (!HasBit(v->tick_counter, 0)) return;
+ if (!HasBit(v->tick_counter, 0)) return true;
TileIndex tile = v->tile + TileOffsByDiagDir(DirToDiagDir(v->direction));
if (IsValidTile(tile)) {
@@ -621,16 +639,22 @@ static void DisasterTick_Submarine(Vehicle *v)
if (trackbits == TRACK_BIT_ALL && !Chance16(1, 90)) {
GetNewVehiclePosResult gp = GetNewVehiclePos(v);
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
- return;
+ return true;
}
}
v->direction = ChangeDir(v->direction, GB(Random(), 0, 1) ? DIRDIFF_90RIGHT : DIRDIFF_90LEFT);
+
+ return true;
}
-static void DisasterTick_NULL(Vehicle *v) {}
-typedef void DisasterVehicleTickProc(Vehicle *v);
+static bool DisasterTick_NULL(Vehicle *v)
+{
+ return true;
+}
+
+typedef bool DisasterVehicleTickProc(Vehicle *v);
static DisasterVehicleTickProc * const _disastervehicle_tick_procs[] = {
DisasterTick_Zeppeliner, DisasterTick_NULL,
@@ -644,9 +668,9 @@ static DisasterVehicleTickProc * const _disastervehicle_tick_procs[] = {
};
-void DisasterVehicle::Tick()
+bool DisasterVehicle::Tick()
{
- _disastervehicle_tick_procs[this->subtype](this);
+ return _disastervehicle_tick_procs[this->subtype](this);
}
typedef void DisasterInitProc();