summaryrefslogtreecommitdiff
path: root/src/effectvehicle.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/effectvehicle.cpp
parent561d97880d3c2be7d8160f67d18d3e3b85c284e6 (diff)
downloadopenttd-b687ac51ee5e8628ed56319df573c903c0c86ef3.tar.xz
(svn r16376) -Codechange: Vehicle::Tick() now returns false if the vehicle was deleted
Diffstat (limited to 'src/effectvehicle.cpp')
-rw-r--r--src/effectvehicle.cpp65
1 files changed, 45 insertions, 20 deletions
diff --git a/src/effectvehicle.cpp b/src/effectvehicle.cpp
index 1b168daec..767c31702 100644
--- a/src/effectvehicle.cpp
+++ b/src/effectvehicle.cpp
@@ -20,7 +20,7 @@ static void ChimneySmokeInit(Vehicle *v)
v->progress = GB(r, 16, 3);
}
-static void ChimneySmokeTick(Vehicle *v)
+static bool ChimneySmokeTick(Vehicle *v)
{
if (v->progress > 0) {
v->progress--;
@@ -28,7 +28,7 @@ static void ChimneySmokeTick(Vehicle *v)
TileIndex tile = TileVirtXY(v->x_pos, v->y_pos);
if (!IsTileType(tile, MP_INDUSTRY)) {
delete v;
- return;
+ return false;
}
if (v->cur_image != SPR_CHIMNEY_SMOKE_7) {
@@ -39,6 +39,8 @@ static void ChimneySmokeTick(Vehicle *v)
v->progress = 7;
VehicleMove(v, true);
}
+
+ return true;
}
static void SteamSmokeInit(Vehicle *v)
@@ -47,7 +49,7 @@ static void SteamSmokeInit(Vehicle *v)
v->progress = 12;
}
-static void SteamSmokeTick(Vehicle *v)
+static bool SteamSmokeTick(Vehicle *v)
{
bool moved = false;
@@ -63,12 +65,14 @@ static void SteamSmokeTick(Vehicle *v)
v->cur_image++;
} else {
delete v;
- return;
+ return false;
}
moved = true;
}
if (moved) VehicleMove(v, true);
+
+ return true;
}
static void DieselSmokeInit(Vehicle *v)
@@ -77,7 +81,7 @@ static void DieselSmokeInit(Vehicle *v)
v->progress = 0;
}
-static void DieselSmokeTick(Vehicle *v)
+static bool DieselSmokeTick(Vehicle *v)
{
v->progress++;
@@ -90,8 +94,11 @@ static void DieselSmokeTick(Vehicle *v)
VehicleMove(v, true);
} else {
delete v;
+ return false;
}
}
+
+ return true;
}
static void ElectricSparkInit(Vehicle *v)
@@ -100,7 +107,7 @@ static void ElectricSparkInit(Vehicle *v)
v->progress = 1;
}
-static void ElectricSparkTick(Vehicle *v)
+static bool ElectricSparkTick(Vehicle *v)
{
if (v->progress < 2) {
v->progress++;
@@ -111,8 +118,11 @@ static void ElectricSparkTick(Vehicle *v)
VehicleMove(v, true);
} else {
delete v;
+ return false;
}
}
+
+ return true;
}
static void SmokeInit(Vehicle *v)
@@ -121,7 +131,7 @@ static void SmokeInit(Vehicle *v)
v->progress = 12;
}
-static void SmokeTick(Vehicle *v)
+static bool SmokeTick(Vehicle *v)
{
bool moved = false;
@@ -137,12 +147,14 @@ static void SmokeTick(Vehicle *v)
v->cur_image++;
} else {
delete v;
- return;
+ return false;
}
moved = true;
}
if (moved) VehicleMove(v, true);
+
+ return true;
}
static void ExplosionLargeInit(Vehicle *v)
@@ -151,7 +163,7 @@ static void ExplosionLargeInit(Vehicle *v)
v->progress = 0;
}
-static void ExplosionLargeTick(Vehicle *v)
+static bool ExplosionLargeTick(Vehicle *v)
{
v->progress++;
if ((v->progress & 3) == 0) {
@@ -160,8 +172,11 @@ static void ExplosionLargeTick(Vehicle *v)
VehicleMove(v, true);
} else {
delete v;
+ return false;
}
}
+
+ return true;
}
static void BreakdownSmokeInit(Vehicle *v)
@@ -170,7 +185,7 @@ static void BreakdownSmokeInit(Vehicle *v)
v->progress = 0;
}
-static void BreakdownSmokeTick(Vehicle *v)
+static bool BreakdownSmokeTick(Vehicle *v)
{
v->progress++;
if ((v->progress & 7) == 0) {
@@ -185,7 +200,10 @@ static void BreakdownSmokeTick(Vehicle *v)
v->u.effect.animation_state--;
if (v->u.effect.animation_state == 0) {
delete v;
+ return false;
}
+
+ return true;
}
static void ExplosionSmallInit(Vehicle *v)
@@ -194,7 +212,7 @@ static void ExplosionSmallInit(Vehicle *v)
v->progress = 0;
}
-static void ExplosionSmallTick(Vehicle *v)
+static bool ExplosionSmallTick(Vehicle *v)
{
v->progress++;
if ((v->progress & 3) == 0) {
@@ -203,8 +221,11 @@ static void ExplosionSmallTick(Vehicle *v)
VehicleMove(v, true);
} else {
delete v;
+ return false;
}
}
+
+ return true;
}
static void BulldozerInit(Vehicle *v)
@@ -254,7 +275,7 @@ static const struct {
{ 0, -1 }
};
-static void BulldozerTick(Vehicle *v)
+static bool BulldozerTick(Vehicle *v)
{
v->progress++;
if ((v->progress & 7) == 0) {
@@ -271,11 +292,13 @@ static void BulldozerTick(Vehicle *v)
v->u.effect.animation_state++;
if (v->u.effect.animation_state == lengthof(_bulldozer_movement)) {
delete v;
- return;
+ return false;
}
}
VehicleMove(v, true);
}
+
+ return true;
}
static void BubbleInit(Vehicle *v)
@@ -435,18 +458,18 @@ static const BubbleMovement * const _bubble_movement[] = {
_bubble_absorb,
};
-static void BubbleTick(Vehicle *v)
+static bool BubbleTick(Vehicle *v)
{
uint anim_state;
v->progress++;
- if ((v->progress & 3) != 0) return;
+ if ((v->progress & 3) != 0) return true;
if (v->spritenum == 0) {
v->cur_image++;
if (v->cur_image < SPR_BUBBLE_GENERATE_3) {
VehicleMove(v, true);
- return;
+ return true;
}
if (v->u.effect.animation_substate != 0) {
v->spritenum = GB(Random(), 0, 2) + 1;
@@ -462,7 +485,7 @@ static void BubbleTick(Vehicle *v)
if (b->y == 4 && b->x == 0) {
delete v;
- return;
+ return false;
}
if (b->y == 4 && b->x == 1) {
@@ -492,11 +515,13 @@ static void BubbleTick(Vehicle *v)
v->cur_image = SPR_BUBBLE_0 + b->image;
VehicleMove(v, true);
+
+ return true;
}
typedef void EffectInitProc(Vehicle *v);
-typedef void EffectTickProc(Vehicle *v);
+typedef bool EffectTickProc(Vehicle *v);
static EffectInitProc * const _effect_init_procs[] = {
ChimneySmokeInit,
@@ -558,9 +583,9 @@ Vehicle *CreateEffectVehicleRel(const Vehicle *v, int x, int y, int z, EffectVeh
return CreateEffectVehicle(v->x_pos + x, v->y_pos + y, v->z_pos + z, type);
}
-void EffectVehicle::Tick()
+bool EffectVehicle::Tick()
{
- _effect_tick_procs[this->subtype](this);
+ return _effect_tick_procs[this->subtype](this);
}
void EffectVehicle::UpdateDeltaXY(Direction direction)