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_5661 :Set Player Group
|
||||||
STR_5662 :N/A
|
STR_5662 :N/A
|
||||||
STR_5663 :Clear Landscape
|
STR_5663 :Clear Landscape
|
||||||
|
STR_5664 :Cheat
|
||||||
STR_5701 :{WINDOW_COLOUR_2}Last action: {BLACK}{STRINGID}
|
STR_5701 :{WINDOW_COLOUR_2}Last action: {BLACK}{STRINGID}
|
||||||
STR_5702 :{SMALLFONT}{BLACK}Locate player's most recent action
|
STR_5702 :{SMALLFONT}{BLACK}Locate player's most recent action
|
||||||
STR_5703 :Can't kick the host
|
STR_5703 :Can't kick the host
|
||||||
|
|
382
src/cheats.c
382
src/cheats.c
|
@ -1,4 +1,11 @@
|
||||||
#include "cheats.h"
|
#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 gCheatsSandboxMode = false;
|
||||||
bool gCheatsDisableClearanceChecks = false;
|
bool gCheatsDisableClearanceChecks = false;
|
||||||
|
@ -13,6 +20,381 @@ bool gCheatsBuildInPauseMode = false;
|
||||||
bool gCheatsIgnoreRideIntensity = false;
|
bool gCheatsIgnoreRideIntensity = false;
|
||||||
bool gCheatsDisableVandalism = 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()
|
void cheats_reset()
|
||||||
{
|
{
|
||||||
gCheatsSandboxMode = false;
|
gCheatsSandboxMode = false;
|
||||||
|
|
63
src/cheats.h
63
src/cheats.h
|
@ -36,6 +36,69 @@ extern bool gCheatsBuildInPauseMode;
|
||||||
extern bool gCheatsIgnoreRideIntensity;
|
extern bool gCheatsIgnoreRideIntensity;
|
||||||
extern bool gCheatsDisableVandalism;
|
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();
|
void cheats_reset();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
20
src/game.c
20
src/game.c
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include "addresses.h"
|
#include "addresses.h"
|
||||||
#include "audio/audio.h"
|
#include "audio/audio.h"
|
||||||
|
#include "cheats.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
#include "editor.h"
|
#include "editor.h"
|
||||||
|
@ -853,6 +854,20 @@ int game_load_network(SDL_RWops* rw)
|
||||||
|
|
||||||
// Read other data not in normal save files
|
// Read other data not in normal save files
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32) = SDL_ReadLE32(rw);
|
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){
|
if (!load_success){
|
||||||
set_load_objects_fail_reason();
|
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_ride_appearance,
|
||||||
game_command_set_land_height,
|
game_command_set_land_height,
|
||||||
game_pause_toggle,
|
game_pause_toggle,
|
||||||
|
@ -1252,5 +1267,6 @@ GAME_COMMAND_POINTER* new_game_command_table[65] = {
|
||||||
game_command_set_sign_style,
|
game_command_set_sign_style,
|
||||||
game_command_set_player_group,
|
game_command_set_player_group,
|
||||||
game_command_modify_groups,
|
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_SIGN_STYLE,
|
||||||
GAME_COMMAND_SET_PLAYER_GROUP,
|
GAME_COMMAND_SET_PLAYER_GROUP,
|
||||||
GAME_COMMAND_MODIFY_GROUPS,
|
GAME_COMMAND_MODIFY_GROUPS,
|
||||||
GAME_COMMAND_KICK_PLAYER
|
GAME_COMMAND_KICK_PLAYER,
|
||||||
|
GAME_COMMAND_CHEAT
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
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);
|
GAME_COMMAND_CALLBACK_POINTER* game_command_callback_get_callback(int index);
|
||||||
extern int game_command_playerid;
|
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 int gGameSpeed;
|
||||||
extern float gDayNightCycle;
|
extern float gDayNightCycle;
|
||||||
|
|
|
@ -2290,6 +2290,7 @@ enum {
|
||||||
STR_ACTION_SET_PLAYER_GROUP = 5661,
|
STR_ACTION_SET_PLAYER_GROUP = 5661,
|
||||||
STR_ACTION_NA = 5662,
|
STR_ACTION_NA = 5662,
|
||||||
STR_ACTION_CLEAR_LANDSCAPE = 5663,
|
STR_ACTION_CLEAR_LANDSCAPE = 5663,
|
||||||
|
STR_ACTION_CHEAT = 5664,
|
||||||
|
|
||||||
STR_LAST_ACTION_RAN = 5701,
|
STR_LAST_ACTION_RAN = 5701,
|
||||||
STR_LOCATE_PLAYER_TIP = 5702,
|
STR_LOCATE_PLAYER_TIP = 5702,
|
||||||
|
|
|
@ -856,7 +856,6 @@ void Network::UpdateClient()
|
||||||
if (error == 0) {
|
if (error == 0) {
|
||||||
status = NETWORK_STATUS_CONNECTED;
|
status = NETWORK_STATUS_CONNECTED;
|
||||||
server_connection.ResetLastPacketTime();
|
server_connection.ResetLastPacketTime();
|
||||||
cheats_reset();
|
|
||||||
Client_Send_AUTH(gConfigNetwork.player_name, "");
|
Client_Send_AUTH(gConfigNetwork.player_name, "");
|
||||||
window_network_status_open("Authenticating...");
|
window_network_status_open("Authenticating...");
|
||||||
}
|
}
|
||||||
|
@ -1219,6 +1218,7 @@ void Network::LoadGroups()
|
||||||
user->ToggleActionPermission(15); // Kick Player
|
user->ToggleActionPermission(15); // Kick Player
|
||||||
user->ToggleActionPermission(16); // Modify Groups
|
user->ToggleActionPermission(16); // Modify Groups
|
||||||
user->ToggleActionPermission(17); // Set Player Group
|
user->ToggleActionPermission(17); // Set Player Group
|
||||||
|
user->ToggleActionPermission(18); // Cheat
|
||||||
user->id = 2;
|
user->id = 2;
|
||||||
group_list.push_back(std::move(user));
|
group_list.push_back(std::move(user));
|
||||||
SetDefaultGroup(1);
|
SetDefaultGroup(1);
|
||||||
|
@ -1279,14 +1279,24 @@ void Network::Server_Send_AUTH(NetworkConnection& connection)
|
||||||
|
|
||||||
void Network::Server_Send_MAP(NetworkConnection* connection)
|
void Network::Server_Send_MAP(NetworkConnection* connection)
|
||||||
{
|
{
|
||||||
int buffersize = 0x600000;
|
|
||||||
std::vector<uint8> buffer(buffersize);
|
|
||||||
bool RLEState = gUseRLE;
|
bool RLEState = gUseRLE;
|
||||||
gUseRLE = false;
|
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);
|
scenario_save_network(rw);
|
||||||
gUseRLE = RLEState;
|
gUseRLE = RLEState;
|
||||||
int size = (int)SDL_RWtell(rw);
|
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 chunksize = 1000;
|
||||||
size_t out_size;
|
size_t out_size;
|
||||||
unsigned char *compressed = util_zlib_deflate(&buffer[0], size, &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;
|
uint32 size, offset;
|
||||||
packet >> size >> offset;
|
packet >> size >> offset;
|
||||||
if (offset > 0x600000) {
|
int chunksize = packet.size - packet.read;
|
||||||
// too big
|
if (chunksize <= 0) {
|
||||||
return;
|
return;
|
||||||
} else {
|
}
|
||||||
int chunksize = packet.size - packet.read;
|
if (offset + chunksize > chunk_buffer.size()) {
|
||||||
if (chunksize <= 0) {
|
chunk_buffer.resize(offset + chunksize);
|
||||||
return;
|
}
|
||||||
|
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()) {
|
SDL_RWops* rw = SDL_RWFromMem(data, data_size);
|
||||||
chunk_buffer.resize(offset + chunksize);
|
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];
|
else
|
||||||
sprintf(status, "Downloading map ... (%u / %u)", (offset + chunksize) / 1000, size / 1000);
|
{
|
||||||
window_network_status_open(status);
|
//Something went wrong, game is not loaded. Return to main screen.
|
||||||
memcpy(&chunk_buffer[offset], (void*)packet.Read(chunksize), chunksize);
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_LOAD_OR_QUIT, 1, 0);
|
||||||
if (offset + chunksize == size) {
|
}
|
||||||
window_network_status_close();
|
SDL_RWclose(rw);
|
||||||
bool has_to_free = false;
|
if (has_to_free)
|
||||||
unsigned char *data = &chunk_buffer[0];
|
{
|
||||||
size_t data_size = size;
|
free(data);
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2029,9 +2032,9 @@ rct_xyz16 network_get_player_last_action_coord(unsigned int index)
|
||||||
return gNetwork.player_list[index]->last_action_coord;
|
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;
|
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; }
|
int network_get_player_last_action(unsigned int index, int time) { return -999; }
|
||||||
void network_set_player_last_action(unsigned int index, int command) { }
|
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}; }
|
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; }
|
unsigned int network_get_player_commands_ran(unsigned int index) { return 0; }
|
||||||
int network_get_player_index(uint8 id) { return -1; }
|
int network_get_player_index(uint8 id) { return -1; }
|
||||||
uint8 network_get_player_group(unsigned int index) { return 0; }
|
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.
|
// This define specifies which version of network stream current build uses.
|
||||||
// It is used for making sure only compatible builds get connected, even within
|
// It is used for making sure only compatible builds get connected, even within
|
||||||
// single OpenRCT2 version.
|
// single OpenRCT2 version.
|
||||||
#define NETWORK_STREAM_VERSION "0"
|
#define NETWORK_STREAM_VERSION "1"
|
||||||
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
|
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#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_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_KICK_PLAYER, {GAME_COMMAND_KICK_PLAYER}},
|
||||||
{STR_ACTION_MODIFY_GROUPS, {GAME_COMMAND_MODIFY_GROUPS}},
|
{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);
|
int network_get_player_last_action(unsigned int index, int time);
|
||||||
void network_set_player_last_action(unsigned int index, int command);
|
void network_set_player_last_action(unsigned int index, int command);
|
||||||
rct_xyz16 network_get_player_last_action_coord(unsigned int index);
|
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);
|
unsigned int network_get_player_commands_ran(unsigned int index);
|
||||||
int network_get_player_index(uint8 id);
|
int network_get_player_index(uint8 id);
|
||||||
uint8 network_get_player_group(unsigned int index);
|
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 {
|
do {
|
||||||
edges &= ~(1 << test_edge);
|
edges &= ~(1 << test_edge);
|
||||||
int saved_f1aedc = RCT2_GLOBAL(0x00F1AEDC, int);
|
int saved_f1aedc = *RCT2_ADDRESS(0x00F1AEDC, int);
|
||||||
uint8 height = z;
|
uint8 height = z;
|
||||||
RCT2_GLOBAL(0x00F1AEDE, sint16) = 0;
|
RCT2_GLOBAL(0x00F1AEDE, sint16) = 0;
|
||||||
if (footpath_element_is_sloped(path) &&
|
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;
|
height += 2;
|
||||||
}
|
}
|
||||||
score = sub_69A997(x, y, height, counter, score, test_edge);
|
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);
|
} while ((test_edge = bitscanforward(edges)) != -1);
|
||||||
|
|
||||||
return score;
|
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)) {
|
for (int test_edge = chosen_edge; test_edge != -1; test_edge = bitscanforward(edges)) {
|
||||||
edges &= ~(1 << test_edge);
|
edges &= ~(1 << test_edge);
|
||||||
uint8 height = z;
|
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) &&
|
if (footpath_element_is_sloped(dest_map_element) &&
|
||||||
footpath_element_get_slope_direction(dest_map_element) == test_edge)
|
footpath_element_get_slope_direction(dest_map_element) == test_edge)
|
||||||
height += 0x2;
|
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(0x00F1AED4, int) = RCT2_GLOBAL(0x00F1AED8, int);
|
||||||
RCT2_GLOBAL(0x00F1AEDE, uint16) = 0;
|
RCT2_GLOBAL(0x00F1AEDE, uint16) = 0;
|
||||||
uint16 score = sub_69A997(x, y, height, 0, 0xFFFF, test_edge);
|
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)) {
|
if (score < best_score || (score == best_score && RCT2_GLOBAL(0x00F1AED3, uint8) < best_sub)) {
|
||||||
chosen_edge = test_edge;
|
chosen_edge = test_edge;
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "addresses.h"
|
#include "addresses.h"
|
||||||
|
#include "cheats.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
#include "world/climate.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->map_elements, (void*)0x00F663B8, 0x180000);
|
||||||
memcpy(&s6->dword_010E63B8, (void*)0x010E63B8, 0x2E8570);
|
memcpy(&s6->dword_010E63B8, (void*)0x010E63B8, 0x2E8570);
|
||||||
|
|
||||||
|
safe_strcpy(s6->scenario_filename, _scenarioFileName, sizeof(s6->scenario_filename));
|
||||||
|
|
||||||
scenario_fix_ghosts(s6);
|
scenario_fix_ghosts(s6);
|
||||||
|
game_convert_strings_to_rct2(s6);
|
||||||
scenario_save_s6(rw, s6);
|
scenario_save_s6(rw, s6);
|
||||||
|
|
||||||
free(s6);
|
free(s6);
|
||||||
|
|
||||||
|
reset_loaded_objects();
|
||||||
|
|
||||||
// Write other data not in normal save files
|
// Write other data not in normal save files
|
||||||
SDL_WriteLE32(rw, RCT2_GLOBAL(RCT2_ADDRESS_GAME_PAUSED, uint32));
|
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();
|
gfx_invalidate_screen();
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -30,19 +30,14 @@
|
||||||
#include "../scenario.h"
|
#include "../scenario.h"
|
||||||
#include "../sprites.h"
|
#include "../sprites.h"
|
||||||
#include "../world/climate.h"
|
#include "../world/climate.h"
|
||||||
#include "../world/footpath.h"
|
|
||||||
#include "../world/park.h"
|
#include "../world/park.h"
|
||||||
#include "../world/sprite.h"
|
#include "../world/sprite.h"
|
||||||
#include "../world/scenery.h"
|
|
||||||
#include "../interface/themes.h"
|
#include "../interface/themes.h"
|
||||||
#include "../cheats.h"
|
#include "../cheats.h"
|
||||||
#include "../network/network.h"
|
#include "../network/network.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "dropdown.h"
|
#include "dropdown.h"
|
||||||
|
|
||||||
#define CHEATS_MONEY_INCREMENT MONEY(5000,00)
|
|
||||||
#define CHEATS_TRAM_INCREMENT 250
|
|
||||||
|
|
||||||
#define CHEATS_PARK_RATING_SPINNER_PAUSE 20
|
#define CHEATS_PARK_RATING_SPINNER_PAUSE 20
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -126,24 +121,6 @@ enum WINDOW_CHEATS_WIDGET_IDX {
|
||||||
WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES
|
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
|
#pragma region MEASUREMENTS
|
||||||
|
|
||||||
#define WW 249
|
#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);
|
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;
|
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()
|
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;
|
rct_window* window;
|
||||||
|
|
||||||
// Check if window is already open
|
// 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)
|
if (widgetIndex != WIDX_WEATHER_DROPDOWN_BUTTON || dropdownIndex == -1)
|
||||||
return;
|
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)
|
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);
|
window_cheats_set_page(w, widgetIndex - WIDX_TAB_1);
|
||||||
break;
|
break;
|
||||||
case WIDX_HIGH_MONEY:
|
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;
|
break;
|
||||||
case WIDX_CLEAR_LOAN:
|
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;
|
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);
|
window_cheats_set_page(w, widgetIndex - WIDX_TAB_1);
|
||||||
break;
|
break;
|
||||||
case WIDX_GUEST_HAPPINESS_MAX:
|
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;
|
break;
|
||||||
case WIDX_GUEST_HAPPINESS_MIN:
|
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;
|
break;
|
||||||
case WIDX_GUEST_ENERGY_MAX:
|
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;
|
break;
|
||||||
case WIDX_GUEST_ENERGY_MIN:
|
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;
|
break;
|
||||||
case WIDX_GUEST_HUNGER_MAX:
|
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;
|
break;
|
||||||
case WIDX_GUEST_HUNGER_MIN:
|
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;
|
break;
|
||||||
case WIDX_GUEST_THIRST_MAX:
|
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;
|
break;
|
||||||
case WIDX_GUEST_THIRST_MIN:
|
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;
|
break;
|
||||||
case WIDX_GUEST_NAUSEA_MAX:
|
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;
|
break;
|
||||||
case WIDX_GUEST_NAUSEA_MIN:
|
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;
|
break;
|
||||||
case WIDX_GUEST_NAUSEA_TOLERANCE_MAX:
|
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;
|
break;
|
||||||
case WIDX_GUEST_NAUSEA_TOLERANCE_MIN:
|
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;
|
break;
|
||||||
case WIDX_GUEST_BATHROOM_MAX:
|
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;
|
break;
|
||||||
case WIDX_GUEST_BATHROOM_MIN:
|
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;
|
break;
|
||||||
case WIDX_GUEST_RIDE_INTENSITY_MORE_THAN_1:
|
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;
|
break;
|
||||||
case WIDX_GUEST_RIDE_INTENSITY_LESS_THAN_15:
|
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;
|
break;
|
||||||
case WIDX_TRAM_GUESTS:
|
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;
|
break;
|
||||||
case WIDX_REMOVE_ALL_GUESTS:
|
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;
|
break;
|
||||||
case WIDX_EXPLODE_GUESTS:
|
case WIDX_EXPLODE_GUESTS:
|
||||||
cheat_explode_guests();
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_EXPLODEGUESTS, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case WIDX_GIVE_GUESTS_MONEY:
|
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;
|
break;
|
||||||
case WIDX_GIVE_GUESTS_PARK_MAPS:
|
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;
|
break;
|
||||||
case WIDX_GIVE_GUESTS_BALLOONS:
|
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;
|
break;
|
||||||
case WIDX_GIVE_GUESTS_UMBRELLAS:
|
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;
|
break;
|
||||||
case WIDX_GUEST_IGNORE_RIDE_INTENSITY:
|
case WIDX_GUEST_IGNORE_RIDE_INTENSITY:
|
||||||
gCheatsIgnoreRideIntensity ^= 1;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_IGNORERIDEINTENSITY, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
config_save_default();
|
|
||||||
window_invalidate(w);
|
|
||||||
break;
|
break;
|
||||||
case WIDX_DISABLE_VANDALISM:
|
case WIDX_DISABLE_VANDALISM:
|
||||||
gCheatsDisableVandalism ^= 1;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_DISABLEVANDALISM, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
config_save_default();
|
|
||||||
window_invalidate(w);
|
|
||||||
break;
|
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);
|
window_cheats_set_page(w, widgetIndex - WIDX_TAB_1);
|
||||||
break;
|
break;
|
||||||
case WIDX_FREEZE_CLIMATE:
|
case WIDX_FREEZE_CLIMATE:
|
||||||
toggle_climate_lock();
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_FREEZECLIMATE, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
w->widgets[widgetIndex].image = w->widgets[widgetIndex].image == STR_CHEAT_FREEZE_CLIMATE ? STR_CHEAT_UNFREEZE_CLIMATE : STR_CHEAT_FREEZE_CLIMATE;
|
|
||||||
break;
|
break;
|
||||||
case WIDX_OPEN_CLOSE_PARK:
|
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;
|
break;
|
||||||
case WIDX_CLEAR_GRASS:
|
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;
|
break;
|
||||||
case WIDX_MOWED_GRASS:
|
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;
|
break;
|
||||||
case WIDX_WATER_PLANTS:
|
case WIDX_WATER_PLANTS:
|
||||||
cheat_water_plants();
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_WATERPLANTS, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case WIDX_FIX_VANDALISM:
|
case WIDX_FIX_VANDALISM:
|
||||||
cheat_fix_vandalism();
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_FIXVANDALISM, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case WIDX_REMOVE_LITTER:
|
case WIDX_REMOVE_LITTER:
|
||||||
cheat_remove_litter();
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_REMOVELITTER, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case WIDX_WIN_SCENARIO:
|
case WIDX_WIN_SCENARIO:
|
||||||
scenario_success();
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_WINSCENARIO, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case WIDX_HAVE_FUN:
|
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;
|
break;
|
||||||
case WIDX_UNLOCK_ALL_PRICES:
|
case WIDX_UNLOCK_ALL_PRICES:
|
||||||
gCheatsUnlockAllPrices ^= 1;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_UNLOCKALLPRICES, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
config_save_default();
|
|
||||||
window_invalidate(w);
|
|
||||||
window_invalidate_by_class(WC_RIDE);
|
|
||||||
window_invalidate_by_class(WC_PARK_INFORMATION);
|
|
||||||
break;
|
break;
|
||||||
case WIDX_SANDBOX_MODE:
|
case WIDX_SANDBOX_MODE:
|
||||||
gCheatsSandboxMode = !gCheatsSandboxMode;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SANDBOXMODE, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
w->widgets[widgetIndex].image = w->widgets[widgetIndex].image == STR_CHEAT_SANDBOX_MODE ? STR_CHEAT_SANDBOX_MODE_DISABLE : STR_CHEAT_SANDBOX_MODE;
|
|
||||||
// To prevent tools from staying active after disabling cheat
|
// To prevent tools from staying active after disabling cheat
|
||||||
tool_cancel();
|
//tool_cancel();
|
||||||
window_invalidate_by_class(WC_MAP);
|
|
||||||
window_invalidate_by_class(WC_FOOTPATH);
|
|
||||||
break;
|
break;
|
||||||
case WIDX_FAST_STAFF:
|
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;
|
break;
|
||||||
case WIDX_NORMAL_STAFF:
|
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;
|
break;
|
||||||
case WIDX_PARK_PARAMETERS:
|
case WIDX_PARK_PARAMETERS:
|
||||||
window_editor_scenario_options_open();
|
window_editor_scenario_options_open();
|
||||||
break;
|
break;
|
||||||
case WIDX_FORCE_PARK_RATING:
|
case WIDX_FORCE_PARK_RATING:
|
||||||
if (get_forced_park_rating() >= 0){
|
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 {
|
} 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;
|
break;
|
||||||
case WIDX_INCREASE_PARK_RATING:
|
case WIDX_INCREASE_PARK_RATING:
|
||||||
park_rating_spinner_value = min(999, 10 * (park_rating_spinner_value / 10 + 1));
|
park_rating_spinner_value = min(999, 10 * (park_rating_spinner_value / 10 + 1));
|
||||||
widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER);
|
widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER);
|
||||||
if (get_forced_park_rating() >= 0)
|
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;
|
break;
|
||||||
case WIDX_DECREASE_PARK_RATING:
|
case WIDX_DECREASE_PARK_RATING:
|
||||||
park_rating_spinner_value = max(0, 10 * (park_rating_spinner_value / 10 - 1));
|
park_rating_spinner_value = max(0, 10 * (park_rating_spinner_value / 10 - 1));
|
||||||
widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER);
|
widget_invalidate_by_class(WC_CHEATS, WIDX_PARK_RATING_SPINNER);
|
||||||
if (get_forced_park_rating() >= 0)
|
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;
|
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);
|
window_cheats_set_page(w, widgetIndex - WIDX_TAB_1);
|
||||||
break;
|
break;
|
||||||
case WIDX_RENEW_RIDES:
|
case WIDX_RENEW_RIDES:
|
||||||
cheat_renew_rides();
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_RENEWRIDES, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case WIDX_MAKE_DESTRUCTIBLE:
|
case WIDX_MAKE_DESTRUCTIBLE:
|
||||||
cheat_make_destructible();
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_MAKEDESTRUCTIBLE, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case WIDX_FIX_ALL:
|
case WIDX_FIX_ALL:
|
||||||
cheat_fix_rides();
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_FIXRIDES, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case WIDX_FAST_LIFT_HILL:
|
case WIDX_FAST_LIFT_HILL:
|
||||||
gCheatsFastLiftHill ^= 1;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_FASTLIFTHILL, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
config_save_default();
|
|
||||||
window_invalidate(w);
|
|
||||||
break;
|
break;
|
||||||
case WIDX_DISABLE_BRAKES_FAILURE:
|
case WIDX_DISABLE_BRAKES_FAILURE:
|
||||||
gCheatsDisableBrakesFailure ^= 1;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_DISABLEBRAKESFAILURE, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
config_save_default();
|
|
||||||
window_invalidate(w);
|
|
||||||
break;
|
break;
|
||||||
case WIDX_DISABLE_ALL_BREAKDOWNS:
|
case WIDX_DISABLE_ALL_BREAKDOWNS:
|
||||||
gCheatsDisableAllBreakdowns ^= 1;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_DISABLEALLBREAKDOWNS, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
config_save_default();
|
|
||||||
window_invalidate(w);
|
|
||||||
break;
|
break;
|
||||||
case WIDX_BUILD_IN_PAUSE_MODE:
|
case WIDX_BUILD_IN_PAUSE_MODE:
|
||||||
gCheatsBuildInPauseMode ^= 1;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_BUILDINPAUSEMODE, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
config_save_default();
|
|
||||||
window_invalidate(w);
|
|
||||||
break;
|
break;
|
||||||
case WIDX_RESET_CRASH_STATUS:
|
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;
|
break;
|
||||||
case WIDX_10_MINUTE_INSPECTIONS:
|
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;
|
break;
|
||||||
case WIDX_SHOW_ALL_OPERATING_MODES:
|
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) {
|
if (gCheatsShowAllOperatingModes) {
|
||||||
window_error_open(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE);
|
window_error_open(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES:
|
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) {
|
if (gCheatsShowVehiclesFromOtherTrackTypes) {
|
||||||
window_error_open(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE);
|
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;
|
STR_CHEAT_CLOSE_PARK : STR_CHEAT_OPEN_PARK;
|
||||||
widget_set_checkbox_value(w, WIDX_UNLOCK_ALL_PRICES, gCheatsUnlockAllPrices);
|
widget_set_checkbox_value(w, WIDX_UNLOCK_ALL_PRICES, gCheatsUnlockAllPrices);
|
||||||
widget_set_checkbox_value(w, WIDX_FORCE_PARK_RATING, get_forced_park_rating() >= 0);
|
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;
|
break;
|
||||||
case WINDOW_CHEATS_PAGE_RIDES:
|
case WINDOW_CHEATS_PAGE_RIDES:
|
||||||
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = 255;
|
RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint16) = 255;
|
||||||
|
@ -1158,6 +785,7 @@ static void window_cheats_invalidate(rct_window *w)
|
||||||
// Set title
|
// Set title
|
||||||
w->widgets[WIDX_TITLE].image = window_cheats_page_titles[w->page];
|
w->widgets[WIDX_TITLE].image = window_cheats_page_titles[w->page];
|
||||||
|
|
||||||
|
|
||||||
// Current weather
|
// Current weather
|
||||||
int currentWeather = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, uint8);
|
int currentWeather = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, uint8);
|
||||||
window_cheats_misc_widgets[WIDX_WEATHER].image = STR_SUNNY + currentWeather;
|
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();
|
window_cheats_open();
|
||||||
break;
|
break;
|
||||||
case DDIDX_ENABLE_SANDBOX_MODE:
|
case DDIDX_ENABLE_SANDBOX_MODE:
|
||||||
gCheatsSandboxMode = !gCheatsSandboxMode;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_SANDBOXMODE, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case DDIDX_DISABLE_CLEARANCE_CHECKS:
|
case DDIDX_DISABLE_CLEARANCE_CHECKS:
|
||||||
gCheatsDisableClearanceChecks = !gCheatsDisableClearanceChecks;
|
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_DISABLECLEARANCECHECKS, 0, GAME_COMMAND_CHEAT, 0, 0);
|
||||||
break;
|
break;
|
||||||
case DDIDX_DISABLE_SUPPORT_LIMITS:
|
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;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -287,7 +287,7 @@ static void climate_update_thunder_sound()
|
||||||
climate_update_thunder();
|
climate_update_thunder();
|
||||||
} else if (_climateCurrentWeatherEffect == 2) {
|
} else if (_climateCurrentWeatherEffect == 2) {
|
||||||
// Create new thunder and lightning
|
// Create new thunder and lightning
|
||||||
unsigned int randomNumber = scenario_rand();
|
unsigned int randomNumber = util_rand();
|
||||||
if ((randomNumber & 0xFFFF) <= 0x1B4) {
|
if ((randomNumber & 0xFFFF) <= 0x1B4) {
|
||||||
randomNumber >>= 16;
|
randomNumber >>= 16;
|
||||||
_thunderTimer = 43 + (randomNumber % 64);
|
_thunderTimer = 43 + (randomNumber % 64);
|
||||||
|
@ -314,7 +314,7 @@ static void climate_update_lightning()
|
||||||
|
|
||||||
_lightningTimer--;
|
_lightningTimer--;
|
||||||
if (RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint16) == 0)
|
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;
|
RCT2_GLOBAL(RCT2_ADDRESS_LIGHTNING_ACTIVE, uint16) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,7 +324,7 @@ static void climate_update_thunder()
|
||||||
if (_thunderTimer != 0)
|
if (_thunderTimer != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned int randomNumber = scenario_rand();
|
unsigned int randomNumber = util_rand();
|
||||||
if (randomNumber & 0x10000) {
|
if (randomNumber & 0x10000) {
|
||||||
if (_thunderStatus[0] == THUNDER_STATUS_NULL && _thunderStatus[1] == THUNDER_STATUS_NULL) {
|
if (_thunderStatus[0] == THUNDER_STATUS_NULL && _thunderStatus[1] == THUNDER_STATUS_NULL) {
|
||||||
// Play thunder on left side
|
// Play thunder on left side
|
||||||
|
|
|
@ -49,8 +49,10 @@ enum {
|
||||||
|
|
||||||
extern uint8 *gParkRatingHistory;
|
extern uint8 *gParkRatingHistory;
|
||||||
extern uint8 *gGuestsInParkHistory;
|
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 get_forced_park_rating();
|
||||||
|
|
||||||
int park_is_open();
|
int park_is_open();
|
||||||
|
|
Loading…
Reference in New Issue