implement vehicle_update_swinging_car

This commit is contained in:
IntelOrca 2015-12-20 15:22:51 +00:00
parent 98178c2560
commit 6825c8645f
1 changed files with 222 additions and 1 deletions

View File

@ -71,6 +71,7 @@ static void vehicle_update_sound(rct_vehicle *vehicle);
static int vehicle_update_scream_sound(rct_vehicle *vehicle);
static void vehicle_kill_all_passengers(rct_vehicle* vehicle);
static bool sub_6DE287(rct_vehicle *vehicle);
#define NO_SCREAM 254
@ -4896,14 +4897,234 @@ static void loc_6DB1B0(rct_vehicle *vehicle, rct_map_element *mapElement)
}
}
static int vehicle_get_swing_amount(rct_vehicle *vehicle)
{
int trackType = vehicle->track_type >> 2;
switch (trackType) {
case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES:
case TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES:
case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_UP:
case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_25_DEG_DOWN:
case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES_COVERED:
case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_LARGE:
case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_LARGE:
case TRACK_ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_UP:
case TRACK_ELEM_LEFT_QUARTER_BANKED_HELIX_LARGE_DOWN:
case TRACK_ELEM_LEFT_QUARTER_HELIX_LARGE_UP:
case TRACK_ELEM_LEFT_QUARTER_HELIX_LARGE_DOWN:
case TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP:
case TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN:
// loc_6D67E1
return 14;
case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES:
case TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES:
case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_UP:
case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_25_DEG_DOWN:
case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES_COVERED:
case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_LARGE:
case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_LARGE:
case TRACK_ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_UP:
case TRACK_ELEM_RIGHT_QUARTER_BANKED_HELIX_LARGE_DOWN:
case TRACK_ELEM_RIGHT_QUARTER_HELIX_LARGE_UP:
case TRACK_ELEM_RIGHT_QUARTER_HELIX_LARGE_DOWN:
case TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP:
case TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN:
// loc_6D6804
return -14;
case TRACK_ELEM_S_BEND_LEFT:
case TRACK_ELEM_S_BEND_LEFT_COVERED:
// loc_6D67EF
if (vehicle->var_34 < 48) {
return 14;
} else {
return -15;
}
case TRACK_ELEM_S_BEND_RIGHT:
case TRACK_ELEM_S_BEND_RIGHT_COVERED:
// loc_6D67CC
if (vehicle->var_34 < 48) {
return -14;
} else {
return 15;
}
case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES:
case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK:
case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP:
case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN:
case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED:
case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL:
case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL:
case TRACK_ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP:
case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK:
case TRACK_ELEM_LEFT_CURVED_LIFT_HILL:
case TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP:
case TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN:
// loc_6D67BE
return 13;
case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES:
case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK:
case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP:
case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN:
case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED:
case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL:
case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL:
case TRACK_ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP:
case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK:
case TRACK_ELEM_RIGHT_CURVED_LIFT_HILL:
case TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP:
case TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN:
// loc_6D67B0
return -13;
case TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE:
case TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP:
case TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN:
// loc_6D67A2
return 12;
case TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE:
case TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP:
case TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN:
// loc_6D6794
return -12;
case TRACK_ELEM_LEFT_EIGHTH_TO_DIAG:
case TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL:
case TRACK_ELEM_LEFT_EIGHTH_BANK_TO_DIAG:
case TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL:
// loc_6D67D3
return 15;
case TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG:
case TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL:
case TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG:
case TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL:
// loc_6D67F6
return -15;
}
}
/**
*
* rct2: 0x006D6776
*/
static void vehicle_update_swinging_car(rct_vehicle *vehicle)
{
sint32 dword_F64E08 = RCT2_GLOBAL(0x00F64E08, sint32);
vehicle->var_4E = (-(sint16)vehicle->var_4C) >> 6;
int swingAmount = vehicle_get_swing_amount(vehicle);
if (swingAmount < 0) {
vehicle->var_4E -= dword_F64E08 >> (-swingAmount);
} else {
vehicle->var_4E += dword_F64E08 >> swingAmount;
}
rct_ride_type_vehicle *vehicleEntry = vehicle_get_vehicle_entry(vehicle);
RCT2_CALLPROC_X(0x006D6776, 0, 0, 0, 0, (int)vehicle, (int)vehicleEntry, 0);
sint16 dx = 3185;
if (vehicleEntry->flags_b & VEHICLE_ENTRY_FLAG_B_5) {
dx = 5006;
}
if (vehicleEntry->flags_b & VEHICLE_ENTRY_FLAG_B_9) {
dx = 1820;
}
sint16 cx = -dx;
if (vehicleEntry->flags_b & VEHICLE_ENTRY_FLAG_B_11) {
dx = 5370;
cx = -5370;
int trackType = vehicle->track_type >> 2;
switch (trackType) {
case TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES:
case TRACK_ELEM_LEFT_BANK:
case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK:
dx = 10831;
cx = -819;
break;
case TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES:
case TRACK_ELEM_RIGHT_BANK:
case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK:
dx = 819;
cx = -10831;
break;
}
switch (trackType) {
case TRACK_ELEM_END_STATION:
case TRACK_ELEM_BEGIN_STATION:
case TRACK_ELEM_MIDDLE_STATION:
case TRACK_ELEM_BRAKES:
case TRACK_ELEM_BLOCK_BRAKES:
dx = 0;
cx = 0;
break;
}
if (vehicle->update_flags & VEHICLE_UPDATE_FLAG_0) {
dx = 0;
cx = 0;
}
}
vehicle->var_4C += vehicle->var_4E;
vehicle->var_4E -= vehicle->var_4E >> 5;
sint16 ax = vehicle->var_4C;
if (ax > dx) {
ax = dx;
vehicle->var_4E = 0;
}
if (ax < cx) {
ax = cx;
vehicle->var_4E = 0;
}
vehicle->var_4C = ax;
uint8 bl = 11;
if (ax >= -10012) {
bl = 12;
if (ax <= 10012) {
bl = 9;
if (ax >= -8191) {
bl = 10;
if (ax <= 8191) {
bl = 7;
if (ax >= -6371) {
bl = 8;
if (ax <= 6371) {
bl = 5;
if (ax >= -4550) {
bl = 6;
if (ax <= 4550) {
bl = 3;
if (ax >= -2730) {
bl = 4;
if (ax <= 2730) {
ax = 1;
if (ax >= -910) {
bl = 2;
if (ax <= 910) {
bl = 0;
}
}
}
}
}
}
}
}
}
}
}
}
if (bl != vehicle->var_4A) {
vehicle->var_4A = bl;
vehicle_invalidate(vehicle);
}
}
#pragma region off_9A2E84