Refactor get_g_force and fix known signed/unsigned issues

This commit is contained in:
duncanspumpkin 2015-12-15 17:47:30 +00:00
parent a941e67df6
commit 75b5946299
1 changed files with 109 additions and 106 deletions

View File

@ -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)