1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-19 13:03:11 +01:00

Implement vehicle crash on water. Fix small particle issues

Requires a change in rand() implementation.
This commit is contained in:
duncanspumpkin
2015-11-20 19:23:25 +00:00
parent 1df0359859
commit ec5121b3f6
2 changed files with 62 additions and 8 deletions

View File

@@ -1641,6 +1641,58 @@ static void vehicle_crash_on_land(rct_vehicle* vehicle) {
vehicle->var_4E = 0;
}
static void vehicle_crash_on_water(rct_vehicle* vehicle) {
vehicle->status = VEHICLE_STATUS_CRASHED;
vehicle_invalidate_window(vehicle);
rct_ride* ride = GET_RIDE(vehicle->ride);
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED)) {
rct_vehicle* frontVehicle = vehicle;
while (frontVehicle->is_child != 0)frontVehicle = GET_VEHICLE(frontVehicle->prev_vehicle_on_ride);
uint8 trainIndex = 0;
while (ride->vehicles[trainIndex] != frontVehicle->sprite_index)
trainIndex++;
ride_crash(vehicle->ride, trainIndex);
if (ride->status != RIDE_STATUS_CLOSED) {
ride_set_status(vehicle->ride, RIDE_STATUS_CLOSED);
}
}
ride->lifecycle_flags |= RIDE_LIFECYCLE_CRASHED;
ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST;
if (vehicle->is_child == 0) {
vehicle_kill_all_passengers(vehicle);
}
vehicle->sub_state = 2;
audio_play_sound_at_location(SOUND_WATER_1, vehicle->x, vehicle->y, vehicle->z);
crash_splash_create(vehicle->x, vehicle->y, vehicle->z);
crash_splash_create(vehicle->x - 8, vehicle->y - 9, vehicle->z);
crash_splash_create(vehicle->x + 11, vehicle->y - 9, vehicle->z);
crash_splash_create(vehicle->x + 11, vehicle->y + 8, vehicle->z);
crash_splash_create(vehicle->x - 4, vehicle->y + 8, vehicle->z);
for (int i = 0; i < 10; ++i)
crashed_vehicle_particle_create(vehicle->colours, vehicle->x - 4, vehicle->y + 8, vehicle->z);
vehicle->var_0C |= (1 << 7);
vehicle->var_C5 = 0;
vehicle->var_C8 = 0;
vehicle->sprite_width = 13;
vehicle->sprite_height_negative = 45;
vehicle->sprite_height_positive = 5;
sprite_move(vehicle->x, vehicle->y, vehicle->z, (rct_sprite*)vehicle);
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle->var_4E = 0xFFFF;
}
/**
*
* rct2: 0x006D98CA
@@ -1683,14 +1735,16 @@ static void vehicle_update_crash(rct_vehicle *vehicle){
int z = map_element_height(curVehicle->x, curVehicle->y);
sint16 waterHeight = (z >> 16) & 0xFFFF;
z = (sint16)(z & 0xFFFF);
sint16 zDiff;
if (waterHeight != 0) {
waterHeight -= curVehicle->z;
if (waterHeight <= 20) {
// 0x6D99C4 crash on water
zDiff = curVehicle->z - waterHeight;
if (zDiff <= 0 && zDiff >= -20) {
vehicle_crash_on_water(curVehicle);
continue;
}
}
sint16 zDiff = curVehicle->z - z;
zDiff = curVehicle->z - z;
if ((zDiff <= 0 && zDiff >= -20) || curVehicle->z < 16){
vehicle_crash_on_land(curVehicle);
continue;

View File

@@ -16,14 +16,14 @@ void crashed_vehicle_particle_create(rct_vehicle_colour colours, int x, int y, i
sprite->sprite_height_negative = 8;
sprite->sprite_height_positive = 8;
sprite->sprite_identifier = SPRITE_IDENTIFIER_MISC;
sprite_move(x, y, z + 4, (rct_sprite*)sprite);
sprite_move(x, y, z, (rct_sprite*)sprite);
sprite->misc_identifier = SPRITE_MISC_CRASHED_VEHICLE_PARTICLE;
sprite->var_26 = (util_rand() & 0xFF) * 12;
sprite->var_24 = (util_rand() & 0x7F) + 140;
sprite->var_2E = ((util_rand() & 0xFF) * 5) >> 8;
sprite->acceleration_x = (util_rand() & 0xFFFF) * 4;
sprite->acceleration_y = (util_rand() & 0xFFFF) * 4;
sprite->acceleration_x = ((sint16)(util_rand() & 0xFFFF)) * 4;
sprite->acceleration_y = ((sint16)(util_rand() & 0xFFFF)) * 4;
sprite->acceleration_z = (util_rand() & 0xFFFF) * 4 + 0x10000;
sprite->velocity_x = 0;
sprite->velocity_y = 0;