diff --git a/src/ride/vehicle.c b/src/ride/vehicle.c index aefaa12199..e4b78bb845 100644 --- a/src/ride/vehicle.c +++ b/src/ride/vehicle.c @@ -3866,10 +3866,12 @@ produceScream: */ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) { - int _eax = (((sint64)0x280000) * RCT2_ADDRESS(0x009A37E4, sint32)[vehicle->var_1F]) >> 32; - _eax = (((sint64)_eax) * RCT2_ADDRESS(0x009A39C4, sint32)[vehicle->var_20]) >> 32; - int _ebp = 0, _ecx = 0, _edx = 0; + int gForceVert = (((sint64)0x280000) * RCT2_ADDRESS(0x009A37E4, sint32)[vehicle->var_1F]) >> 32; + gForceVert = (((sint64)gForceVert) * RCT2_ADDRESS(0x009A39C4, sint32)[vehicle->var_20]) >> 32; + int lateralFactor = 0, vertFactor = 0; + // Note shr has meant some of the below functions cast a known negative number to + // unsigned. Possibly an original bug but will be left implemented. switch (vehicle->track_type >> 2) { case TRACK_ELEM_FLAT: case TRACK_ELEM_END_STATION: @@ -3960,7 +3962,7 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) case TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_UP: case TRACK_ELEM_LEFT_BANKED_25_DEG_DOWN_TO_FLAT: case TRACK_ELEM_RIGHT_BANKED_25_DEG_DOWN_TO_FLAT: - _ecx = 103; + vertFactor = 103; //6d7509 break; case TRACK_ELEM_25_DEG_UP_TO_FLAT:// @@ -3980,21 +3982,21 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) case TRACK_ELEM_RIGHT_BANKED_25_DEG_UP_TO_FLAT: case TRACK_ELEM_FLAT_TO_LEFT_BANKED_25_DEG_DOWN: case TRACK_ELEM_FLAT_TO_RIGHT_BANKED_25_DEG_DOWN: - _ecx = -103; + vertFactor = -103; //6d7569 break; case TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP:// case TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN:// case TRACK_ELEM_25_DEG_UP_TO_60_DEG_UP_COVERED: case TRACK_ELEM_60_DEG_DOWN_TO_25_DEG_DOWN_COVERED: - _ecx = 82; + vertFactor = 82; //6d7545 break; case TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP:// case TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN:// case TRACK_ELEM_60_DEG_UP_TO_25_DEG_UP_COVERED: case TRACK_ELEM_25_DEG_DOWN_TO_60_DEG_DOWN_COVERED: - _ecx = -82; + vertFactor = -82; //6d7551 break; case TRACK_ELEM_LEFT_QUARTER_TURN_5_TILES:// @@ -4008,7 +4010,7 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) case TRACK_ELEM_LEFT_FLYER_TWIST_UP: case TRACK_ELEM_LEFT_FLYER_TWIST_DOWN: case TRACK_ELEM_LEFT_HEARTLINE_ROLL: - _ebp = 98; + lateralFactor = 98; //6d7590 break; case TRACK_ELEM_RIGHT_QUARTER_TURN_5_TILES:// @@ -4022,7 +4024,7 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) case TRACK_ELEM_RIGHT_FLYER_TWIST_UP: case TRACK_ELEM_RIGHT_FLYER_TWIST_DOWN: case TRACK_ELEM_RIGHT_HEARTLINE_ROLL: - _ebp = -98; + lateralFactor = -98; //6d75B7 break; case TRACK_ELEM_BANKED_LEFT_QUARTER_TURN_5_TILES: @@ -4030,8 +4032,8 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) 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: - _ecx = 200; - _ebp = 160; + vertFactor = 200; + lateralFactor = 160; //6d75E1 break; case TRACK_ELEM_BANKED_RIGHT_QUARTER_TURN_5_TILES: @@ -4039,23 +4041,23 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) 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: - _ecx = 200; - _ebp = -160; + vertFactor = 200; + lateralFactor = -160; //6d75F0 break; case TRACK_ELEM_S_BEND_LEFT: case TRACK_ELEM_S_BEND_LEFT_COVERED: - _ebp = (vehicle->track_progress < 48) ? 98 : -98; + lateralFactor = (vehicle->track_progress < 48) ? 98 : -98; //6d75FF break; case TRACK_ELEM_S_BEND_RIGHT: case TRACK_ELEM_S_BEND_RIGHT_COVERED: - _ebp = (vehicle->track_progress < 48) ? -98 : 98; + lateralFactor = (vehicle->track_progress < 48) ? -98 : 98; //6d7608 break; case TRACK_ELEM_LEFT_VERTICAL_LOOP: case TRACK_ELEM_RIGHT_VERTICAL_LOOP: - _ecx = (abs(vehicle->track_progress - 155) / 2) + 28; + vertFactor = (abs(vehicle->track_progress - 155) / 2) + 28; //6d7690 break; case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES: @@ -4063,7 +4065,7 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN: case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_COVERED: case TRACK_ELEM_LEFT_CURVED_LIFT_HILL: - _ebp = 59; + lateralFactor = 59; //6d7704 break; case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES: @@ -4071,139 +4073,139 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN: case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_COVERED: case TRACK_ELEM_RIGHT_CURVED_LIFT_HILL: - _ebp = -59; + lateralFactor = -59; //6d7710 break; case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_BANK: case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_UP_SMALL: case TRACK_ELEM_LEFT_HALF_BANKED_HELIX_DOWN_SMALL: - _ecx = 100; - _ebp = 100; + vertFactor = 100; + lateralFactor = 100; //6d7782 break; case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_BANK: case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_UP_SMALL: case TRACK_ELEM_RIGHT_HALF_BANKED_HELIX_DOWN_SMALL: - _ecx = 100; - _ebp = -100; + vertFactor = 100; + lateralFactor = -100; //6d778E break; case TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE: - _ebp = 45; + lateralFactor = 45; //6d779A break; case TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE: - _ebp = -45; + lateralFactor = -45; //6d77A3 break; case TRACK_ELEM_HALF_LOOP_UP: case TRACK_ELEM_FLYER_HALF_LOOP_UP: - _ecx = (-(vehicle->track_progress - 155) / 2) + 28; + vertFactor = (((uint16)(-(vehicle->track_progress - 155))) / 2) + 28; //6d763E break; case TRACK_ELEM_HALF_LOOP_DOWN: case TRACK_ELEM_FLYER_HALF_LOOP_DOWN: - _ecx = (vehicle->track_progress / 2) + 28; + vertFactor = (vehicle->track_progress / 2) + 28; //6d7656 break; case TRACK_ELEM_LEFT_CORKSCREW_UP: case TRACK_ELEM_RIGHT_CORKSCREW_DOWN: case TRACK_ELEM_LEFT_FLYER_CORKSCREW_UP: case TRACK_ELEM_RIGHT_FLYER_CORKSCREW_DOWN: - _ecx = 52; - _ebp = 70; + vertFactor = 52; + lateralFactor = 70; //6d76AA break; case TRACK_ELEM_RIGHT_CORKSCREW_UP: case TRACK_ELEM_LEFT_CORKSCREW_DOWN: case TRACK_ELEM_RIGHT_FLYER_CORKSCREW_UP: case TRACK_ELEM_LEFT_FLYER_CORKSCREW_DOWN: - _ecx = 52; - _ebp = -70; + vertFactor = 52; + lateralFactor = -70; //6d76B9 break; case TRACK_ELEM_FLAT_TO_60_DEG_UP: case TRACK_ELEM_60_DEG_DOWN_TO_FLAT: - _ecx = 56; + vertFactor = 56; //6d747C break; case TRACK_ELEM_60_DEG_UP_TO_FLAT: case TRACK_ELEM_FLAT_TO_60_DEG_DOWN: case TRACK_ELEM_BRAKE_FOR_DROP: - _ecx = -56; + vertFactor = -56; //6d7488 break; case TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_UP: case TRACK_ELEM_LEFT_QUARTER_TURN_1_TILE_60_DEG_DOWN: - _ebp = 88; + lateralFactor = 88; //6d7770 break; case TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_UP: case TRACK_ELEM_RIGHT_QUARTER_TURN_1_TILE_60_DEG_DOWN: - _ebp = -88; + lateralFactor = -88; //6d7779 break; case TRACK_ELEM_WATER_SPLASH: - _ecx = -150; + vertFactor = -150; if (vehicle->track_progress < 32) break; - _ecx = 150; + vertFactor = 150; if (vehicle->track_progress < 64) break; - _ecx = 0; + vertFactor = 0; if (vehicle->track_progress < 96) break; - _ecx = 150; + vertFactor = 150; if (vehicle->track_progress < 128) break; - _ecx = -150; + vertFactor = -150; //6d7408 break; case TRACK_ELEM_FLAT_TO_60_DEG_UP_LONG_BASE: case TRACK_ELEM_FLAT_TO_60_DEG_DOWN_LONG_BASE: - _ecx = 160; + vertFactor = 160; //6d74F1 break; case TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE: case TRACK_ELEM_60_DEG_UP_TO_FLAT_LONG_BASE_122: - _ecx = -160; + vertFactor = -160; //6d74FD break; case TRACK_ELEM_REVERSE_WHOA_BELLY_SLOPE: case TRACK_ELEM_AIR_THRUST_VERTICAL_DOWN_TO_LEVEL: - _ecx = 120; + vertFactor = 120; //6d7458 break; case TRACK_ELEM_60_DEG_UP_TO_90_DEG_UP: case TRACK_ELEM_90_DEG_DOWN_TO_60_DEG_DOWN: - _ecx = 110; + vertFactor = 110; //6d7515 break; case TRACK_ELEM_90_DEG_UP_TO_60_DEG_UP: case TRACK_ELEM_60_DEG_DOWN_TO_90_DEG_DOWN: - _ecx = -110; + vertFactor = -110; //6d7521 break; case TRACK_ELEM_LEFT_EIGHTH_TO_DIAG: case TRACK_ELEM_LEFT_EIGHTH_TO_ORTHOGONAL: - _ebp = 137; + lateralFactor = 137; //6d7575 break; case TRACK_ELEM_RIGHT_EIGHTH_TO_DIAG: case TRACK_ELEM_RIGHT_EIGHTH_TO_ORTHOGONAL: - _ebp = -137; + lateralFactor = -137; //6d759C break; case TRACK_ELEM_LEFT_EIGHTH_BANK_TO_DIAG: case TRACK_ELEM_LEFT_EIGHTH_BANK_TO_ORTHOGONAL: - _ecx = 270; - _ebp = 200; + vertFactor = 270; + lateralFactor = 200; //6d75C3 break; case TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_DIAG: case TRACK_ELEM_RIGHT_EIGHTH_BANK_TO_ORTHOGONAL: - _ecx = 270; - _ebp = -200; + vertFactor = 270; + lateralFactor = -200; //6d75D2 break; case TRACK_ELEM_DIAG_FLAT_TO_25_DEG_UP: @@ -4212,7 +4214,7 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) case TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_UP: case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_LEFT_BANK: case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_RIGHT_BANK: - _ecx = 113; + vertFactor = 113; //6d7494 break; case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT: @@ -4221,169 +4223,170 @@ void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG) case TRACK_ELEM_DIAG_25_DEG_UP_TO_RIGHT_BANK: case TRACK_ELEM_DIAG_LEFT_BANK_TO_25_DEG_DOWN: case TRACK_ELEM_DIAG_RIGHT_BANK_TO_25_DEG_DOWN: - _ecx = -113; + vertFactor = -113; //6d755D break; case TRACK_ELEM_DIAG_25_DEG_UP_TO_60_DEG_UP: case TRACK_ELEM_DIAG_60_DEG_DOWN_TO_25_DEG_DOWN: - _ecx = 95; + vertFactor = 95; //6D752D break; case TRACK_ELEM_DIAG_60_DEG_UP_TO_25_DEG_UP: case TRACK_ELEM_DIAG_25_DEG_DOWN_TO_60_DEG_DOWN: - _ecx = -95; + vertFactor = -95; //6D7539 break; case TRACK_ELEM_DIAG_FLAT_TO_60_DEG_UP: case TRACK_ELEM_DIAG_60_DEG_DOWN_TO_FLAT: - _ecx = 60; + vertFactor = 60; //6D7464 break; case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT: case TRACK_ELEM_DIAG_FLAT_TO_60_DEG_DOWN: - _ecx = -60; + vertFactor = -60; //6d7470 break; case TRACK_ELEM_LEFT_BARREL_ROLL_UP_TO_DOWN: case TRACK_ELEM_LEFT_BARREL_ROLL_DOWN_TO_UP: - _ecx = 170; - _ebp = 115; + vertFactor = 170; + lateralFactor = 115; //6d7581 break; case TRACK_ELEM_RIGHT_BARREL_ROLL_UP_TO_DOWN: case TRACK_ELEM_RIGHT_BARREL_ROLL_DOWN_TO_UP: - _ecx = 170; - _ebp = -115; + vertFactor = 170; + lateralFactor = -115; //6d75A8 break; case TRACK_ELEM_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_TILES_25_DEG_UP: - _ecx = -(vehicle->track_progress / 2) + 134; - _ebp = 90; + vertFactor = -(vehicle->track_progress / 2) + 134; + lateralFactor = 90; //6d771C break; case TRACK_ELEM_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_TILES_25_DEG_UP: - _ecx = -(vehicle->track_progress / 2) + 134; - _ebp = -90; + vertFactor = -(vehicle->track_progress / 2) + 134; + lateralFactor = -90; //6D7746 break; case TRACK_ELEM_LEFT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_LEFT_BANK: - _ecx = -(vehicle->track_progress / 2) + 134; - _ebp = 90; + vertFactor = -(vehicle->track_progress / 2) + 134; + lateralFactor = 90; //6D7731 identical to 6d771c break; case TRACK_ELEM_RIGHT_QUARTER_TURN_3_TILES_25_DEG_DOWN_TO_RIGHT_BANK: - _ecx = -(vehicle->track_progress / 2) + 134; - _ebp = -90; + vertFactor = -(vehicle->track_progress / 2) + 134; + lateralFactor = -90; //6D775B identical to 6d7746 break; case TRACK_ELEM_LEFT_LARGE_HALF_LOOP_UP: case TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_UP: - _ecx = (-(vehicle->track_progress - 311) / 4) + 46; + vertFactor = (((uint16)(-(vehicle->track_progress - 311))) / 4) + 46; //6d7666 break; case TRACK_ELEM_RIGHT_LARGE_HALF_LOOP_DOWN: case TRACK_ELEM_LEFT_LARGE_HALF_LOOP_DOWN: - _ecx = (vehicle->track_progress / 4) + 46; + vertFactor = (vehicle->track_progress / 4) + 46; //6d767F break; case TRACK_ELEM_HEARTLINE_TRANSFER_UP: - _ecx = 103; + vertFactor = 103; if (vehicle->track_progress < 32) break; - _ecx = -103; + vertFactor = -103; if (vehicle->track_progress < 64) break; - _ecx = 0; + vertFactor = 0; if (vehicle->track_progress < 96) break; - _ecx = 103; + vertFactor = 103; if (vehicle->track_progress < 128) break; - _ecx = -103; + vertFactor = -103; //6d74A0 break; case TRACK_ELEM_HEARTLINE_TRANSFER_DOWN: - _ecx = -103; + vertFactor = -103; if (vehicle->track_progress < 32) break; - _ecx = 103; + vertFactor = 103; if (vehicle->track_progress < 64) break; - _ecx = 0; + vertFactor = 0; if (vehicle->track_progress < 96) break; - _ecx = -103; + vertFactor = -103; if (vehicle->track_progress < 128) break; - _ecx = 103; + vertFactor = 103; //6D74CA break; case TRACK_ELEM_MULTIDIM_INVERTED_FLAT_TO_90_DEG_QUARTER_LOOP_DOWN: case TRACK_ELEM_INVERTED_FLAT_TO_90_DEG_QUARTER_LOOP_DOWN: case TRACK_ELEM_MULTIDIM_FLAT_TO_90_DEG_DOWN_QUARTER_LOOP: - _ecx = (vehicle->track_progress / 4) + 55; + vertFactor = (vehicle->track_progress / 4) + 55; //6d762D break; case TRACK_ELEM_90_DEG_TO_INVERTED_FLAT_QUARTER_LOOP_UP: case TRACK_ELEM_MULTIDIM_90_DEG_UP_TO_INVERTED_FLAT_QUARTER_LOOP: case 255: - _ecx = (-(vehicle->track_progress - 137) / 4) + 55; + vertFactor = (((uint16)(-(vehicle->track_progress - 137))) / 4) + 55; //6D7614 break; case TRACK_ELEM_AIR_THRUST_TOP_CAP: - _ecx = -60; + vertFactor = -60; //6D744C break; case TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP: case TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN: - _ecx = 200; - _ebp = 100; + vertFactor = 200; + lateralFactor = 100; //6d76C8 break; case TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_UP: case TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_3_TILE_25_DEG_DOWN: - _ecx = 200; - _ebp = -100; + vertFactor = 200; + lateralFactor = -100; //6d76d7 break; case TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP: case TRACK_ELEM_LEFT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN: - _ecx = 200; - _ebp = 160; + vertFactor = 200; + lateralFactor = 160; //6D76E6 break; case TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_UP: case TRACK_ELEM_RIGHT_BANKED_QUARTER_TURN_5_TILE_25_DEG_DOWN: - _ecx = 200; - _ebp = -160; + vertFactor = 200; + lateralFactor = -160; //6d76F5 break; } - if (_ecx != 0) { - _eax += abs(vehicle->velocity) * 98 / _ecx; + int gForceLateral = 0; + + if (vertFactor != 0) { + gForceVert += abs(vehicle->velocity) * 98 / vertFactor; } - if (_ebp != 0) { - _edx += abs(vehicle->velocity) * 98 / _ebp; + if (lateralFactor != 0) { + gForceLateral += abs(vehicle->velocity) * 98 / lateralFactor; } - _eax *= 10; - _edx *= 10; - _eax >>= 16; - _edx >>= 16; + gForceVert *= 10; + gForceLateral *= 10; + gForceVert >>= 16; + gForceLateral >>= 16; int eax, ebx, ecx, edx, esi, edi, ebp; esi = (int)vehicle; RCT2_CALLFUNC_X(0x006D73D0, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp); - // Note shr causing this to assert on all loops - if (_eax != (sint16)(eax & 0xFFFF)) - assert(_eax == (sint16)(eax & 0xFFFF)); - if (_edx != (sint16)(edx & 0xFFFF)) - assert(_edx == (sint16)(edx & 0xFFFF)); - if (verticalG != NULL) *verticalG = (sint16)(_eax & 0xFFFF); - if (lateralG != NULL) *lateralG = (sint16)(_edx & 0xFFFF); + if (gForceVert != (sint16)(eax & 0xFFFF)) + assert(gForceVert == (sint16)(eax & 0xFFFF)); + if (gForceLateral != (sint16)(edx & 0xFFFF)) + assert(gForceLateral == (sint16)(edx & 0xFFFF)); + if (verticalG != NULL) *verticalG = (sint16)(gForceVert & 0xFFFF); + if (lateralG != NULL) *lateralG = (sint16)(gForceLateral & 0xFFFF); } void vehicle_set_map_toolbar(rct_vehicle *vehicle)