diff --git a/src/peep/peep.c b/src/peep/peep.c index 67551e3d4d..09cf941597 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -44,6 +44,7 @@ static int peep_should_find_bench(rct_peep* peep); static void peep_stop_purchase_thought(rct_peep* peep, uint8 ride_type); static void sub_693BAB(rct_peep* peep); static void peep_spend_money(rct_peep *peep, money32 amount); +static void peep_give_real_name(rct_peep *peep); const char *gPeepEasterEggNames[] = { "MICHAEL SCHUMACHER", @@ -4783,9 +4784,9 @@ rct_peep *peep_generate(int x, int y, int z) peep->energy_growth_rate = energy; if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES){ - RCT2_CALLPROC_X(0x0069C483, 0, 0, 0, 0, (int)peep, 0, 0); + peep_give_real_name(peep); } - RCT2_CALLPROC_X(0x00699115, 0, 0, 0, 0, (int)peep, 0, 0); + peep_update_name_sort(peep); RCT2_GLOBAL(RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK, uint16)++; @@ -5331,4 +5332,64 @@ static void peep_spend_money(rct_peep *peep, money32 amount) finance_payment(-amount, RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint32)); sound_play_panned(SOUND_PURCHASE, 0x8001, peep->x, peep->y, peep->z); -} \ No newline at end of file +} + +/** + * + * rct2: 0x0069C483 + */ +static void peep_give_real_name(rct_peep *peep) +{ + RCT2_CALLPROC_X(0x0069C483, 0, 0, 0, 0, (int)peep, 0, 0); +} + +/** + * + * rct2: 0x00699115 + */ +void peep_update_name_sort(rct_peep *peep) +{ + RCT2_CALLPROC_X(0x00699115, 0, 0, 0, 0, (int)peep, 0, 0); +} + +/** + * + * rct2: 0x0069926C + */ +void peep_update_names(bool realNames) +{ + rct_peep *peep; + uint16 spriteIndex; + bool restart; + + if (realNames) { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) |= PARK_FLAGS_SHOW_REAL_GUEST_NAMES; + do { + restart = false; + FOR_ALL_GUESTS(spriteIndex, peep) { + if (peep->name_string_idx == 767) { + peep_give_real_name(peep); + peep_update_name_sort(peep); + restart = true; + } + } + } while (restart); + gfx_invalidate_screen(); + } else { + RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_SHOW_REAL_GUEST_NAMES; + do { + restart = false; + FOR_ALL_GUESTS(spriteIndex, peep) { + if (peep->name_string_idx < 0xA000) + continue; + if (peep->name_string_idx >= 0xE000) + continue; + + peep->name_string_idx = 767; + peep_update_name_sort(peep); + restart = true; + } + } while (restart); + gfx_invalidate_screen(); + } +} diff --git a/src/peep/peep.h b/src/peep/peep.h index 28875d2bfd..e623d518b6 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -592,5 +592,7 @@ void remove_peep_from_ride(rct_peep* peep); void remove_peep_from_queue(rct_peep* peep); void sub_693BE5(rct_peep* peep, uint8 al); +void peep_update_name_sort(rct_peep *peep); +void peep_update_names(bool realNames); #endif diff --git a/src/peep/staff.c b/src/peep/staff.c index b6cc3233f8..73d6c9708a 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -241,8 +241,7 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx, newPeep->energy_growth_rate = 0x60; newPeep->var_E2 = 0; - RCT2_CALLPROC_X(0x00699115, (uint32)ebp & 0xFFFFFF3F, 0, 0, 0, (int)newPeep, 0, - (*ebp << 25) | (*ebp >> 6)); + peep_update_name_sort(newPeep); newPeep->staff_id = newStaffId; diff --git a/src/ride/ride.c b/src/ride/ride.c index f5a3338891..cd610bccfe 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -140,6 +140,7 @@ static void ride_shop_connected(rct_ride* ride, int ride_idx); static void ride_spiral_slide_update(rct_ride *ride); static void ride_update(int rideIndex); static void sub_6B59C6(int rideIndex); +static void ride_update_vehicle_colours(int rideIndex); rct_ride_type *ride_get_entry(rct_ride *ride) { @@ -4504,11 +4505,11 @@ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, in break; case 2: *((uint8*)(&ride->vehicle_colours[index])) = value; - RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + ride_update_vehicle_colours(ride_id); break; case 3: *((uint8*)(&ride->vehicle_colours[index]) + 1) = value; - RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + ride_update_vehicle_colours(ride_id); break; case 4: ride->track_colour_supports[index] = value; @@ -4521,7 +4522,7 @@ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, in ride->vehicle_colours[i] = ride->vehicle_colours[0]; ride->vehicle_colours_extended[i] = ride->vehicle_colours_extended[0]; } - RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + ride_update_vehicle_colours(ride_id); break; case 6: ride->entrance_style = value; @@ -4530,7 +4531,7 @@ void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, in break; case 7: ride->vehicle_colours_extended[index] = value; - RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + ride_update_vehicle_colours(ride_id); break; } window_invalidate_by_number(WC_RIDE, ride_id); @@ -5007,3 +5008,49 @@ void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor) uint8 unreliability = 100 - ((ride->reliability >> 8) & 0xFF); ride->reliability += reliabilityIncreaseFactor * (unreliability / 2); } + +/** + * + * rct2: 0x006DE102 + */ +static void ride_update_vehicle_colours(int rideIndex) +{ + rct_ride *ride; + rct_vehicle *vehicle; + rct_vehicle_colour colours; + uint16 spriteIndex; + uint8 coloursExtended; + + ride = GET_RIDE(rideIndex); + if (ride->type == RIDE_TYPE_SPACE_RINGS || ride_type_has_flag(ride->type, RIDE_TYPE_FLAG_16)) { + gfx_invalidate_screen(); + } + + for (int i = 0; i < 32; i++) { + int carIndex = 0; + spriteIndex = ride->vehicles[i]; + while (spriteIndex != SPRITE_INDEX_NULL) { + vehicle = &(g_sprite_list[spriteIndex].vehicle); + switch (ride->colour_scheme_type & 3) { + case RIDE_COLOUR_SCHEME_ALL_SAME: + colours = ride->vehicle_colours[0]; + coloursExtended = ride->vehicle_colours_extended[0]; + break; + case RIDE_COLOUR_SCHEME_DIFFERENT_PER_TRAIN: + colours = ride->vehicle_colours[i]; + coloursExtended = ride->vehicle_colours_extended[i]; + break; + case RIDE_COLOUR_SCHEME_DIFFERENT_PER_CAR: + colours = ride->vehicle_colours[carIndex]; + coloursExtended = ride->vehicle_colours_extended[carIndex]; + break; + } + + vehicle->colours = colours; + vehicle->colours_extended = coloursExtended; + invalidate_sprite((rct_sprite*)vehicle); + spriteIndex = vehicle->next_vehicle_on_train; + carIndex++; + } + } +} diff --git a/src/ride/vehicle.h b/src/ride/vehicle.h index 866f52cc08..8c5b270101 100644 --- a/src/ride/vehicle.h +++ b/src/ride/vehicle.h @@ -58,7 +58,7 @@ typedef struct { uint8 pad_2C[0x04]; uint8 ride; // 0x30 uint8 vehicle_type; // 0x31 - uint8 pad_32[0x02]; + rct_vehicle_colour colours; // 0x32 uint16 var_34; sint16 var_36; //x related @@ -101,6 +101,7 @@ typedef struct { uint8 pad_CF[0x06]; uint8 var_D5; uint8 ride_subtype; // 0xD6 + uint8 colours_extended; // 0xD7 } rct_vehicle; enum { diff --git a/src/windows/options.c b/src/windows/options.c index 52cda609b7..86621a0836 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -555,8 +555,9 @@ static void window_options_mouseup() window_invalidate(w); break; case WIDX_REAL_NAME_CHECKBOX: - RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) ^= PARK_FLAGS_SHOW_REAL_GUEST_NAMES; - RCT2_CALLPROC_X(0x0069C52F, RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES ? 0 : 1, 0, 0, 0, 0, 0, 0); + peep_update_names( + !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_SHOW_REAL_GUEST_NAMES) + ); break; case WIDX_SAVE_PLUGIN_DATA_CHECKBOX: gConfigGeneral.save_plugin_data ^= 1;