Merge pull request #2862 from zsilencer/multiplayer

Enable cheats over multiplayer and fix some desync causes
This commit is contained in:
Ted John 2016-02-02 23:36:48 +00:00
commit 18151042ac
14 changed files with 628 additions and 510 deletions

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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
};

View File

@ -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;

View File

@ -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,

View File

@ -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; }

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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();