diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 8d6b98f583..ce2a16a2ea 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -4002,6 +4002,7 @@ STR_5660 :Modify Groups STR_5661 :Set Player Group STR_5662 :N/A STR_5663 :Clear Landscape +STR_5664 :Cheat STR_5701 :{WINDOW_COLOUR_2}Last action: {BLACK}{STRINGID} STR_5702 :{SMALLFONT}{BLACK}Locate player's most recent action STR_5703 :Can't kick the host diff --git a/src/cheats.c b/src/cheats.c index 820bdda7eb..4f4a0afe16 100644 --- a/src/cheats.c +++ b/src/cheats.c @@ -1,4 +1,11 @@ #include "cheats.h" +#include "config.h" +#include "game.h" +#include "interface/window.h" +#include "network/network.h" +#include "world/climate.h" +#include "world/footpath.h" +#include "world/scenery.h" bool gCheatsSandboxMode = false; bool gCheatsDisableClearanceChecks = false; @@ -13,6 +20,381 @@ bool gCheatsBuildInPauseMode = false; bool gCheatsIgnoreRideIntensity = false; bool gCheatsDisableVandalism = false; +int park_rating_spinner_value; + +#pragma region Cheat functions + +static void cheat_set_grass_length(int length) +{ + int x, y; + rct_map_element *mapElement; + + for (y = 0; y < 256; y++) { + for (x = 0; x < 256; x++) { + mapElement = map_get_surface_element_at(x, y); + if (!(mapElement->properties.surface.ownership & OWNERSHIP_OWNED)) + continue; + + if (map_element_get_terrain(mapElement) != TERRAIN_GRASS) + continue; + + if ((mapElement->properties.surface.terrain & 0x1F) > 0) + continue; + + mapElement->properties.surface.grass_length = length; + } + } + + gfx_invalidate_screen(); +} + +static void cheat_water_plants() +{ + map_element_iterator it; + + map_element_iterator_begin(&it); + do { + if (map_element_get_type(it.element) == MAP_ELEMENT_TYPE_SCENERY) { + it.element->properties.scenery.age = 0; + } + } while (map_element_iterator_next(&it)); + + gfx_invalidate_screen(); +} + +static void cheat_fix_vandalism() +{ + map_element_iterator it; + + map_element_iterator_begin(&it); + do { + if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_PATH) + continue; + + if (!footpath_element_has_path_scenery(it.element)) + continue; + + it.element->flags &= ~MAP_ELEMENT_FLAG_BROKEN; + } while (map_element_iterator_next(&it)); + + gfx_invalidate_screen(); +} + +static void cheat_remove_litter() +{ + rct_litter* litter; + uint16 spriteIndex, nextSpriteIndex; + + for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_LITTER, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) { + litter = &(g_sprite_list[spriteIndex].litter); + nextSpriteIndex = litter->next; + sprite_remove((rct_sprite*)litter); + } + + map_element_iterator it; + rct_scenery_entry *sceneryEntry; + + map_element_iterator_begin(&it); + do { + if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_PATH) + continue; + + if (!footpath_element_has_path_scenery(it.element)) + continue; + + sceneryEntry = g_pathBitSceneryEntries[footpath_element_get_path_scenery_index(it.element)]; + if(sceneryEntry->path_bit.var_06 & (1 << 0)) + it.element->properties.path.addition_status = 0xFF; + + } while (map_element_iterator_next(&it)); + + gfx_invalidate_screen(); +} + +static void cheat_fix_rides() +{ + int rideIndex; + rct_ride *ride; + rct_peep *mechanic; + + FOR_ALL_RIDES(rideIndex, ride) + { + if ((ride->mechanic_status != RIDE_MECHANIC_STATUS_FIXING) && (ride->lifecycle_flags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN))) + { + mechanic = ride_get_assigned_mechanic(ride); + + if (mechanic != NULL){ + remove_peep_from_ride(mechanic); + } + + ride_fix_breakdown(rideIndex, 0); + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; + } + } +} + +static void cheat_renew_rides() +{ + int i; + rct_ride *ride; + + FOR_ALL_RIDES(i, ride) + { + // Set build date to current date (so the ride is brand new) + ride->build_date = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); + // Set reliability to 100 + ride->reliability = (100 << 8); + } + window_invalidate_by_class(WC_RIDE); +} + +static void cheat_make_destructible() +{ + int i; + rct_ride *ride; + FOR_ALL_RIDES(i, ride) + { + if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE) + ride->lifecycle_flags&=~RIDE_LIFECYCLE_INDESTRUCTIBLE; + if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) + ride->lifecycle_flags&=~RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK; + } + window_invalidate_by_class(WC_RIDE); +} + +static void cheat_reset_crash_status() +{ + int i; + rct_ride *ride; + + FOR_ALL_RIDES(i, ride){ + //reset crash status + if (ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED) + ride->lifecycle_flags&=~RIDE_LIFECYCLE_CRASHED; + //reset crash history + ride->last_crash_type=RIDE_CRASH_TYPE_NONE; + } + window_invalidate_by_class(WC_RIDE); +} + +static void cheat_10_minute_inspections() +{ + int i; + rct_ride *ride; + + FOR_ALL_RIDES(i, ride) { + // Set inspection interval to 10 minutes + ride->inspection_interval = RIDE_INSPECTION_EVERY_10_MINUTES; + } + window_invalidate_by_class(WC_RIDE); +} + +static void cheat_increase_money(money32 amount) +{ + money32 currentMoney; + + currentMoney = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32)); + if (currentMoney < INT_MAX - amount) + currentMoney += amount; + else + currentMoney = INT_MAX; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32) = ENCRYPT_MONEY(currentMoney); + + window_invalidate_by_class(WC_FINANCES); + window_invalidate_by_class(WC_BOTTOM_TOOLBAR); +} + +static void cheat_clear_loan() +{ + // First give money + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_INCREASEMONEY, RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32), GAME_COMMAND_CHEAT, 0, 0); + + // Then pay the loan + money32 newLoan; + newLoan = MONEY(0, 00); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, newLoan, GAME_COMMAND_SET_CURRENT_LOAN, 0, 0); +} + +static void cheat_generate_guests(int count) +{ + int i; + + for (i = 0; i < count; i++) + generate_new_guest(); + + window_invalidate_by_class(WC_BOTTOM_TOOLBAR); +} + +static void cheat_set_guest_parameter(int parameter, int value) +{ + int spriteIndex; + rct_peep *peep; + + FOR_ALL_GUESTS(spriteIndex, peep) { + switch(parameter) { + case GUEST_PARAMETER_HAPPINESS: + peep->happiness = value; + break; + case GUEST_PARAMETER_ENERGY: + peep->energy = value; + break; + case GUEST_PARAMETER_HUNGER: + peep->hunger = value; + break; + case GUEST_PARAMETER_THIRST: + peep->thirst = value; + break; + case GUEST_PARAMETER_NAUSEA: + peep->nausea = value; + break; + case GUEST_PARAMETER_NAUSEA_TOLERANCE: + peep->nausea_tolerance = value; + break; + case GUEST_PARAMETER_BATHROOM: + peep->bathroom = value; + break; + case GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY: + peep->intensity = (15 << 4) | value; + break; + } + peep_update_sprite_type(peep); + } + +} + +static void cheat_give_all_guests(int object) +{ + int spriteIndex; + rct_peep *peep; + + FOR_ALL_GUESTS(spriteIndex, peep) { + switch(object) + { + case OBJECT_MONEY: + peep->cash_in_pocket = MONEY(1000,00); + break; + case OBJECT_PARK_MAP: + peep->item_standard_flags |= PEEP_ITEM_MAP; + break; + case OBJECT_BALLOON: + peep->item_standard_flags |= PEEP_ITEM_BALLOON; + peep->balloon_colour=scenario_rand_max(31); + peep_update_sprite_type(peep); + break; + case OBJECT_UMBRELLA: + peep->item_standard_flags |= PEEP_ITEM_UMBRELLA; + peep->umbrella_colour=scenario_rand_max(31); + peep_update_sprite_type(peep); + break; + } + } + window_invalidate_by_class(WC_PEEP); +} + +static void cheat_remove_all_guests() +{ + rct_peep *peep; + uint16 spriteIndex, nextSpriteIndex; + + for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_PEEP, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) { + peep = &(g_sprite_list[spriteIndex].peep); + nextSpriteIndex = peep->next; + if (peep->type == PEEP_TYPE_GUEST) { + peep_remove(peep); + } + } + + int i; + rct_ride *ride; + + FOR_ALL_RIDES(i, ride) + { + ride_clear_for_construction(i); + ride_set_status(i, RIDE_STATUS_CLOSED); + + for(int i=0;i<4;i++) { + ride->queue_length[i] = 0; + ride->last_peep_in_queue[i]=0xFFFF; + } + } + window_invalidate_by_class(WC_RIDE); + gfx_invalidate_screen(); +} + +static void cheat_explode_guests() +{ + int sprite_index; + rct_peep *peep; + + FOR_ALL_GUESTS(sprite_index, peep) { + if (scenario_rand_max(6) == 0) { + peep->flags |= PEEP_FLAGS_EXPLODE; + } + } +} + +static void cheat_set_staff_speed(uint8 value) +{ + uint16 spriteIndex; + rct_peep *peep; + + FOR_ALL_STAFF(spriteIndex, peep) { + peep->energy = value; + peep->energy_growth_rate = value; + } +} + +#pragma endregion + +void game_command_cheat(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) +{ + int cheat = *ecx; + if (*ebx & GAME_COMMAND_FLAG_APPLY) { + switch (cheat) { + case CHEAT_SANDBOXMODE: gCheatsSandboxMode = !gCheatsSandboxMode; window_invalidate_by_class(WC_MAP); window_invalidate_by_class(WC_FOOTPATH); break; + case CHEAT_DISABLECLEARANCECHECKS: gCheatsDisableClearanceChecks = !gCheatsDisableClearanceChecks; break; + case CHEAT_DISABLESUPPORTLIMITS: gCheatsDisableSupportLimits = !gCheatsDisableSupportLimits; break; + case CHEAT_SHOWALLOPERATINGMODES: gCheatsShowAllOperatingModes = !gCheatsShowAllOperatingModes; break; + case CHEAT_SHOWVEHICLESFROMOTHERTRACKTYPES: gCheatsShowVehiclesFromOtherTrackTypes = !gCheatsShowVehiclesFromOtherTrackTypes; break; + case CHEAT_FASTLIFTHILL: gCheatsFastLiftHill = !gCheatsFastLiftHill; break; + case CHEAT_DISABLEBRAKESFAILURE: gCheatsDisableBrakesFailure = !gCheatsDisableBrakesFailure; break; + case CHEAT_DISABLEALLBREAKDOWNS: gCheatsDisableAllBreakdowns = !gCheatsDisableAllBreakdowns; break; + case CHEAT_UNLOCKALLPRICES: gCheatsUnlockAllPrices = !gCheatsUnlockAllPrices; window_invalidate_by_class(WC_RIDE); window_invalidate_by_class(WC_PARK_INFORMATION); break; + case CHEAT_BUILDINPAUSEMODE: gCheatsBuildInPauseMode = !gCheatsBuildInPauseMode; break; + case CHEAT_IGNORERIDEINTENSITY: gCheatsIgnoreRideIntensity = !gCheatsIgnoreRideIntensity; break; + case CHEAT_DISABLEVANDALISM: gCheatsDisableVandalism = !gCheatsDisableVandalism; break; + case CHEAT_INCREASEMONEY: cheat_increase_money(*edx); break; + case CHEAT_CLEARLOAN: cheat_clear_loan(); break; + case CHEAT_SETGUESTPARAMETER: cheat_set_guest_parameter(*edx, *edi); break; + case CHEAT_GENERATEGUESTS: cheat_generate_guests(*edx); break; + case CHEAT_REMOVEALLGUESTS: cheat_remove_all_guests(); break; + case CHEAT_EXPLODEGUESTS: cheat_explode_guests(); break; + case CHEAT_GIVEALLGUESTS: cheat_give_all_guests(*edx); break; + case CHEAT_SETGRASSLENGTH: cheat_set_grass_length(*edx); break; + case CHEAT_WATERPLANTS: cheat_water_plants(); break; + case CHEAT_FIXVANDALISM: cheat_fix_vandalism(); break; + case CHEAT_REMOVELITTER: cheat_remove_litter(); break; + case CHEAT_SETSTAFFSPEED: cheat_set_staff_speed(*edx); break; + case CHEAT_RENEWRIDES: cheat_renew_rides(); break; + case CHEAT_MAKEDESTRUCTIBLE: cheat_make_destructible(); break; + case CHEAT_FIXRIDES: cheat_fix_rides(); break; + case CHEAT_RESETCRASHSTATUS: cheat_reset_crash_status(); break; + case CHEAT_10MINUTEINSPECTIONS: cheat_10_minute_inspections(); break; + case CHEAT_WINSCENARIO: scenario_success(); break; + case CHEAT_FORCEWEATHER: climate_force_weather(*edx); break; + case CHEAT_FREEZECLIMATE: toggle_climate_lock(); break; + case CHEAT_OPENCLOSEPARK: park_set_open(park_is_open() ? 0 : 1); break; + case CHEAT_HAVEFUN: RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) = OBJECTIVE_HAVE_FUN; break; + case CHEAT_SETFORCEDPARKRATING: if(*edx > -1) { park_rating_spinner_value = *edx; } set_forced_park_rating(*edx); break; + } + if (network_get_mode() == NETWORK_MODE_NONE) { + config_save_default(); + } + window_invalidate_by_class(WC_CHEATS); + } + *ebx = 0; +} + void cheats_reset() { gCheatsSandboxMode = false; diff --git a/src/cheats.h b/src/cheats.h index 0637d4778d..923e6ca99a 100644 --- a/src/cheats.h +++ b/src/cheats.h @@ -36,6 +36,69 @@ extern bool gCheatsBuildInPauseMode; extern bool gCheatsIgnoreRideIntensity; extern bool gCheatsDisableVandalism; +enum { + CHEAT_SANDBOXMODE, + CHEAT_DISABLECLEARANCECHECKS, + CHEAT_DISABLESUPPORTLIMITS, + CHEAT_SHOWALLOPERATINGMODES, + CHEAT_SHOWVEHICLESFROMOTHERTRACKTYPES, + CHEAT_FASTLIFTHILL, + CHEAT_DISABLEBRAKESFAILURE, + CHEAT_DISABLEALLBREAKDOWNS, + CHEAT_UNLOCKALLPRICES, + CHEAT_BUILDINPAUSEMODE, + CHEAT_IGNORERIDEINTENSITY, + CHEAT_DISABLEVANDALISM, + CHEAT_INCREASEMONEY, + CHEAT_CLEARLOAN, + CHEAT_SETGUESTPARAMETER, + CHEAT_GENERATEGUESTS, + CHEAT_REMOVEALLGUESTS, + CHEAT_EXPLODEGUESTS, + CHEAT_GIVEALLGUESTS, + CHEAT_SETGRASSLENGTH, + CHEAT_WATERPLANTS, + CHEAT_FIXVANDALISM, + CHEAT_REMOVELITTER, + CHEAT_SETSTAFFSPEED, + CHEAT_RENEWRIDES, + CHEAT_MAKEDESTRUCTIBLE, + CHEAT_FIXRIDES, + CHEAT_RESETCRASHSTATUS, + CHEAT_10MINUTEINSPECTIONS, + CHEAT_WINSCENARIO, + CHEAT_FORCEWEATHER, + CHEAT_FREEZECLIMATE, + CHEAT_OPENCLOSEPARK, + CHEAT_HAVEFUN, + CHEAT_SETFORCEDPARKRATING +}; + +enum { + GUEST_PARAMETER_HAPPINESS, + GUEST_PARAMETER_ENERGY, + GUEST_PARAMETER_HUNGER, + GUEST_PARAMETER_THIRST, + GUEST_PARAMETER_NAUSEA, + GUEST_PARAMETER_NAUSEA_TOLERANCE, + GUEST_PARAMETER_BATHROOM, + GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY +}; + +enum { + OBJECT_MONEY, + OBJECT_PARK_MAP, + OBJECT_BALLOON, + OBJECT_UMBRELLA +}; + +#define CHEATS_MONEY_INCREMENT MONEY(5000,00) +#define CHEATS_TRAM_INCREMENT 250 + +extern int park_rating_spinner_value; + +void game_command_cheat(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); + void cheats_reset(); #endif diff --git a/src/game.c b/src/game.c index 3917b22f7b..298869c979 100644 --- a/src/game.c +++ b/src/game.c @@ -20,6 +20,7 @@ #include "addresses.h" #include "audio/audio.h" +#include "cheats.h" #include "config.h" #include "game.h" #include "editor.h" @@ -853,6 +854,20 @@ int game_load_network(SDL_RWops* rw) // Read other data not in normal save files RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) = SDL_ReadLE32(rw); + _guestGenerationProbability = SDL_ReadLE32(rw); + _suggestedGuestMaximum = SDL_ReadLE32(rw); + gCheatsSandboxMode = SDL_ReadU8(rw); + gCheatsDisableClearanceChecks = SDL_ReadU8(rw); + gCheatsDisableSupportLimits = SDL_ReadU8(rw); + gCheatsShowAllOperatingModes = SDL_ReadU8(rw); + gCheatsShowVehiclesFromOtherTrackTypes = SDL_ReadU8(rw); + gCheatsFastLiftHill = SDL_ReadU8(rw); + gCheatsDisableBrakesFailure = SDL_ReadU8(rw); + gCheatsDisableAllBreakdowns = SDL_ReadU8(rw); + gCheatsUnlockAllPrices = SDL_ReadU8(rw); + gCheatsBuildInPauseMode = SDL_ReadU8(rw); + gCheatsIgnoreRideIntensity = SDL_ReadU8(rw); + gCheatsDisableVandalism = SDL_ReadU8(rw); if (!load_success){ set_load_objects_fail_reason(); @@ -1187,7 +1202,7 @@ void game_load_or_quit_no_save_prompt() } } -GAME_COMMAND_POINTER* new_game_command_table[65] = { +GAME_COMMAND_POINTER* new_game_command_table[66] = { game_command_set_ride_appearance, game_command_set_land_height, game_pause_toggle, @@ -1252,5 +1267,6 @@ GAME_COMMAND_POINTER* new_game_command_table[65] = { game_command_set_sign_style, game_command_set_player_group, game_command_modify_groups, - game_command_kick_player + game_command_kick_player, + game_command_cheat }; diff --git a/src/game.h b/src/game.h index cf88a07f0b..80fa4472d9 100644 --- a/src/game.h +++ b/src/game.h @@ -90,7 +90,8 @@ enum GAME_COMMAND { GAME_COMMAND_SET_SIGN_STYLE, GAME_COMMAND_SET_PLAYER_GROUP, GAME_COMMAND_MODIFY_GROUPS, - GAME_COMMAND_KICK_PLAYER + GAME_COMMAND_KICK_PLAYER, + GAME_COMMAND_CHEAT }; enum { @@ -116,7 +117,7 @@ int game_command_callback_get_index(GAME_COMMAND_CALLBACK_POINTER* callback); GAME_COMMAND_CALLBACK_POINTER* game_command_callback_get_callback(int index); extern int game_command_playerid; -extern GAME_COMMAND_POINTER* new_game_command_table[65]; +extern GAME_COMMAND_POINTER* new_game_command_table[66]; extern int gGameSpeed; extern float gDayNightCycle; diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index b569b4d82f..893142ad15 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2290,6 +2290,7 @@ enum { STR_ACTION_SET_PLAYER_GROUP = 5661, STR_ACTION_NA = 5662, STR_ACTION_CLEAR_LANDSCAPE = 5663, + STR_ACTION_CHEAT = 5664, STR_LAST_ACTION_RAN = 5701, STR_LOCATE_PLAYER_TIP = 5702, diff --git a/src/network/network.cpp b/src/network/network.cpp index 66f338a3f9..a4e4e09cdc 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -856,7 +856,6 @@ void Network::UpdateClient() if (error == 0) { status = NETWORK_STATUS_CONNECTED; server_connection.ResetLastPacketTime(); - cheats_reset(); Client_Send_AUTH(gConfigNetwork.player_name, ""); window_network_status_open("Authenticating..."); } @@ -1219,6 +1218,7 @@ void Network::LoadGroups() user->ToggleActionPermission(15); // Kick Player user->ToggleActionPermission(16); // Modify Groups user->ToggleActionPermission(17); // Set Player Group + user->ToggleActionPermission(18); // Cheat user->id = 2; group_list.push_back(std::move(user)); SetDefaultGroup(1); @@ -1279,14 +1279,24 @@ void Network::Server_Send_AUTH(NetworkConnection& connection) void Network::Server_Send_MAP(NetworkConnection* connection) { - int buffersize = 0x600000; - std::vector buffer(buffersize); bool RLEState = gUseRLE; gUseRLE = false; - SDL_RWops* rw = SDL_RWFromMem(&buffer[0], buffersize); + FILE* temp = tmpfile(); + if (!temp) { + log_warning("Failed to create temporary file to save map."); + return; + } + SDL_RWops* rw = SDL_RWFromFP(temp, SDL_TRUE); scenario_save_network(rw); gUseRLE = RLEState; int size = (int)SDL_RWtell(rw); + std::vector buffer(size); + SDL_RWseek(rw, 0, RW_SEEK_SET); + if (SDL_RWread(rw, &buffer[0], size, 1) == 0) { + log_warning("Failed to read temporary map file into memory."); + SDL_RWclose(rw); + return; + } size_t chunksize = 1000; size_t out_size; unsigned char *compressed = util_zlib_deflate(&buffer[0], size, &out_size); @@ -1671,62 +1681,55 @@ void Network::Client_Handle_MAP(NetworkConnection& connection, NetworkPacket& pa { uint32 size, offset; packet >> size >> offset; - if (offset > 0x600000) { - // too big + int chunksize = packet.size - packet.read; + if (chunksize <= 0) { return; - } else { - int chunksize = packet.size - packet.read; - if (chunksize <= 0) { - return; + } + if (offset + chunksize > chunk_buffer.size()) { + chunk_buffer.resize(offset + chunksize); + } + char status[256]; + sprintf(status, "Downloading map ... (%u / %u)", (offset + chunksize) / 1000, size / 1000); + window_network_status_open(status); + memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize); + if (offset + chunksize == size) { + window_network_status_close(); + bool has_to_free = false; + unsigned char *data = &chunk_buffer[0]; + size_t data_size = size; + // zlib-compressed + if (strcmp("open2_sv6_zlib", (char *)&chunk_buffer[0]) == 0) + { + log_verbose("Received zlib-compressed sv6 map"); + has_to_free = true; + size_t header_len = strlen("open2_sv6_zlib") + 1; + data = util_zlib_inflate(&chunk_buffer[header_len], size - header_len, &data_size); + if (data == NULL) + { + log_warning("Failed to decompress data sent from server."); + return; + } + } else { + log_verbose("Assuming received map is in plain sv6 format"); } - if (offset + chunksize > chunk_buffer.size()) { - chunk_buffer.resize(offset + chunksize); + SDL_RWops* rw = SDL_RWFromMem(data, data_size); + if (game_load_network(rw)) { + game_load_init(); + game_command_queue.clear(); + server_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); + server_srand0_tick = 0; + // window_network_status_open("Loaded new map from network"); + _desynchronised = false; } - char status[256]; - sprintf(status, "Downloading map ... (%u / %u)", (offset + chunksize) / 1000, size / 1000); - window_network_status_open(status); - memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize); - if (offset + chunksize == size) { - window_network_status_close(); - bool has_to_free = false; - unsigned char *data = &chunk_buffer[0]; - size_t data_size = size; - // zlib-compressed - if (strcmp("open2_sv6_zlib", (char *)&chunk_buffer[0]) == 0) - { - log_warning("Received zlib-compressed sv6 map"); - has_to_free = true; - size_t header_len = strlen("open2_sv6_zlib") + 1; - data = util_zlib_inflate(&chunk_buffer[header_len], size - header_len, &data_size); - if (data == NULL) - { - log_warning("Failed to decompress data sent from server."); - return; - } - } else { - log_warning("Assuming received map is in plain sv6 format"); - } - - SDL_RWops* rw = SDL_RWFromMem(data, data_size); - if (game_load_network(rw)) { - game_load_init(); - game_command_queue.clear(); - server_tick = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32); - server_srand0_tick = 0; - // window_network_status_open("Loaded new map from network"); - _desynchronised = false; - } - else - { - //Something went wrong, game is not loaded. Return to main screen. - game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0); - } - - SDL_RWclose(rw); - if (has_to_free) - { - free(data); - } + else + { + //Something went wrong, game is not loaded. Return to main screen. + game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0); + } + SDL_RWclose(rw); + if (has_to_free) + { + free(data); } } } @@ -2029,9 +2032,9 @@ rct_xyz16 network_get_player_last_action_coord(unsigned int index) return gNetwork.player_list[index]->last_action_coord; } -void network_set_player_last_action_coord(int index, rct_xyz16 coord) +void network_set_player_last_action_coord(unsigned int index, rct_xyz16 coord) { - if (index >= 0 && index < gNetwork.player_list.size()) { + if (index < gNetwork.player_list.size()) { gNetwork.player_list[index]->last_action_coord = coord; } } @@ -2345,7 +2348,7 @@ void network_add_player_money_spent(unsigned int index, money32 cost) { } int network_get_player_last_action(unsigned int index, int time) { return -999; } void network_set_player_last_action(unsigned int index, int command) { } rct_xyz16 network_get_player_last_action_coord(unsigned int index) { return {0, 0, 0}; } -void network_set_player_last_action_coord(int index, rct_xyz16 coord) { } +void network_set_player_last_action_coord(unsigned int index, rct_xyz16 coord) { } unsigned int network_get_player_commands_ran(unsigned int index) { return 0; } int network_get_player_index(uint8 id) { return -1; } uint8 network_get_player_group(unsigned int index) { return 0; } diff --git a/src/network/network.h b/src/network/network.h index 29f764b567..dd88198e6f 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -68,7 +68,7 @@ extern "C" { // This define specifies which version of network stream current build uses. // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -#define NETWORK_STREAM_VERSION "0" +#define NETWORK_STREAM_VERSION "1" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION #ifdef __WINDOWS__ @@ -199,7 +199,8 @@ public: {STR_ACTION_PARK_FUNDING, {GAME_COMMAND_SET_CURRENT_LOAN, GAME_COMMAND_SET_RESEARCH_FUNDING, GAME_COMMAND_START_MARKETING_CAMPAIGN}}, {STR_ACTION_KICK_PLAYER, {GAME_COMMAND_KICK_PLAYER}}, {STR_ACTION_MODIFY_GROUPS, {GAME_COMMAND_MODIFY_GROUPS}}, - {STR_ACTION_SET_PLAYER_GROUP, {GAME_COMMAND_SET_PLAYER_GROUP}} + {STR_ACTION_SET_PLAYER_GROUP, {GAME_COMMAND_SET_PLAYER_GROUP}}, + {STR_ACTION_CHEAT, {GAME_COMMAND_CHEAT}} }; }; @@ -437,7 +438,7 @@ void network_add_player_money_spent(unsigned int index, money32 cost); int network_get_player_last_action(unsigned int index, int time); void network_set_player_last_action(unsigned int index, int command); rct_xyz16 network_get_player_last_action_coord(unsigned int index); -void network_set_player_last_action_coord(int index, rct_xyz16 coord); +void network_set_player_last_action_coord(unsigned int index, rct_xyz16 coord); unsigned int network_get_player_commands_ran(unsigned int index); int network_get_player_index(uint8 id); uint8 network_get_player_group(unsigned int index); diff --git a/src/peep/peep.c b/src/peep/peep.c index 108443b4d9..74bbdc424b 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -7206,7 +7206,7 @@ static uint16 sub_69A997(sint16 x, sint16 y, uint8 z, uint8 counter, uint16 scor do { edges &= ~(1 << test_edge); - int saved_f1aedc = RCT2_GLOBAL(0x00F1AEDC, int); + int saved_f1aedc = *RCT2_ADDRESS(0x00F1AEDC, int); uint8 height = z; RCT2_GLOBAL(0x00F1AEDE, sint16) = 0; if (footpath_element_is_sloped(path) && @@ -7214,7 +7214,7 @@ static uint16 sub_69A997(sint16 x, sint16 y, uint8 z, uint8 counter, uint16 scor height += 2; } score = sub_69A997(x, y, height, counter, score, test_edge); - RCT2_GLOBAL(0x00F1AEDC, int) = saved_f1aedc; + *RCT2_ADDRESS(0x00F1AEDC, int) = saved_f1aedc; } while ((test_edge = bitscanforward(edges)) != -1); return score; @@ -7265,7 +7265,7 @@ static int guest_pathfind_choose_direction(sint16 x, sint16 y, uint8 z, rct_peep for (int test_edge = chosen_edge; test_edge != -1; test_edge = bitscanforward(edges)) { edges &= ~(1 << test_edge); uint8 height = z; - int saved_f1aedc = RCT2_GLOBAL(0x00F1AEDC, int); + int saved_f1aedc = *RCT2_ADDRESS(0x00F1AEDC, int); if (footpath_element_is_sloped(dest_map_element) && footpath_element_get_slope_direction(dest_map_element) == test_edge) height += 0x2; @@ -7274,7 +7274,7 @@ static int guest_pathfind_choose_direction(sint16 x, sint16 y, uint8 z, rct_peep RCT2_GLOBAL(0x00F1AED4, int) = RCT2_GLOBAL(0x00F1AED8, int); RCT2_GLOBAL(0x00F1AEDE, uint16) = 0; uint16 score = sub_69A997(x, y, height, 0, 0xFFFF, test_edge); - RCT2_GLOBAL(0x00F1AEDC, int) = saved_f1aedc; + *RCT2_ADDRESS(0x00F1AEDC, int) = saved_f1aedc; if (score < best_score || (score == best_score && RCT2_GLOBAL(0x00F1AED3, uint8) < best_sub)) { chosen_edge = test_edge; diff --git a/src/scenario.c b/src/scenario.c index 040408b39d..725775f508 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -19,6 +19,7 @@ *****************************************************************************/ #include "addresses.h" +#include "cheats.h" #include "config.h" #include "game.h" #include "world/climate.h" @@ -1084,13 +1085,32 @@ int scenario_save_network(SDL_RWops* rw) memcpy(s6->map_elements, (void*)0x00F663B8, 0x180000); memcpy(&s6->dword_010E63B8, (void*)0x010E63B8, 0x2E8570); + safe_strcpy(s6->scenario_filename, _scenarioFileName, sizeof(s6->scenario_filename)); + scenario_fix_ghosts(s6); + game_convert_strings_to_rct2(s6); scenario_save_s6(rw, s6); free(s6); + reset_loaded_objects(); + // Write other data not in normal save files SDL_WriteLE32(rw, RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32)); + SDL_WriteLE32(rw, _guestGenerationProbability); + SDL_WriteLE32(rw, _suggestedGuestMaximum); + SDL_WriteU8(rw, gCheatsSandboxMode); + SDL_WriteU8(rw, gCheatsDisableClearanceChecks); + SDL_WriteU8(rw, gCheatsDisableSupportLimits); + SDL_WriteU8(rw, gCheatsShowAllOperatingModes); + SDL_WriteU8(rw, gCheatsShowVehiclesFromOtherTrackTypes); + SDL_WriteU8(rw, gCheatsFastLiftHill); + SDL_WriteU8(rw, gCheatsDisableBrakesFailure); + SDL_WriteU8(rw, gCheatsDisableAllBreakdowns); + SDL_WriteU8(rw, gCheatsUnlockAllPrices); + SDL_WriteU8(rw, gCheatsBuildInPauseMode); + SDL_WriteU8(rw, gCheatsIgnoreRideIntensity); + SDL_WriteU8(rw, gCheatsDisableVandalism); gfx_invalidate_screen(); return 1; diff --git a/src/windows/cheats.c b/src/windows/cheats.c index 30e01999af..6800a8492a 100644 --- a/src/windows/cheats.c +++ b/src/windows/cheats.c @@ -30,19 +30,14 @@ #include "../scenario.h" #include "../sprites.h" #include "../world/climate.h" -#include "../world/footpath.h" #include "../world/park.h" #include "../world/sprite.h" -#include "../world/scenery.h" #include "../interface/themes.h" #include "../cheats.h" #include "../network/network.h" #include "error.h" #include "dropdown.h" -#define CHEATS_MONEY_INCREMENT MONEY(5000,00) -#define CHEATS_TRAM_INCREMENT 250 - #define CHEATS_PARK_RATING_SPINNER_PAUSE 20 enum { @@ -126,24 +121,6 @@ enum WINDOW_CHEATS_WIDGET_IDX { WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES }; -enum { - GUEST_PARAMETER_HAPPINESS, - GUEST_PARAMETER_ENERGY, - GUEST_PARAMETER_HUNGER, - GUEST_PARAMETER_THIRST, - GUEST_PARAMETER_NAUSEA, - GUEST_PARAMETER_NAUSEA_TOLERANCE, - GUEST_PARAMETER_BATHROOM, - GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY -}; - -enum { - OBJECT_MONEY, - OBJECT_PARK_MAP, - OBJECT_BALLOON, - OBJECT_UMBRELLA -}; - #pragma region MEASUREMENTS #define WW 249 @@ -435,342 +412,10 @@ static rct_string_id window_cheats_page_titles[] = { static void window_cheats_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); -int park_rating_spinner_value; int park_rating_spinner_pressed_for = 0; -#pragma region Cheat functions - -static void cheat_set_grass_length(int length) -{ - int x, y; - rct_map_element *mapElement; - - for (y = 0; y < 256; y++) { - for (x = 0; x < 256; x++) { - mapElement = map_get_surface_element_at(x, y); - if (!(mapElement->properties.surface.ownership & OWNERSHIP_OWNED)) - continue; - - if (map_element_get_terrain(mapElement) != TERRAIN_GRASS) - continue; - - if ((mapElement->properties.surface.terrain & 0x1F) > 0) - continue; - - mapElement->properties.surface.grass_length = length; - } - } - - gfx_invalidate_screen(); -} - -static void cheat_water_plants() -{ - map_element_iterator it; - - map_element_iterator_begin(&it); - do { - if (map_element_get_type(it.element) == MAP_ELEMENT_TYPE_SCENERY) { - it.element->properties.scenery.age = 0; - } - } while (map_element_iterator_next(&it)); - - gfx_invalidate_screen(); -} - -static void cheat_fix_vandalism() -{ - map_element_iterator it; - - map_element_iterator_begin(&it); - do { - if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_PATH) - continue; - - if (!footpath_element_has_path_scenery(it.element)) - continue; - - it.element->flags &= ~MAP_ELEMENT_FLAG_BROKEN; - } while (map_element_iterator_next(&it)); - - gfx_invalidate_screen(); -} - -static void cheat_remove_litter() -{ - rct_litter* litter; - uint16 spriteIndex, nextSpriteIndex; - - for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_LITTER, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) { - litter = &(g_sprite_list[spriteIndex].litter); - nextSpriteIndex = litter->next; - sprite_remove((rct_sprite*)litter); - } - - map_element_iterator it; - rct_scenery_entry *sceneryEntry; - - map_element_iterator_begin(&it); - do { - if (map_element_get_type(it.element) != MAP_ELEMENT_TYPE_PATH) - continue; - - if (!footpath_element_has_path_scenery(it.element)) - continue; - - sceneryEntry = g_pathBitSceneryEntries[footpath_element_get_path_scenery_index(it.element)]; - if(sceneryEntry->path_bit.var_06 & (1 << 0)) - it.element->properties.path.addition_status = 0xFF; - - } while (map_element_iterator_next(&it)); - - gfx_invalidate_screen(); -} - -static void cheat_fix_rides() -{ - int rideIndex; - rct_ride *ride; - rct_peep *mechanic; - - FOR_ALL_RIDES(rideIndex, ride) - { - if ((ride->mechanic_status != RIDE_MECHANIC_STATUS_FIXING) && (ride->lifecycle_flags & (RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN))) - { - mechanic = ride_get_assigned_mechanic(ride); - - if (mechanic != NULL){ - remove_peep_from_ride(mechanic); - } - - ride_fix_breakdown(rideIndex, 0); - ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_MAIN | RIDE_INVALIDATE_RIDE_LIST; - } - } -} - -static void cheat_renew_rides() -{ - int i; - rct_ride *ride; - - FOR_ALL_RIDES(i, ride) - { - // Set build date to current date (so the ride is brand new) - ride->build_date = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16); - // Set reliability to 100 - ride->reliability = (100 << 8); - } - window_invalidate_by_class(WC_RIDE); -} - -static void cheat_make_destructible() -{ - int i; - rct_ride *ride; - FOR_ALL_RIDES(i, ride) - { - if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE) - ride->lifecycle_flags&=~RIDE_LIFECYCLE_INDESTRUCTIBLE; - if (ride->lifecycle_flags & RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) - ride->lifecycle_flags&=~RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK; - } - window_invalidate_by_class(WC_RIDE); -} - -static void cheat_reset_crash_status() -{ - int i; - rct_ride *ride; - - FOR_ALL_RIDES(i, ride){ - //reset crash status - if (ride->lifecycle_flags & RIDE_LIFECYCLE_CRASHED) - ride->lifecycle_flags&=~RIDE_LIFECYCLE_CRASHED; - //reset crash history - ride->last_crash_type=RIDE_CRASH_TYPE_NONE; - } - window_invalidate_by_class(WC_RIDE); -} - -static void cheat_10_minute_inspections() -{ - int i; - rct_ride *ride; - - FOR_ALL_RIDES(i, ride) { - // Set inspection interval to 10 minutes - ride->inspection_interval = RIDE_INSPECTION_EVERY_10_MINUTES; - } - window_invalidate_by_class(WC_RIDE); -} - -static void cheat_increase_money(money32 amount) -{ - money32 currentMoney; - - currentMoney = DECRYPT_MONEY(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32)); - if (currentMoney < INT_MAX - amount) - currentMoney += amount; - else - currentMoney = INT_MAX; - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONEY_ENCRYPTED, sint32) = ENCRYPT_MONEY(currentMoney); - - window_invalidate_by_class(WC_FINANCES); - window_invalidate_by_class(WC_BOTTOM_TOOLBAR); -} - -static void cheat_clear_loan() -{ - // First give money - cheat_increase_money(RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_LOAN, money32)); - - // Then pay the loan - money32 newLoan; - newLoan = MONEY(0, 00); - game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, newLoan, GAME_COMMAND_SET_CURRENT_LOAN, 0, 0); -} - -static void cheat_generate_guests(int count) -{ - int i; - - for (i = 0; i < count; i++) - generate_new_guest(); - - window_invalidate_by_class(WC_BOTTOM_TOOLBAR); -} - -static void cheat_set_guest_parameter(int parameter, int value) -{ - int spriteIndex; - rct_peep *peep; - - FOR_ALL_GUESTS(spriteIndex, peep) { - switch(parameter) { - case GUEST_PARAMETER_HAPPINESS: - peep->happiness = value; - break; - case GUEST_PARAMETER_ENERGY: - peep->energy = value; - break; - case GUEST_PARAMETER_HUNGER: - peep->hunger = value; - break; - case GUEST_PARAMETER_THIRST: - peep->thirst = value; - break; - case GUEST_PARAMETER_NAUSEA: - peep->nausea = value; - break; - case GUEST_PARAMETER_NAUSEA_TOLERANCE: - peep->nausea_tolerance = value; - break; - case GUEST_PARAMETER_BATHROOM: - peep->bathroom = value; - break; - case GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY: - peep->intensity = (15 << 4) | value; - break; - } - peep_update_sprite_type(peep); - } - -} - -static void cheat_give_all_guests(int object) -{ - int spriteIndex; - rct_peep *peep; - - FOR_ALL_GUESTS(spriteIndex, peep) { - switch(object) - { - case OBJECT_MONEY: - peep->cash_in_pocket = MONEY(1000,00); - break; - case OBJECT_PARK_MAP: - peep->item_standard_flags |= PEEP_ITEM_MAP; - break; - case OBJECT_BALLOON: - peep->item_standard_flags |= PEEP_ITEM_BALLOON; - peep->balloon_colour=scenario_rand_max(31); - peep_update_sprite_type(peep); - break; - case OBJECT_UMBRELLA: - peep->item_standard_flags |= PEEP_ITEM_UMBRELLA; - peep->umbrella_colour=scenario_rand_max(31); - peep_update_sprite_type(peep); - break; - } - } - window_invalidate_by_class(WC_PEEP); -} - -static void cheat_remove_all_guests() -{ - rct_peep *peep; - uint16 spriteIndex, nextSpriteIndex; - - for (spriteIndex = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_PEEP, uint16); spriteIndex != SPRITE_INDEX_NULL; spriteIndex = nextSpriteIndex) { - peep = &(g_sprite_list[spriteIndex].peep); - nextSpriteIndex = peep->next; - if (peep->type == PEEP_TYPE_GUEST) { - peep_remove(peep); - } - } - - int i; - rct_ride *ride; - - FOR_ALL_RIDES(i, ride) - { - ride_clear_for_construction(i); - ride_set_status(i, RIDE_STATUS_CLOSED); - - for(int i=0;i<4;i++) { - ride->queue_length[i] = 0; - ride->last_peep_in_queue[i]=0xFFFF; - } - } - window_invalidate_by_class(WC_RIDE); - gfx_invalidate_screen(); -} - -static void cheat_explode_guests() -{ - int sprite_index; - rct_peep *peep; - - FOR_ALL_GUESTS(sprite_index, peep) { - if (scenario_rand_max(6) == 0) { - peep->flags |= PEEP_FLAGS_EXPLODE; - } - } -} - -static void cheat_set_staff_speed(uint8 value) -{ - uint16 spriteIndex; - rct_peep *peep; - - FOR_ALL_STAFF(spriteIndex, peep) { - peep->energy = value; - peep->energy_growth_rate = value; - } -} - -#pragma endregion - void window_cheats_open() { -#ifndef DISABLE_NETWORK - if (network_get_mode() != NETWORK_MODE_NONE) - { - window_error_open(STR_WARNING_IN_CAPS, STR_NOT_ALLOWED_IN_MULTIPLAYER); - return; - } -#endif rct_window* window; // Check if window is already open @@ -819,7 +464,7 @@ static void window_cheats_misc_dropdown(rct_window *w, int widgetIndex, int drop if (widgetIndex != WIDX_WEATHER_DROPDOWN_BUTTON || dropdownIndex == -1) return; - climate_force_weather(dropdownIndex); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_FORCEWEATHER, dropdownIndex, GAME_COMMAND_CHEAT, 0, 0); } static void window_cheats_money_mouseup(rct_window *w, int widgetIndex) @@ -835,10 +480,10 @@ static void window_cheats_money_mouseup(rct_window *w, int widgetIndex) window_cheats_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_HIGH_MONEY: - cheat_increase_money(CHEATS_MONEY_INCREMENT); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_INCREASEMONEY, CHEATS_MONEY_INCREMENT, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_CLEAR_LOAN: - cheat_clear_loan(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_CLEARLOAN, CHEATS_MONEY_INCREMENT, GAME_COMMAND_CHEAT, 0, 0); break; } } @@ -856,83 +501,79 @@ static void window_cheats_guests_mouseup(rct_window *w, int widgetIndex) window_cheats_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_GUEST_HAPPINESS_MAX: - cheat_set_guest_parameter(GUEST_PARAMETER_HAPPINESS,255); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_HAPPINESS, GAME_COMMAND_CHEAT, 255, 0); break; case WIDX_GUEST_HAPPINESS_MIN: - cheat_set_guest_parameter(GUEST_PARAMETER_HAPPINESS,0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_HAPPINESS, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GUEST_ENERGY_MAX: - cheat_set_guest_parameter(GUEST_PARAMETER_ENERGY,127); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_ENERGY, GAME_COMMAND_CHEAT, 127, 0); break; case WIDX_GUEST_ENERGY_MIN: - cheat_set_guest_parameter(GUEST_PARAMETER_ENERGY,0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_ENERGY, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GUEST_HUNGER_MAX: - cheat_set_guest_parameter(GUEST_PARAMETER_HUNGER,0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_HUNGER, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GUEST_HUNGER_MIN: - cheat_set_guest_parameter(GUEST_PARAMETER_HUNGER,255); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_HUNGER, GAME_COMMAND_CHEAT, 255, 0); break; case WIDX_GUEST_THIRST_MAX: - cheat_set_guest_parameter(GUEST_PARAMETER_THIRST,0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_THIRST, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GUEST_THIRST_MIN: - cheat_set_guest_parameter(GUEST_PARAMETER_THIRST,255); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_THIRST, GAME_COMMAND_CHEAT, 255, 0); break; case WIDX_GUEST_NAUSEA_MAX: - cheat_set_guest_parameter(GUEST_PARAMETER_NAUSEA,255); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_NAUSEA, GAME_COMMAND_CHEAT, 255, 0); break; case WIDX_GUEST_NAUSEA_MIN: - cheat_set_guest_parameter(GUEST_PARAMETER_NAUSEA,0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_NAUSEA, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GUEST_NAUSEA_TOLERANCE_MAX: - cheat_set_guest_parameter(GUEST_PARAMETER_NAUSEA_TOLERANCE,PEEP_NAUSEA_TOLERANCE_HIGH); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_NAUSEA_TOLERANCE, GAME_COMMAND_CHEAT, PEEP_NAUSEA_TOLERANCE_HIGH, 0); break; case WIDX_GUEST_NAUSEA_TOLERANCE_MIN: - cheat_set_guest_parameter(GUEST_PARAMETER_NAUSEA_TOLERANCE,PEEP_NAUSEA_TOLERANCE_NONE); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_NAUSEA_TOLERANCE, GAME_COMMAND_CHEAT, PEEP_NAUSEA_TOLERANCE_NONE, 0); break; case WIDX_GUEST_BATHROOM_MAX: - cheat_set_guest_parameter(GUEST_PARAMETER_BATHROOM,255); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_BATHROOM, GAME_COMMAND_CHEAT, 255, 0); break; case WIDX_GUEST_BATHROOM_MIN: - cheat_set_guest_parameter(GUEST_PARAMETER_BATHROOM,0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_BATHROOM, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1: - cheat_set_guest_parameter(GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY,1); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY, GAME_COMMAND_CHEAT, 1, 0); break; case WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15: - cheat_set_guest_parameter(GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY,0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGUESTPARAMETER, GUEST_PARAMETER_PREFERRED_RIDE_INTENSITY, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_TRAM_GUESTS: - cheat_generate_guests(CHEATS_TRAM_INCREMENT); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_GENERATEGUESTS, CHEATS_TRAM_INCREMENT, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_REMOVE_ALL_GUESTS: - cheat_remove_all_guests(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_REMOVEALLGUESTS, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_EXPLODE_GUESTS: - cheat_explode_guests(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_EXPLODEGUESTS, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GIVE_GUESTS_MONEY: - cheat_give_all_guests(OBJECT_MONEY); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_GIVEALLGUESTS, OBJECT_MONEY, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GIVE_GUESTS_PARK_MAPS: - cheat_give_all_guests(OBJECT_PARK_MAP); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_GIVEALLGUESTS, OBJECT_PARK_MAP, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GIVE_GUESTS_BALLOONS: - cheat_give_all_guests(OBJECT_BALLOON); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_GIVEALLGUESTS, OBJECT_BALLOON, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GIVE_GUESTS_UMBRELLAS: - cheat_give_all_guests(OBJECT_UMBRELLA); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_GIVEALLGUESTS, OBJECT_UMBRELLA, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_GUEST_IGNORE_RIDE_INTENSITY: - gCheatsIgnoreRideIntensity ^= 1; - config_save_default(); - window_invalidate(w); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_IGNORERIDEINTENSITY, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_DISABLE_VANDALISM: - gCheatsDisableVandalism ^= 1; - config_save_default(); - window_invalidate(w); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_DISABLEVANDALISM, 0, GAME_COMMAND_CHEAT, 0, 0); break; } } @@ -950,75 +591,67 @@ static void window_cheats_misc_mouseup(rct_window *w, int widgetIndex) window_cheats_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_FREEZE_CLIMATE: - toggle_climate_lock(); - w->widgets[widgetIndex].image = w->widgets[widgetIndex].image == STR_CHEAT_FREEZE_CLIMATE ? STR_CHEAT_UNFREEZE_CLIMATE : STR_CHEAT_FREEZE_CLIMATE; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_FREEZECLIMATE, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_OPEN_CLOSE_PARK: - park_set_open(park_is_open() ? 0 : 1); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_OPENCLOSEPARK, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_CLEAR_GRASS: - cheat_set_grass_length(GRASS_LENGTH_CLEAR_0); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGRASSLENGTH, GRASS_LENGTH_CLEAR_0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_MOWED_GRASS: - cheat_set_grass_length(GRASS_LENGTH_MOWED); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETGRASSLENGTH, GRASS_LENGTH_MOWED, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_WATER_PLANTS: - cheat_water_plants(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_WATERPLANTS, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_FIX_VANDALISM: - cheat_fix_vandalism(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_FIXVANDALISM, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_REMOVE_LITTER: - cheat_remove_litter(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_REMOVELITTER, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_WIN_SCENARIO: - scenario_success(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_WINSCENARIO, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_HAVE_FUN: - RCT2_GLOBAL(RCT2_ADDRESS_OBJECTIVE_TYPE, uint8) = OBJECTIVE_HAVE_FUN; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_HAVEFUN, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_UNLOCK_ALL_PRICES: - gCheatsUnlockAllPrices ^= 1; - config_save_default(); - window_invalidate(w); - window_invalidate_by_class(WC_RIDE); - window_invalidate_by_class(WC_PARK_INFORMATION); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_UNLOCKALLPRICES, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_SANDBOX_MODE: - gCheatsSandboxMode = !gCheatsSandboxMode; - w->widgets[widgetIndex].image = w->widgets[widgetIndex].image == STR_CHEAT_SANDBOX_MODE ? STR_CHEAT_SANDBOX_MODE_DISABLE : STR_CHEAT_SANDBOX_MODE; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SANDBOXMODE, 0, GAME_COMMAND_CHEAT, 0, 0); // To prevent tools from staying active after disabling cheat - tool_cancel(); - window_invalidate_by_class(WC_MAP); - window_invalidate_by_class(WC_FOOTPATH); + //tool_cancel(); break; case WIDX_FAST_STAFF: - cheat_set_staff_speed(0xFF); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETSTAFFSPEED, 0xFF, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_NORMAL_STAFF: - cheat_set_staff_speed(0x60); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETSTAFFSPEED, 0x60, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_PARK_PARAMETERS: window_editor_scenario_options_open(); break; case WIDX_FORCE_PARK_RATING: if (get_forced_park_rating() >= 0){ - set_forced_park_rating(-1); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETFORCEDPARKRATING, -1, GAME_COMMAND_CHEAT, 0, 0); } else { - set_forced_park_rating(park_rating_spinner_value); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETFORCEDPARKRATING, park_rating_spinner_value, GAME_COMMAND_CHEAT, 0, 0); } break; case WIDX_INCREASE_PARK_RATING: park_rating_spinner_value = min(999, 10 * (park_rating_spinner_value / 10 + 1)); widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); if (get_forced_park_rating() >= 0) - set_forced_park_rating(park_rating_spinner_value); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETFORCEDPARKRATING, park_rating_spinner_value, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_DECREASE_PARK_RATING: park_rating_spinner_value = max(0, 10 * (park_rating_spinner_value / 10 - 1)); widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER); if (get_forced_park_rating() >= 0) - set_forced_park_rating(park_rating_spinner_value); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SETFORCEDPARKRATING, park_rating_spinner_value, GAME_COMMAND_CHEAT, 0, 0); break; } } @@ -1036,48 +669,40 @@ static void window_cheats_rides_mouseup(rct_window *w, int widgetIndex) window_cheats_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_RENEW_RIDES: - cheat_renew_rides(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_RENEWRIDES, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_MAKE_DESTRUCTIBLE: - cheat_make_destructible(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_MAKEDESTRUCTIBLE, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_FIX_ALL: - cheat_fix_rides(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_FIXRIDES, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_FAST_LIFT_HILL: - gCheatsFastLiftHill ^= 1; - config_save_default(); - window_invalidate(w); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_FASTLIFTHILL, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_DISABLE_BRAKES_FAILURE: - gCheatsDisableBrakesFailure ^= 1; - config_save_default(); - window_invalidate(w); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_DISABLEBRAKESFAILURE, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_DISABLE_ALL_BREAKDOWNS: - gCheatsDisableAllBreakdowns ^= 1; - config_save_default(); - window_invalidate(w); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_DISABLEALLBREAKDOWNS, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_BUILD_IN_PAUSE_MODE: - gCheatsBuildInPauseMode ^= 1; - config_save_default(); - window_invalidate(w); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_BUILDINPAUSEMODE, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_RESET_CRASH_STATUS: - cheat_reset_crash_status(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_RESETCRASHSTATUS, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_10_MINUTE_INSPECTIONS: - cheat_10_minute_inspections(); + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_10MINUTEINSPECTIONS, 0, GAME_COMMAND_CHEAT, 0, 0); break; case WIDX_SHOW_ALL_OPERATING_MODES: - gCheatsShowAllOperatingModes = !gCheatsShowAllOperatingModes; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SHOWALLOPERATINGMODES, 0, GAME_COMMAND_CHEAT, 0, 0); if (gCheatsShowAllOperatingModes) { window_error_open(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE); } break; case WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES: - gCheatsShowVehiclesFromOtherTrackTypes = !gCheatsShowVehiclesFromOtherTrackTypes; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SHOWVEHICLESFROMOTHERTRACKTYPES, 0, GAME_COMMAND_CHEAT, 0, 0); if (gCheatsShowVehiclesFromOtherTrackTypes) { window_error_open(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE); } @@ -1138,6 +763,8 @@ static void window_cheats_invalidate(rct_window *w) STR_CHEAT_CLOSE_PARK : STR_CHEAT_OPEN_PARK; widget_set_checkbox_value(w, WIDX_UNLOCK_ALL_PRICES, gCheatsUnlockAllPrices); widget_set_checkbox_value(w, WIDX_FORCE_PARK_RATING, get_forced_park_rating() >= 0); + w->widgets[WIDX_SANDBOX_MODE].image = gCheatsSandboxMode ? STR_CHEAT_SANDBOX_MODE_DISABLE : STR_CHEAT_SANDBOX_MODE; + w->widgets[WIDX_FREEZE_CLIMATE].image = g_climate_locked ? STR_CHEAT_UNFREEZE_CLIMATE : STR_CHEAT_FREEZE_CLIMATE; break; case WINDOW_CHEATS_PAGE_RIDES: RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = 255; @@ -1158,6 +785,7 @@ static void window_cheats_invalidate(rct_window *w) // Set title w->widgets[WIDX_TITLE].image = window_cheats_page_titles[w->page]; + // Current weather int currentWeather = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, uint8); window_cheats_misc_widgets[WIDX_WEATHER].image = STR_SUNNY + currentWeather; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 5a6a9c100e..50a93c9a0e 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -573,13 +573,13 @@ static void window_top_toolbar_dropdown(rct_window *w, int widgetIndex, int drop window_cheats_open(); break; case DDIDX_ENABLE_SANDBOX_MODE: - gCheatsSandboxMode = !gCheatsSandboxMode; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SANDBOXMODE, 0, GAME_COMMAND_CHEAT, 0, 0); break; case DDIDX_DISABLE_CLEARANCE_CHECKS: - gCheatsDisableClearanceChecks = !gCheatsDisableClearanceChecks; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_DISABLECLEARANCECHECKS, 0, GAME_COMMAND_CHEAT, 0, 0); break; case DDIDX_DISABLE_SUPPORT_LIMITS: - gCheatsDisableSupportLimits = !gCheatsDisableSupportLimits; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_DISABLESUPPORTLIMITS, 0, GAME_COMMAND_CHEAT, 0, 0); break; } break; diff --git a/src/world/climate.c b/src/world/climate.c index e81b418912..7f360263c3 100644 --- a/src/world/climate.c +++ b/src/world/climate.c @@ -287,7 +287,7 @@ static void climate_update_thunder_sound() climate_update_thunder(); } else if (_climateCurrentWeatherEffect == 2) { // Create new thunder and lightning - unsigned int randomNumber = scenario_rand(); + unsigned int randomNumber = util_rand(); if ((randomNumber & 0xFFFF) <= 0x1B4) { randomNumber >>= 16; _thunderTimer = 43 + (randomNumber % 64); @@ -314,7 +314,7 @@ static void climate_update_lightning() _lightningTimer--; if (RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint16) == 0) - if ((scenario_rand() & 0xFFFF) <= 0x2000) + if ((util_rand() & 0xFFFF) <= 0x2000) RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint16) = 1; } @@ -324,7 +324,7 @@ static void climate_update_thunder() if (_thunderTimer != 0) return; - unsigned int randomNumber = scenario_rand(); + unsigned int randomNumber = util_rand(); if (randomNumber & 0x10000) { if (_thunderStatus[0] == THUNDER_STATUS_NULL && _thunderStatus[1] == THUNDER_STATUS_NULL) { // Play thunder on left side diff --git a/src/world/park.h b/src/world/park.h index 5f24a295e4..cd90993c9b 100644 --- a/src/world/park.h +++ b/src/world/park.h @@ -49,8 +49,10 @@ enum { extern uint8 *gParkRatingHistory; extern uint8 *gGuestsInParkHistory; +extern int _guestGenerationProbability; +extern int _suggestedGuestMaximum; -void set_forced_park_rating(); +void set_forced_park_rating(int rating); int get_forced_park_rating(); int park_is_open();