(svn r1875) Effect vehicle overhaul: enumerate sprites, descriptive names for functions and miscellaneous improvements

pull/155/head
tron 20 years ago
parent 1e2f9ba5a5
commit 391cd5658f

@ -733,6 +733,92 @@ enum Sprites {
SPR_BULLDOZER_SW = 1418, SPR_BULLDOZER_SW = 1418,
SPR_BULLDOZER_NW = 1419, SPR_BULLDOZER_NW = 1419,
SPR_SMOKE_0 = 2040,
SPR_SMOKE_1 = 2041,
SPR_SMOKE_2 = 2042,
SPR_SMOKE_3 = 2043,
SPR_SMOKE_4 = 2044,
SPR_DIESEL_SMOKE_0 = 3073,
SPR_DIESEL_SMOKE_1 = 3074,
SPR_DIESEL_SMOKE_2 = 3075,
SPR_DIESEL_SMOKE_3 = 3076,
SPR_DIESEL_SMOKE_4 = 3077,
SPR_DIESEL_SMOKE_5 = 3078,
SPR_STEAM_SMOKE_0 = 3079,
SPR_STEAM_SMOKE_1 = 3080,
SPR_STEAM_SMOKE_2 = 3081,
SPR_STEAM_SMOKE_3 = 3082,
SPR_STEAM_SMOKE_4 = 3083,
SPR_ELECTRIC_SPARK_0 = 3084,
SPR_ELECTRIC_SPARK_1 = 3085,
SPR_ELECTRIC_SPARK_2 = 3086,
SPR_ELECTRIC_SPARK_3 = 3087,
SPR_ELECTRIC_SPARK_4 = 3088,
SPR_ELECTRIC_SPARK_5 = 3089,
SPR_CHIMNEY_SMOKE_0 = 3701,
SPR_CHIMNEY_SMOKE_1 = 3702,
SPR_CHIMNEY_SMOKE_2 = 3703,
SPR_CHIMNEY_SMOKE_3 = 3704,
SPR_CHIMNEY_SMOKE_4 = 3705,
SPR_CHIMNEY_SMOKE_5 = 3706,
SPR_CHIMNEY_SMOKE_6 = 3707,
SPR_CHIMNEY_SMOKE_7 = 3708,
SPR_EXPLOSION_LARGE_0 = 3709,
SPR_EXPLOSION_LARGE_1 = 3710,
SPR_EXPLOSION_LARGE_2 = 3711,
SPR_EXPLOSION_LARGE_3 = 3712,
SPR_EXPLOSION_LARGE_4 = 3713,
SPR_EXPLOSION_LARGE_5 = 3714,
SPR_EXPLOSION_LARGE_6 = 3715,
SPR_EXPLOSION_LARGE_7 = 3716,
SPR_EXPLOSION_LARGE_8 = 3717,
SPR_EXPLOSION_LARGE_9 = 3718,
SPR_EXPLOSION_LARGE_A = 3719,
SPR_EXPLOSION_LARGE_B = 3720,
SPR_EXPLOSION_LARGE_C = 3721,
SPR_EXPLOSION_LARGE_D = 3722,
SPR_EXPLOSION_LARGE_E = 3723,
SPR_EXPLOSION_LARGE_F = 3724,
SPR_EXPLOSION_SMALL_0 = 3725,
SPR_EXPLOSION_SMALL_1 = 3726,
SPR_EXPLOSION_SMALL_2 = 3727,
SPR_EXPLOSION_SMALL_3 = 3728,
SPR_EXPLOSION_SMALL_4 = 3729,
SPR_EXPLOSION_SMALL_5 = 3730,
SPR_EXPLOSION_SMALL_6 = 3731,
SPR_EXPLOSION_SMALL_7 = 3732,
SPR_EXPLOSION_SMALL_8 = 3733,
SPR_EXPLOSION_SMALL_9 = 3734,
SPR_EXPLOSION_SMALL_A = 3735,
SPR_EXPLOSION_SMALL_B = 3736,
SPR_BREAKDOWN_SMOKE_0 = 3737,
SPR_BREAKDOWN_SMOKE_1 = 3738,
SPR_BREAKDOWN_SMOKE_2 = 3739,
SPR_BREAKDOWN_SMOKE_3 = 3740,
SPR_BUBBLE_0 = 4748,
SPR_BUBBLE_1 = 4749,
SPR_BUBBLE_2 = 4750,
SPR_BUBBLE_GENERATE_0 = 4751,
SPR_BUBBLE_GENERATE_1 = 4752,
SPR_BUBBLE_GENERATE_2 = 4753,
SPR_BUBBLE_GENERATE_3 = 4754,
SPR_BUBBLE_BURST_0 = 4755,
SPR_BUBBLE_BURST_1 = 4756,
SPR_BUBBLE_BURST_2 = 4757,
SPR_BUBBLE_ABSORB_0 = 4758,
SPR_BUBBLE_ABSORB_1 = 4759,
SPR_BUBBLE_ABSORB_2 = 4760,
SPR_BUBBLE_ABSORB_3 = 4761,
SPR_BUBBLE_ABSORB_4 = 4762,
/* road_gui.c */ /* road_gui.c */
SPR_IMG_ROAD_NW = 1309, SPR_IMG_ROAD_NW = 1309,
SPR_IMG_ROAD_NE = 1310, SPR_IMG_ROAD_NE = 1310,

@ -572,19 +572,20 @@ void ViewportAddVehicles(DrawPixelInfo *dpi)
} }
} }
static void EffectInit_0(Vehicle *v) static void ChimneySmokeInit(Vehicle *v)
{ {
uint32 r = Random(); uint32 r = Random();
v->cur_image = (uint16)((r & 7) + 3701); v->cur_image = SPR_CHIMNEY_SMOKE_0 + (r & 7);
v->progress = (byte)((r >> 16)&7); v->progress = (r >> 16) & 7;
} }
static void EffectTick_0(Vehicle *v) static void ChimneySmokeTick(Vehicle *v)
{ {
uint tile; if (v->progress > 0) {
uint img; v->progress--;
} else {
TileIndex tile;
if (--v->progress & 0x80) {
BeginVehicleMove(v); BeginVehicleMove(v);
tile = TILE_FROM_XY(v->x_pos, v->y_pos); tile = TILE_FROM_XY(v->x_pos, v->y_pos);
@ -594,36 +595,40 @@ static void EffectTick_0(Vehicle *v)
return; return;
} }
img = v->cur_image + 1; if (v->cur_image != SPR_CHIMNEY_SMOKE_7) {
if (img > 3708) img = 3701; v->cur_image++;
v->cur_image = img; } else {
v->cur_image = SPR_CHIMNEY_SMOKE_0;
}
v->progress = 7; v->progress = 7;
VehiclePositionChanged(v); VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
} }
} }
static void EffectInit_1(Vehicle *v) static void SteamSmokeInit(Vehicle *v)
{ {
v->cur_image = 3079; v->cur_image = SPR_STEAM_SMOKE_0;
v->progress = 12; v->progress = 12;
} }
static void EffectTick_1(Vehicle *v) static void SteamSmokeTick(Vehicle *v)
{ {
bool moved; bool moved = false;
BeginVehicleMove(v); BeginVehicleMove(v);
moved = false; v->progress++;
if ((++v->progress & 7) == 0) { if ((v->progress & 7) == 0) {
v->z_pos++; v->z_pos++;
moved = true; moved = true;
} }
if ((v->progress & 0xF)==4) { if ((v->progress & 0xF) == 4) {
if (++v->cur_image > 3083) { if (v->cur_image != SPR_STEAM_SMOKE_4) {
v->cur_image++;
} else {
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v); DeleteVehicle(v);
return; return;
@ -637,73 +642,81 @@ static void EffectTick_1(Vehicle *v)
} }
} }
static void EffectInit_2(Vehicle *v) static void DieselSmokeInit(Vehicle *v)
{ {
v->cur_image = 3073; v->cur_image = SPR_DIESEL_SMOKE_0;
v->progress = 0; v->progress = 0;
} }
static void EffectTick_2(Vehicle *v) static void DieselSmokeTick(Vehicle *v)
{ {
if ((++v->progress & 3) == 0) { v->progress++;
if ((v->progress & 3) == 0) {
BeginVehicleMove(v); BeginVehicleMove(v);
v->z_pos++; v->z_pos++;
VehiclePositionChanged(v); VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
} else if ((v->progress & 7) == 1) { } else if ((v->progress & 7) == 1) {
BeginVehicleMove(v); BeginVehicleMove(v);
if (++v->cur_image > 3078) { if (v->cur_image != SPR_DIESEL_SMOKE_5) {
v->cur_image++;
VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v);
} else { } else {
VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v);
} }
} }
} }
static void EffectInit_3(Vehicle *v) static void ElectricSparkInit(Vehicle *v)
{ {
v->cur_image = 3084; v->cur_image = SPR_ELECTRIC_SPARK_0;
v->progress = 1; v->progress = 1;
} }
static void EffectTick_3(Vehicle *v) static void ElectricSparkTick(Vehicle *v)
{ {
if (++v->progress > 2) { if (v->progress < 2) {
v->progress++;
} else {
v->progress = 0; v->progress = 0;
BeginVehicleMove(v); BeginVehicleMove(v);
if (++v->cur_image > 3089) { if (v->cur_image != SPR_ELECTRIC_SPARK_5) {
v->cur_image++;
VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v);
} else { } else {
VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v);
} }
} }
} }
static void EffectInit_4(Vehicle *v) static void SmokeInit(Vehicle *v)
{ {
v->cur_image = 2040; v->cur_image = SPR_SMOKE_0;
v->progress = 12; v->progress = 12;
} }
static void EffectTick_4(Vehicle *v) static void SmokeTick(Vehicle *v)
{ {
bool moved; bool moved = false;
BeginVehicleMove(v); BeginVehicleMove(v);
moved = false; v->progress++;
if ((++v->progress & 3) == 0) { if ((v->progress & 3) == 0) {
v->z_pos++; v->z_pos++;
moved = true; moved = true;
} }
if ((v->progress & 0xF)==4) { if ((v->progress & 0xF) == 4) {
if (++v->cur_image > 2044) { if (v->cur_image != SPR_SMOKE_4) {
v->cur_image++;
} else {
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v); DeleteVehicle(v);
return; return;
@ -717,64 +730,74 @@ static void EffectTick_4(Vehicle *v)
} }
} }
static void EffectInit_5(Vehicle *v) static void ExplosionLargeInit(Vehicle *v)
{ {
v->cur_image = 3709; v->cur_image = SPR_EXPLOSION_LARGE_0;
v->progress = 0; v->progress = 0;
} }
static void EffectTick_5(Vehicle *v) static void ExplosionLargeTick(Vehicle *v)
{ {
if (!(++v->progress & 3)) { v->progress++;
if ((v->progress & 3) == 0) {
BeginVehicleMove(v); BeginVehicleMove(v);
if (++v->cur_image > 3724) { if (v->cur_image != SPR_EXPLOSION_LARGE_F) {
v->cur_image++;
VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v);
} else { } else {
VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v);
} }
} }
} }
static void EffectInit_6(Vehicle *v) static void BreakdownSmokeInit(Vehicle *v)
{ {
v->cur_image = 3737; v->cur_image = SPR_BREAKDOWN_SMOKE_0;
v->progress = 0; v->progress = 0;
} }
static void EffectTick_6(Vehicle *v) static void BreakdownSmokeTick(Vehicle *v)
{ {
if (!(++v->progress & 7)) { v->progress++;
if ((v->progress & 7) == 0) {
BeginVehicleMove(v); BeginVehicleMove(v);
if (++v->cur_image > 3740) v->cur_image = 3737; if (v->cur_image != SPR_BREAKDOWN_SMOKE_3) {
v->cur_image++;
} else {
v->cur_image = SPR_BREAKDOWN_SMOKE_0;
}
VehiclePositionChanged(v); VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
} }
if (!--v->u.special.unk0) { v->u.special.unk0--;
if (v->u.special.unk0 == 0) {
BeginVehicleMove(v); BeginVehicleMove(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v); DeleteVehicle(v);
} }
} }
static void EffectInit_7(Vehicle *v) static void ExplosionSmallInit(Vehicle *v)
{ {
v->cur_image = 3725; v->cur_image = SPR_EXPLOSION_SMALL_0;
v->progress = 0; v->progress = 0;
} }
static void EffectTick_7(Vehicle *v) static void ExplosionSmallTick(Vehicle *v)
{ {
if (!(++v->progress & 3)) { v->progress++;
if ((v->progress & 3) == 0) {
BeginVehicleMove(v); BeginVehicleMove(v);
if (++v->cur_image > 3736) { if (v->cur_image != SPR_EXPLOSION_SMALL_B) {
v->cur_image++;
VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v);
} else { } else {
VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v);
} }
} }
} }
@ -828,7 +851,8 @@ static const struct {
static void BulldozerTick(Vehicle *v) static void BulldozerTick(Vehicle *v)
{ {
if ((++v->progress & 7) == 0) { v->progress++;
if ((v->progress & 7) == 0) {
const BulldozerMovement* b = &_bulldozer_movement[v->u.special.unk0]; const BulldozerMovement* b = &_bulldozer_movement[v->u.special.unk0];
BeginVehicleMove(v); BeginVehicleMove(v);
@ -853,60 +877,65 @@ static void BulldozerTick(Vehicle *v)
} }
} }
static void EffectInit_9(Vehicle *v) static void BubbleInit(Vehicle *v)
{ {
v->cur_image = 4751; v->cur_image = SPR_BUBBLE_GENERATE_0;
v->spritenum = 0; v->spritenum = 0;
v->progress = 0; v->progress = 0;
} }
#define MK(x,y,z,i) (x+4)+(y+4)*16,(z+4)+i*16 typedef struct BubbleMovement {
int8 x:4;
int8 y:4;
int8 z:4;
byte image:4;
} BubbleMovement;
#define MK(x, y, z, i) { x, y, z, i }
#define ME(i) { i, 4, 0, 0 }
/* -1,0,1,2 = 2*/ static const BubbleMovement _bubble_float_sw[] = {
/* -1,0,1 = 2*/
/* */
static const byte _effecttick9_data1[] = {
MK(0,0,1,0), MK(0,0,1,0),
MK(1,0,1,1), MK(1,0,1,1),
MK(0,0,1,0), MK(0,0,1,0),
MK(1,0,1,2), MK(1,0,1,2),
0x81, ME(1)
}; };
static const byte _effecttick9_data2[] = { static const BubbleMovement _bubble_float_ne[] = {
MK(0,0,1,0), MK(0,0,1,0),
MK(-1,0,1,1), MK(-1,0,1,1),
MK(0,0,1,0), MK(0,0,1,0),
MK(-1,0,1,2), MK(-1,0,1,2),
0x81, ME(1)
}; };
static const byte _effecttick9_data3[] = { static const BubbleMovement _bubble_float_se[] = {
MK(0,0,1,0), MK(0,0,1,0),
MK(0,1,1,1), MK(0,1,1,1),
MK(0,0,1,0), MK(0,0,1,0),
MK(0,1,1,2), MK(0,1,1,2),
0x81, ME(1)
}; };
static const byte _effecttick9_data4[] = { static const BubbleMovement _bubble_float_nw[] = {
MK(0,0,1,0), MK(0,0,1,0),
MK(0,-1,1,1), MK(0,-1,1,1),
MK(0,0,1,0), MK(0,0,1,0),
MK(0,-1,1,2), MK(0,-1,1,2),
0x81, ME(1)
}; };
static const byte _effecttick9_data5[] = { static const BubbleMovement _bubble_burst[] = {
MK(0,0,1,2), MK(0,0,1,2),
MK(0,0,1,7), MK(0,0,1,7),
MK(0,0,1,8), MK(0,0,1,8),
MK(0,0,1,9), MK(0,0,1,9),
0x80, ME(0)
}; };
static const byte _effecttick9_data6[] = { static const BubbleMovement _bubble_absorb[] = {
MK(0,0,1,0), MK(0,0,1,0),
MK(0,0,1,1), MK(0,0,1,1),
MK(0,0,1,0), MK(0,0,1,0),
@ -985,26 +1014,27 @@ static const byte _effecttick9_data6[] = {
MK(1,0,1,1), MK(1,0,1,1),
MK(0,0,1,0), MK(0,0,1,0),
MK(1,0,1,2), MK(1,0,1,2),
0x82,0, ME(2),
MK(0,0,0,0xA), MK(0,0,0,0xA),
MK(0,0,0,0xB), MK(0,0,0,0xB),
MK(0,0,0,0xC), MK(0,0,0,0xC),
MK(0,0,0,0xD), MK(0,0,0,0xD),
MK(0,0,0,0xE), MK(0,0,0,0xE),
0x80 ME(0)
}; };
#undef ME
#undef MK #undef MK
static const byte * const _effecttick9_data[6] = { static const BubbleMovement * const _bubble_movement[] = {
_effecttick9_data1, _bubble_float_sw,
_effecttick9_data2, _bubble_float_ne,
_effecttick9_data3, _bubble_float_se,
_effecttick9_data4, _bubble_float_nw,
_effecttick9_data5, _bubble_burst,
_effecttick9_data6, _bubble_absorb,
}; };
static void EffectTick_9(Vehicle *v) static void BubbleTick(Vehicle *v)
{ {
/* /*
* Warning: those effects can NOT use Random(), and have to use * Warning: those effects can NOT use Random(), and have to use
@ -1012,67 +1042,68 @@ static void EffectTick_9(Vehicle *v)
* spritenum to the savegame, and so it will cause desyncs in * spritenum to the savegame, and so it will cause desyncs in
* multiplayer!! (that is: in ToyLand) * multiplayer!! (that is: in ToyLand)
*/ */
int et; uint et;
const byte *b; const BubbleMovement *b;
if (((++v->progress)&3) != 0) v->progress++;
if ((v->progress & 3) != 0)
return; return;
BeginVehicleMove(v); BeginVehicleMove(v);
et = v->engine_type + 1;
if (v->spritenum == 0) { if (v->spritenum == 0) {
if (++v->cur_image < 4754) { v->cur_image++;
if (v->cur_image < SPR_BUBBLE_GENERATE_3) {
VehiclePositionChanged(v); VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
return; return;
} }
if (v->u.special.unk2 != 0) { if (v->u.special.unk2 != 0) {
v->spritenum = (byte)((InteractiveRandom()&3)+1); v->spritenum = (InteractiveRandom() & 3) + 1;
} else { } else {
v->spritenum = 6; v->spritenum = 6;
} }
et = 0; et = 0;
} else {
et = v->engine_type + 1;
} }
again: b = &_bubble_movement[v->spritenum - 1][et];
v->engine_type = et;
b = &_effecttick9_data[v->spritenum - 1][et*2];
if (*b == 0x80) { if (b->y == 4 && b->x == 0) {
EndVehicleMove(v); EndVehicleMove(v);
DeleteVehicle(v); DeleteVehicle(v);
return; return;
} }
if (*b == 0x81) { if (b->y == 4 && b->x == 1) {
if (v->z_pos > 180 || CHANCE16I(1,96, InteractiveRandom())) { if (v->z_pos > 180 || CHANCE16I(1, 96, InteractiveRandom())) {
v->spritenum = 5; v->spritenum = 5;
SndPlayVehicleFx(SND_2F_POP, v); SndPlayVehicleFx(SND_2F_POP, v);
} }
et = 0; et = 0;
goto again;
} }
if (*b == 0x82) { if (b->y == 4 && b->x == 2) {
uint tile; TileIndex tile;
et++; et++;
SndPlayVehicleFx(SND_31_EXTRACT, v); SndPlayVehicleFx(SND_31_EXTRACT, v);
tile = TILE_FROM_XY(v->x_pos, v->y_pos); tile = TILE_FROM_XY(v->x_pos, v->y_pos);
if (IsTileType(tile, MP_INDUSTRY) && if (IsTileType(tile, MP_INDUSTRY) &&
_map5[tile]==0xA2) { _map5[tile] == 0xA2) {
AddAnimatedTile(tile); AddAnimatedTile(tile);
} }
goto again;
} }
v->x_pos += (b[0]&0xF) - 4; v->engine_type = et;
v->y_pos += (b[0]>>4) - 4; b = &_bubble_movement[v->spritenum - 1][et];
v->z_pos += (b[1]&0xF) - 4;
v->cur_image = 4748 + (b[1] >> 4); v->x_pos += b->x;
v->y_pos += b->y;
v->z_pos += b->z;
v->cur_image = SPR_BUBBLE_0 + b->image;
VehiclePositionChanged(v); VehiclePositionChanged(v);
EndVehicleMove(v); EndVehicleMove(v);
@ -1083,29 +1114,29 @@ typedef void EffectInitProc(Vehicle *v);
typedef void EffectTickProc(Vehicle *v); typedef void EffectTickProc(Vehicle *v);
static EffectInitProc * const _effect_init_procs[] = { static EffectInitProc * const _effect_init_procs[] = {
EffectInit_0, ChimneySmokeInit,
EffectInit_1, SteamSmokeInit,
EffectInit_2, DieselSmokeInit,
EffectInit_3, ElectricSparkInit,
EffectInit_4, SmokeInit,
EffectInit_5, ExplosionLargeInit,
EffectInit_6, BreakdownSmokeInit,
EffectInit_7, ExplosionSmallInit,
BulldozerInit, BulldozerInit,
EffectInit_9, BubbleInit,
}; };
static EffectTickProc * const _effect_tick_procs[] = { static EffectTickProc * const _effect_tick_procs[] = {
EffectTick_0, ChimneySmokeTick,
EffectTick_1, SteamSmokeTick,
EffectTick_2, DieselSmokeTick,
EffectTick_3, ElectricSparkTick,
EffectTick_4, SmokeTick,
EffectTick_5, ExplosionLargeTick,
EffectTick_6, BreakdownSmokeTick,
EffectTick_7, ExplosionSmallTick,
BulldozerTick, BulldozerTick,
EffectTick_9, BubbleTick,
}; };

Loading…
Cancel
Save