diff --git a/src/game.c b/src/game.c index 75b23f1cf8..984294fb10 100644 --- a/src/game.c +++ b/src/game.c @@ -797,7 +797,7 @@ char save_game() path_set_extension(path, ".SV6"); if (scenario_save(path, gConfigGeneral.save_plugin_data ? 1 : 0)) { - game_do_command(0, 1047, 0, -1, GAME_COMMAND_0, 0, 0); + game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); gfx_invalidate_screen(); return 1; } else { @@ -874,7 +874,7 @@ void game_load_or_quit_no_save_prompt() #pragma region Game command function table static uint32 game_do_command_table[58] = { - 0x006B2FC5, + 0, 0x0066397F, 0, 0x006C511D, @@ -937,7 +937,7 @@ static uint32 game_do_command_table[58] = { void game_command_emptysub(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) {} static GAME_COMMAND_POINTER* new_game_command_table[58] = { - game_command_emptysub, + game_command_set_ride_appearance, game_command_emptysub, game_pause_toggle, game_command_emptysub, diff --git a/src/game.h b/src/game.h index 410b596d04..7e7e509106 100644 --- a/src/game.h +++ b/src/game.h @@ -24,7 +24,7 @@ #include "common.h" enum GAME_COMMAND { - GAME_COMMAND_0, + GAME_COMMAND_SET_RIDE_APPEARANCE, GAME_COMMAND_1, GAME_COMMAND_TOGGLE_PAUSE, // 2 GAME_COMMAND_3, //Has something to do with ride construction diff --git a/src/ride/ride.c b/src/ride/ride.c index a5b6147d55..9297e89837 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -3791,6 +3791,63 @@ void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi } } +/** + * + * rct2: 0x006B2FC5 + */ +void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + if(*ebx & GAME_COMMAND_FLAG_APPLY){ + uint8 ride_id = *edx; + uint8 type = *ebx >> 8; + uint8 value = *edx >> 8; + int index = *edi; + rct_ride *ride = &g_ride_list[ride_id]; + switch(type){ + case 0: + ride->track_colour_main[index] = value; + gfx_invalidate_screen(); + break; + case 1: + ride->track_colour_additional[index] = value; + gfx_invalidate_screen(); + break; + case 2: + *((uint8*)(&ride->vehicle_colours[index])) = value; + RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + break; + case 3: + *((uint8*)(&ride->vehicle_colours[index]) + 1) = value; + RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + break; + case 4: + ride->track_colour_supports[index] = value; + gfx_invalidate_screen(); + break; + case 5: + ride->colour_scheme_type &= ~(RIDE_COLOUR_SCHEME_DIFFERENT_PER_TRAIN | RIDE_COLOUR_SCHEME_DIFFERENT_PER_CAR); + ride->colour_scheme_type |= value; + for(int i = 1; i < countof(ride->vehicle_colours); i++){ + 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); + break; + case 6: + ride->entrance_style = value; + RCT2_GLOBAL(0x01358840, uint8) = value; + gfx_invalidate_screen(); + break; + case 7: + ride->vehicle_colours_extended[index] = value; + RCT2_CALLPROC_X(0x006DE102, 0, 0, 0, ride_id, 0, 0, 0); + break; + } + window_invalidate_by_number(WC_RIDE, ride_id); + } + *ebx = 0; +} + bool ride_type_has_flag(int rideType, int flag) { return (RCT2_GLOBAL(RCT2_ADDRESS_RIDE_FLAGS + (rideType * 8), uint32) & flag) != 0; diff --git a/src/ride/ride.h b/src/ride/ride.h index f9d50b07aa..ce89235380 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -766,6 +766,7 @@ void game_command_set_ride_name(int *eax, int *ebx, int *ecx, int *edx, int *esi void game_command_set_ride_setting(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); int ride_get_refund_price(int ride_id); void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); int get_var_10E_unk_1(rct_ride* ride); int get_var_10E_unk_2(rct_ride* ride); diff --git a/src/windows/loadsave.c b/src/windows/loadsave.c index 0ffdb04abd..d5bfe35e8d 100644 --- a/src/windows/loadsave.c +++ b/src/windows/loadsave.c @@ -605,7 +605,7 @@ static void window_loadsave_select(rct_window *w, const char *path) if (scenario_save((char*)path, gConfigGeneral.save_plugin_data ? 1 : 0)) { window_close(w); - game_do_command(0, 1047, 0, -1, GAME_COMMAND_0, 0, 0); + game_do_command(0, 1047, 0, -1, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); gfx_invalidate_screen(); } else { diff --git a/src/windows/ride.c b/src/windows/ride.c index 03e02001a7..df6f385f26 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -3808,22 +3808,22 @@ static void window_ride_colour_dropdown() window_invalidate(w); break; case WIDX_TRACK_MAIN_COLOUR: - game_do_command(0, (0 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, *((uint16*)&w->var_494), 0); + game_do_command(0, (0 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_APPEARANCE, *((uint16*)&w->var_494), 0); break; case WIDX_TRACK_ADDITIONAL_COLOUR: - game_do_command(0, (1 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, *((uint16*)&w->var_494), 0); + game_do_command(0, (1 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_APPEARANCE, *((uint16*)&w->var_494), 0); break; case WIDX_TRACK_SUPPORT_COLOUR: - game_do_command(0, (4 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, *((uint16*)&w->var_494), 0); + game_do_command(0, (4 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_APPEARANCE, *((uint16*)&w->var_494), 0); break; case WIDX_MAZE_STYLE_DROPDOWN: - game_do_command(0, (4 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, *((uint16*)&w->var_494), 0); + game_do_command(0, (4 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_APPEARANCE, *((uint16*)&w->var_494), 0); break; case WIDX_ENTRANCE_STYLE_DROPDOWN: - game_do_command(0, (6 << 8) | 1, 0, (window_ride_entrance_style_list[dropdownIndex] << 8) | w->number, GAME_COMMAND_0, 0, 0); + game_do_command(0, (6 << 8) | 1, 0, (window_ride_entrance_style_list[dropdownIndex] << 8) | w->number, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); break; case WIDX_VEHICLE_COLOUR_SCHEME_DROPDOWN: - game_do_command(0, (5 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, 0, 0); + game_do_command(0, (5 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_APPEARANCE, 0, 0); w->var_48C = 0; break; case WIDX_VEHICLE_COLOUR_INDEX_DROPDOWN: @@ -3831,13 +3831,13 @@ static void window_ride_colour_dropdown() window_invalidate(w); break; case WIDX_VEHICLE_MAIN_COLOUR: - game_do_command(0, (2 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, w->var_48C, 0); + game_do_command(0, (2 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_APPEARANCE, w->var_48C, 0); break; case WIDX_VEHICLE_ADDITIONAL_COLOUR_1: - game_do_command(0, (3 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, w->var_48C, 0); + game_do_command(0, (3 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_APPEARANCE, w->var_48C, 0); break; case WIDX_VEHICLE_ADDITIONAL_COLOUR_2: - game_do_command(0, (7 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_0, w->var_48C, 0); + game_do_command(0, (7 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_APPEARANCE, w->var_48C, 0); break; } }