mirror of https://github.com/OpenRCT2/OpenRCT2.git
Merge pull request #2862 from zsilencer/multiplayer
Enable cheats over multiplayer and fix some desync causes
This commit is contained in:
commit
18151042ac
|
@ -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
|
||||
|
|
382
src/cheats.c
382
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;
|
||||
|
|
63
src/cheats.h
63
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
|
||||
|
|
20
src/game.c
20
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
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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<uint8> 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<uint8> 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; }
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue