From c3d5d5f6c25c8a60ea3ee676c840404dcc37afa4 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Mon, 29 Jun 2015 16:14:56 +0100 Subject: [PATCH] implement game_command_set_ride_vehicles --- src/game.c | 4 +- src/localisation/string_ids.h | 3 + src/ride/ride.c | 132 ++++++++++++++++++++++++++++++++-- src/ride/ride.h | 11 +++ src/windows/ride.c | 10 +-- 5 files changed, 146 insertions(+), 14 deletions(-) diff --git a/src/game.c b/src/game.c index 1a765677b1..799c6481d6 100644 --- a/src/game.c +++ b/src/game.c @@ -915,7 +915,7 @@ static uint32 game_do_command_table[58] = { 0x006B3F0F, 0, 0, - 0x006B52D4, + 0, 0, // 10 0, 0x006660A8, @@ -978,7 +978,7 @@ static GAME_COMMAND_POINTER* new_game_command_table[58] = { game_command_emptysub, game_command_demolish_ride, game_command_set_ride_status, - game_command_emptysub, + game_command_set_ride_vehicles, game_command_set_ride_name, // 10 game_command_set_ride_setting, game_command_emptysub, diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 0621ba8706..922a4b069f 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -252,6 +252,9 @@ enum { STR_OPEN_PARK = 1014, STR_CANT_CHANGE_OPERATING_MODE = 1017, + STR_RIDE_SET_VEHICLE_TYPE_FAIL = 1018, + STR_RIDE_SET_VEHICLE_SET_NUM_CARS_PER_TRAIN_FAIL = 1019, + STR_RIDE_SET_VEHICLE_SET_NUM_TRAINS_FAIL = 1020, STR_LOCATE_SUBJECT_TIP = 1027, STR_OFF_EDGE_OF_MAP = 1028, diff --git a/src/ride/ride.c b/src/ride/ride.c index 9961362712..64b8e3d5a7 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -5219,10 +5219,10 @@ void ride_update_max_vehicles(int rideIndex) numCarsPerTrain = min(ride->var_0CB, maxCarsPerTrain); numVehicles = min(ride->var_0CA, maxNumTrains); } else { - ride->max_trains = rideEntry->cars_per_flat_ride; - ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); - numCarsPerTrain = rideEntry->max_cars_in_train; - numVehicles = min(ride->var_0CA, rideEntry->cars_per_flat_ride); + ride->max_trains = rideEntry->cars_per_flat_ride; + ride->min_max_cars_per_train = rideEntry->max_cars_in_train | (rideEntry->min_cars_in_train << 4); + numCarsPerTrain = rideEntry->max_cars_in_train; + numVehicles = min(ride->var_0CA, rideEntry->cars_per_flat_ride); } // Refresh new current num vehicles / num cars per vehicle @@ -5231,4 +5231,126 @@ void ride_update_max_vehicles(int rideIndex) ride->num_vehicles = numVehicles; window_invalidate_by_number(WC_RIDE, rideIndex); } -} \ No newline at end of file +} + +static void sub_6DE52C(rct_ride *ride) +{ + RCT2_CALLPROC_X(0x006DE52C, 0, 0, 0, 0, (int)ride, 0, 0); +} + +void ride_set_ride_entry(int rideIndex, int rideEntry) +{ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_SET_VEHICLE_TYPE_FAIL; + game_do_command( + 0, + GAME_COMMAND_FLAG_APPLY | (RIDE_SET_VEHICLES_COMMAND_TYPE_RIDE_ENTRY << 8), + 0, + (rideEntry << 8) | rideIndex, + GAME_COMMAND_SET_RIDE_VEHICLES, + 0, + 0 + ); +} + +void ride_set_num_vehicles(int rideIndex, int numVehicles) +{ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_SET_VEHICLE_SET_NUM_TRAINS_FAIL; + game_do_command( + 0, + GAME_COMMAND_FLAG_APPLY | (RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_TRAINS << 8), + 0, + (numVehicles << 8) | rideIndex, + GAME_COMMAND_SET_RIDE_VEHICLES, + 0, + 0 + ); +} + +void ride_set_num_cars_per_vehicle(int rideIndex, int numCarsPerVehicle) +{ + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_SET_VEHICLE_SET_NUM_CARS_PER_TRAIN_FAIL; + game_do_command( + 0, + GAME_COMMAND_FLAG_APPLY | (RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_CARS_PER_TRAIN << 8), + 0, + (numCarsPerVehicle << 8) | rideIndex, + GAME_COMMAND_SET_RIDE_VEHICLES, + 0, + 0 + ); +} + +/** + * + * rct2: 0x006B52D4 + */ +void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp) +{ + rct_ride *ride; + rct_ride_type *rideEntry; + rct_window *w; + int rideIndex, commandType, value; + + commandType = (*ebx >> 8) & 0xFF; + rideIndex = *edx & 0xFF; + value = (*edx >> 8) & 0xFF; + + ride = GET_RIDE(rideIndex); + + RCT2_GLOBAL(RCT2_ADDRESS_NEXT_EXPENDITURE_TYPE, uint8) = RCT_EXPENDITURE_TYPE_PARK_ENTRANCE_TICKETS; + + if (ride->lifecycle_flags & RIDE_LIFECYCLE_BROKEN_DOWN) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_HAS_BROKEN_DOWN_AND_REQUIRES_FIXING; + *ebx = MONEY32_UNDEFINED; + return; + } + + if (ride->status != RIDE_STATUS_CLOSED) { + RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id) = STR_MUST_BE_CLOSED_FIRST; + *ebx = MONEY32_UNDEFINED; + return; + } + + if (!(*ebx & GAME_COMMAND_FLAG_APPLY)) { + *ebx = 0; + return; + } + + sub_6B59C6(rideIndex); + ride_clear_for_construction(rideIndex); + ride_remove_peeps(rideIndex); + ride->var_1CA = 100; + if (ride->type != RIDE_TYPE_ENTERPRISE) { + gfx_invalidate_screen(); + } + + switch (commandType) { + case RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_TRAINS: + ride->var_0CA = value; + if (ride->type != RIDE_TYPE_SPACE_RINGS) { + gfx_invalidate_screen(); + } + break; + case RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_CARS_PER_TRAIN: + rideEntry = GET_RIDE_ENTRY(ride->subtype); + value = clamp(rideEntry->min_cars_in_train, value, rideEntry->max_cars_in_train); + ride->var_0CB = value; + break; + case RIDE_SET_VEHICLES_COMMAND_TYPE_RIDE_ENTRY: + ride->subtype = value; + sub_6DE52C(ride); + break; + } + + ride->num_circuits = 1; + ride_update_max_vehicles(rideIndex); + + w = window_find_by_number(WC_RIDE, rideIndex); + if (w != NULL) { + if (w->page == 4) { + w->var_48C = 0; + } + window_invalidate(w); + } + *ebx = 0; +} diff --git a/src/ride/ride.h b/src/ride/ride.h index 05bce45c8d..441290907c 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -773,6 +773,12 @@ enum { RIDE_CONSTRUCTION_STATE_8 }; +enum { + RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_TRAINS, + RIDE_SET_VEHICLES_COMMAND_TYPE_NUM_CARS_PER_TRAIN, + RIDE_SET_VEHICLES_COMMAND_TYPE_RIDE_ENTRY +}; + #define MAX_RIDES 255 #define MAX_RIDE_MEASUREMENTS 8 @@ -941,4 +947,9 @@ void ride_fix_breakdown(int rideIndex, int reliabilityIncreaseFactor); void ride_entry_get_train_layout(int rideEntryIndex, int numCarsPerTrain, uint8 *trainLayout); void ride_update_max_vehicles(int rideIndex); +void ride_set_ride_entry(int rideIndex, int rideEntry); +void ride_set_num_vehicles(int rideIndex, int numVehicles); +void ride_set_num_cars_per_vehicle(int rideIndex, int numCarsPerVehicle); +void game_command_set_ride_vehicles(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); + #endif diff --git a/src/windows/ride.c b/src/windows/ride.c index c7e2f8b137..fbe5ddf64d 100644 --- a/src/windows/ride.c +++ b/src/windows/ride.c @@ -2463,17 +2463,13 @@ static void window_ride_vehicle_dropdown() switch (widgetIndex) { case WIDX_VEHICLE_TYPE_DROPDOWN: dropdownIndex = (gDropdownItemsArgs[dropdownIndex] >> 16) & 0xFFFF; - - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1018; - game_do_command(0, (2 << 8) | 1, 0, (dropdownIndex << 8) | w->number, GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); + ride_set_ride_entry(w->number, dropdownIndex); break; case WIDX_VEHICLE_TRAINS_DROPDOWN: - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1020; - game_do_command(0, (0 << 8) | 1, 0, ((dropdownIndex + 1) << 8) | w->number, GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); + ride_set_num_vehicles(w->number, dropdownIndex + 1); break; case WIDX_VEHICLE_CARS_PER_TRAIN_DROPDOWN: - RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1019; - game_do_command(0, (1 << 8) | 1, 0, ((rideEntry->min_cars_in_train + dropdownIndex) << 8) | w->number, GAME_COMMAND_SET_RIDE_VEHICLES, 0, 0); + ride_set_num_cars_per_vehicle(w->number, rideEntry->min_cars_in_train + dropdownIndex); break; } }