|
|
@ -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,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|