implement sub_6D63D4

This commit is contained in:
IntelOrca 2015-12-20 12:30:10 +00:00
parent 306855fd3e
commit 09ac928fd6
1 changed files with 216 additions and 32 deletions

View File

@ -101,6 +101,11 @@ const uint8 DoorCloseSoundIds[] = {
SOUND_62
};
void vehicle_invalidate(rct_vehicle *vehicle)
{
invalidate_sprite_2((rct_sprite*)vehicle);
}
/**
*
* rct2: 0x006BB9FF
@ -562,7 +567,7 @@ static int vehicle_close_restraints(rct_vehicle* vehicle){
}
vehicle->restraints_position -= 20;
}
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
ebp++;
} while ((vehicle_id = vehicle->next_vehicle_on_train) != 0xFFFF);
@ -608,7 +613,7 @@ static int vehicle_open_restraints(rct_vehicle* vehicle){
vehicle->var_BA += value;
vehicle->var_B6 -= value;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
continue;
}
}
@ -619,7 +624,7 @@ static int vehicle_open_restraints(rct_vehicle* vehicle){
vehicle->var_C8 = vehicle->var_C8 + 0x3333 - 0xFFFF;
vehicle->var_C5++;
vehicle->var_C5 &= 7;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
}
else{
vehicle->var_C8 += 0x3333;
@ -661,7 +666,7 @@ static int vehicle_open_restraints(rct_vehicle* vehicle){
continue;
}
vehicle->restraints_position += 20;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
ebp++;
}
@ -1313,7 +1318,7 @@ static void vehicle_update_waiting_for_passengers(rct_vehicle* vehicle){
vehicle->sub_state = 1;
vehicle->var_C0 = 0;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
return;
}
else if (vehicle->sub_state == 1){
@ -1476,7 +1481,7 @@ static void vehicle_update_bumpcar_mode(rct_vehicle* vehicle) {
if (vehicleEntry->flags_a & VEHICLE_ENTRY_FLAG_A_7 && vehicle->var_C5 != 1) {
vehicle->var_C5 = 1;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
}
vehicle_update_motion_bumper_car(vehicle);
@ -1490,7 +1495,7 @@ static void vehicle_update_bumpcar_mode(rct_vehicle* vehicle) {
return;
vehicle->var_C5 = 0;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
vehicle->velocity = 0;
vehicle->var_2C = 0;
vehicle->status = VEHICLE_STATUS_UNLOADING_PASSENGERS;
@ -2079,7 +2084,7 @@ static void vehicle_update_departing(rct_vehicle* vehicle) {
if (vehicle_next_tower_element_is_top(vehicle) == false) {
if (ride->mode == RIDE_MODE_FREEFALL_DROP)
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
return;
}
@ -2353,7 +2358,7 @@ static void vehicle_update_travelling(rct_vehicle* vehicle) {
vehicle->var_C5++;
vehicle->velocity = 0;
vehicle->var_2C = 0;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
return;
}
@ -2940,7 +2945,7 @@ static void vehicle_update_swinging(rct_vehicle* vehicle) {
return;
// Used to know which sprite to draw
vehicle->var_1F = al;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
return;
}
@ -3013,7 +3018,7 @@ static void vehicle_update_ferris_wheel_rotating(rct_vehicle* vehicle) {
if (rotation == vehicle->sub_state)
vehicle->var_CE++;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
uint8 subState = vehicle->sub_state;
if (ride->mode & RIDE_MODE_FORWARD_ROTATION)
@ -3071,7 +3076,7 @@ static void vehicle_update_simulator_operating(rct_vehicle* vehicle) {
if (al == vehicle->var_1F)
return;
vehicle->var_1F = al;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
return;
}
@ -3115,7 +3120,7 @@ static void vehicle_update_rotating(rct_vehicle* vehicle) {
if (al == vehicle->var_1F)
return;
vehicle->var_1F = al;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
return;
}
@ -3175,7 +3180,7 @@ static void vehicle_update_space_rings_operating(rct_vehicle* vehicle) {
if (al == vehicle->var_1F)
return;
vehicle->var_1F = al;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
return;
}
@ -3196,7 +3201,7 @@ static void vehicle_update_haunted_house_operating(rct_vehicle* vehicle) {
if (vehicle->var_1F != 0) {
if (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) & 1) {
vehicle->var_1F++;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
if (vehicle->var_1F == 19)
vehicle->var_1F = 0;
@ -3225,7 +3230,7 @@ static void vehicle_update_haunted_house_operating(rct_vehicle* vehicle) {
break;
case 75:
vehicle->var_1F = 1;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
break;
case 400:
audio_play_sound_at_location(
@ -3243,7 +3248,7 @@ static void vehicle_update_haunted_house_operating(rct_vehicle* vehicle) {
break;
case 775:
vehicle->var_1F = 1;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
break;
case 1100:
audio_play_sound_at_location(
@ -3289,12 +3294,12 @@ static void vehicle_update_top_spin_operating(rct_vehicle* vehicle) {
vehicle->var_4C = (sint16)vehicle->var_4C + 1;
if (al != vehicle->var_1F) {
vehicle->var_1F = al;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
}
al = edi[vehicle->var_4C * 2 + 1];
if (al != vehicle->var_20) {
vehicle->var_20 = al;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
}
return;
}
@ -3496,7 +3501,7 @@ static void vehicle_crash_on_land(rct_vehicle* vehicle) {
vehicle->sprite_height_positive = 5;
sprite_move(vehicle->x, vehicle->y, vehicle->z, (rct_sprite*)vehicle);
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
vehicle->var_4E = 0;
}
@ -3548,7 +3553,7 @@ static void vehicle_crash_on_water(rct_vehicle* vehicle) {
vehicle->sprite_height_positive = 5;
sprite_move(vehicle->x, vehicle->y, vehicle->z, (rct_sprite*)vehicle);
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
vehicle->var_4E = 0xFFFF;
}
@ -4442,7 +4447,7 @@ static int vehicle_update_motion_bumper_car(rct_vehicle* vehicle) {
vehicle->sprite_direction -= 2;
}
vehicle->sprite_direction &= 0x1E;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
}
else if ((scenario_rand() & 0xFFFF) <= 2849) {
if (vehicle->var_35 & (1 << 6))
@ -4450,7 +4455,7 @@ static int vehicle_update_motion_bumper_car(rct_vehicle* vehicle) {
else
vehicle->sprite_direction += 2;
vehicle->sprite_direction &= 0x1E;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
}
}
@ -4472,14 +4477,14 @@ static int vehicle_update_motion_bumper_car(rct_vehicle* vehicle) {
location.y += RCT2_ADDRESS(0x009A36CE, sint16)[oldC4 * 4];
if (!vehicle_update_bumper_car_collision(vehicle, location.x, location.y, &collideSprite)) {
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
sprite_move(
location.x,
location.y,
location.z,
(rct_sprite*)vehicle
);
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
}
}
@ -4492,7 +4497,7 @@ static int vehicle_update_motion_bumper_car(rct_vehicle* vehicle) {
unk_F64E20->y = vehicle->y;
unk_F64E20->z = vehicle->z;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
while (1) {
vehicle->var_35++;
@ -4545,7 +4550,7 @@ static int vehicle_update_motion_bumper_car(rct_vehicle* vehicle) {
unk_F64E20->z,
(rct_sprite*)vehicle
);
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
}
sint32 eax = vehicle->velocity / 2;
@ -5202,16 +5207,195 @@ static void vehicle_update_spinning_car(rct_vehicle *vehicle)
vehicle->var_B6 = unk;
vehicle->var_BA += unk >> 8;
vehicle->var_B6 -= unk >> vehicleEntry->spinning_friction;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
}
/**
*
* rct2: 0x006734B2
*/
static void sub_6734B2(sint16 x, sint16 y, sint16 z)
{
RCT2_CALLPROC_X(0x006734B2, x, 0, y, z, 0, 0, 0);
}
static const struct { sint8 x, y, z; } byte_9A3A20[] = {
{ -11, 0, 22 },
{ -10, 4, 22 },
{ -8, 8, 22 },
{ -4, 10, 22 },
{ 0, 11, 22 },
{ 4, 10, 22 },
{ 8, 8, 22 },
{ 10, 4, 22 },
{ 11, 0, 22 },
{ 10, -4, 22 },
{ 8, -8, 22 },
{ 4, -10, 22 },
{ 0, -11, 22 },
{ -4, -10, 22 },
{ -8, -8, 22 },
{ -10, -4, 22 },
{ -9, 0, 27 },
{ -8, 4, 27 },
{ -6, 6, 27 },
{ -4, 8, 27 },
{ 0, 9, 27 },
{ 4, 8, 27 },
{ 6, 6, 27 },
{ 8, 4, 27 },
{ 9, 0, 27 },
{ 8, -4, 27 },
{ 6, -6, 27 },
{ 4, -8, 27 },
{ 0, -9, 27 },
{ -4, -8, 27 },
{ -6, -6, 27 },
{ -8, -4, 27 },
{ -13, 0, 18 },
{ -12, 4, 17 },
{ -9, 9, 17 },
{ -4, 8, 17 },
{ 0, 13, 18 },
{ 4, 8, 17 },
{ 6, 6, 17 },
{ 8, 4, 17 },
{ 13, 0, 18 },
{ 8, -4, 17 },
{ 6, -6, 17 },
{ 4, -8, 17 },
{ 0, -13, 18 },
{ -4, -8, 17 },
{ -6, -6, 17 },
{ -8, -4, 17 }
};
/**
*
* rct2: 0x006D63D4
*/
static void sub_6D63D4(rct_vehicle *vehicle)
{
RCT2_CALLPROC_X(0x006D63D4, 0, 0, 0, 0, (int)vehicle, 0, 0);
uint8 al, ah;
uint32 eax;
uint32 *var_C8 = (uint32*)&vehicle->var_C8;
rct_ride_type_vehicle *vehicleEntry = vehicle_get_vehicle_entry(vehicle);
switch (vehicleEntry->var_11) {
case 1: // loc_6D652B
*var_C8 += RCT2_GLOBAL(0x00F64E08, uint32);
al = (*var_C8 >> 20) & 3;
if (vehicle->var_C5 != al) {
ah = al;
al = vehicle->var_C5;
vehicle->var_C5 = ah;
al &= 0x02;
ah &= 0x02;
if (al != ah) {
rct_ride *ride = GET_RIDE(vehicle->ride);
if (ride->entrance_style == RIDE_ENTRANCE_STYLE_PLAIN ||
(vehicle->status != VEHICLE_STATUS_MOVING_TO_END_OF_STATION &&
vehicle->status != VEHICLE_STATUS_ARRIVING)
) {
int index = vehicle->sprite_direction >> 1;
if (vehicle->var_1F == 2) {
index += 16;
}
if (vehicle->var_1F == 6) {
index += 32;
}
sub_6734B2(
vehicle->x + byte_9A3A20[index].x,
vehicle->y + byte_9A3A20[index].y,
vehicle->z + byte_9A3A20[index].z
);
}
}
vehicle_invalidate(vehicle);
}
break;
case 2: // loc_6D6424
*var_C8 += RCT2_GLOBAL(0x00F64E08, uint32);
al = (*var_C8 >> 18) & 2;
if (vehicle->var_C5 != al) {
vehicle->var_C5 = al;
vehicle_invalidate(vehicle);
}
break;
case 3: // loc_6D6482
*var_C8 += RCT2_GLOBAL(0x00F64E08, uint32);
eax = ((*var_C8 >> 13) & 0xFF) * 6;
ah = (eax >> 8) & 0xFF;
if (vehicle->var_C5 != ah) {
vehicle->var_C5 = ah;
vehicle_invalidate(vehicle);
}
break;
case 4: // loc_6D64F7
*var_C8 += RCT2_GLOBAL(0x00F64E08, uint32);
eax = ((*var_C8 >> 13) & 0xFF) * 7;
ah = (eax >> 8) & 0xFF;
if (vehicle->var_C5 != ah) {
vehicle->var_C5 = ah;
vehicle_invalidate(vehicle);
}
break;
case 5: // loc_6D6453
*var_C8 += RCT2_GLOBAL(0x00F64E08, uint32);
al = (*var_C8 >> 19) & 1;
if (vehicle->var_C5 != al) {
vehicle->var_C5 = al;
vehicle_invalidate(vehicle);
}
break;
case 6: // loc_6D65C3
if (vehicle->var_C8 <= 0xCCCC) {
vehicle->var_C8 += 0x3333;
} else {
vehicle->var_C8 += 0x3333;
vehicle->var_C8 += 1;
vehicle->var_C8 &= 7;
vehicle_invalidate(vehicle);
}
break;
case 7: // loc_6D63F5
*var_C8 += RCT2_GLOBAL(0x00F64E08, uint32);
al = (*var_C8 >> 18) & 3;
if (vehicle->var_C5 != al) {
vehicle->var_C5 = al;
vehicle_invalidate(vehicle);
}
break;
case 8: // loc_6D64B6
if (vehicle->num_peeps != 0) {
*var_C8 += RCT2_GLOBAL(0x00F64E08, uint32);
eax = ((*var_C8 >> 13) & 0xFF) << 2;
ah = (eax >> 8) & 0xFF;
if (vehicle->var_C5 != ah) {
vehicle->var_C5 = ah;
vehicle_invalidate(vehicle);
}
}
break;
case 9: // loc_6D65E1
ah = vehicle->var_D9;
al = vehicle->var_D8;
if (al != ah) {
if (vehicle->var_C8 <= 0xCCCC) {
vehicle->var_C8 += 0x3333;
} else {
vehicle->var_C8 += 0x3333;
uint8 bl = al + 1;
if (al >= ah) {
bl -= 2;
}
vehicle->var_D8 = bl;
vehicle->var_C5 = (bl - 4) & 7;
vehicle_invalidate(vehicle);
}
}
break;
}
}
/**
@ -6532,7 +6716,7 @@ loc_6DC40E:
unk_F64E20->x = vehicle->x;
unk_F64E20->y = vehicle->y;
unk_F64E20->z = vehicle->z;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
loc_6DC462:
vehicle->var_D3 = 0;
@ -6821,7 +7005,7 @@ loc_6DCA7A:
unk_F64E20->x = vehicle->x;
unk_F64E20->y = vehicle->y;
unk_F64E20->z = vehicle->z;
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
loc_6DCA9A:
regs.ax = vehicle->track_progress - 1;
@ -6965,7 +7149,7 @@ loc_6DCD6B:
loc_6DCDE4:
sprite_move(unk_F64E20->x, unk_F64E20->y, unk_F64E20->z, (rct_sprite*)vehicle);
invalidate_sprite_2((rct_sprite*)vehicle);
vehicle_invalidate(vehicle);
loc_6DCE02:
vehicle->var_2C /= RCT2_GLOBAL(0x00F64E10, uint32);