Create "Own all land" cheat functionality (#5056)

Implement "Own all land" cheat into cheat window

Restore only valid peep spawn points

Code improvements

Update to use PEEP_SPAWN / PARK_ENTRANCE defines
This commit is contained in:
wolfreak99 2017-06-06 16:50:42 -04:00 committed by Ted John
parent 37a3179639
commit 07d1ba4f8c
6 changed files with 95 additions and 26 deletions

View File

@ -4372,6 +4372,7 @@ STR_6060 :Show guest purchases as animation
STR_6061 :{SMALLFONT}{BLACK}Show animated money effect{NEWLINE}when guests make purchases.
STR_6062 :{OUTLINE}{GREEN}+ {CURRENCY2DP}
STR_6063 :{OUTLINE}{RED}- {CURRENCY2DP}
STR_6064 :Own all land
#############
# Scenarios #

View File

@ -1,5 +1,6 @@
0.0.8 (in development)
------------------------------------------------------------------------
- Feature: [#5056] Add cheat to own all land.
- Feature: [#5133] Add option to display guest expenditure (as seen in RCTC).
- Feature: OpenRCT2 now starts up on the display it was last shown on.
- Improved: Mouse can now be dragged to select scenery when saving track designs

View File

@ -16,6 +16,7 @@
#include "cheats.h"
#include "config/Config.h"
#include "editor.h"
#include "game.h"
#include "interface/window.h"
#include "localisation/date.h"
@ -24,6 +25,7 @@
#include "util/util.h"
#include "world/Climate.h"
#include "world/footpath.h"
#include "world/map.h"
#include "world/scenery.h"
#include "world/sprite.h"
@ -428,6 +430,62 @@ static void cheat_set_staff_speed(uint8 value)
}
}
static void cheat_own_all_land()
{
sint32 min = 32;
sint32 max = gMapSizeUnits - 32;
for (sint32 y = min; y <= max; y += 32) {
for (sint32 x = min; x <= max; x += 32) {
rct_map_element * surfaceElement = map_get_surface_element_at(x >> 5, y >> 5);
// Ignore already owned tiles.
if (surfaceElement->properties.surface.ownership & OWNERSHIP_OWNED)
continue;
sint32 base_z = surfaceElement->base_height;
rct_map_element * mapElement = map_get_first_element_at(x >> 5, y >> 5);
sint32 destOwnership = OWNERSHIP_OWNED;
do {
sint32 type = map_element_get_type(mapElement);
if (type == MAP_ELEMENT_TYPE_PATH ||
(type == MAP_ELEMENT_TYPE_ENTRANCE && mapElement->properties.entrance.type == ENTRANCE_TYPE_PARK_ENTRANCE)) {
destOwnership = OWNERSHIP_CONSTRUCTION_RIGHTS_OWNED;
// Do not own construction rights if too high/below surface
if (mapElement->base_height - 3 > base_z ||
mapElement->base_height < base_z) {
destOwnership = 0;
break;
}
}
} while (!map_element_is_last_for_tile(mapElement++));
// only own tiles that were not set to 0
if (destOwnership != 0) {
surfaceElement->properties.surface.ownership |= destOwnership;
update_park_fences_around_tile(x, y);
uint16 baseHeight = surfaceElement->base_height * 8;
map_invalidate_tile(x, y, baseHeight, baseHeight + 16);
}
}
}
// Completely unown peep spawn points
for (sint32 i = 0; i < MAX_PEEP_SPAWNS; i++) {
sint32 x = gPeepSpawns[i].x;
sint32 y = gPeepSpawns[i].y;
if (x != PEEP_SPAWN_UNDEFINED) {
rct_map_element * surfaceElement = map_get_surface_element_at(x >> 5, y >> 5);
surfaceElement->properties.surface.ownership = 0;
update_park_fences_around_tile(x, y);
uint16 baseHeight = surfaceElement->base_height * 8;
map_invalidate_tile(x, y, baseHeight, baseHeight + 16);
}
}
map_count_remaining_land_rights();
}
#pragma endregion
void game_command_cheat(sint32* eax, sint32* ebx, sint32* ecx, sint32* edx, sint32* esi, sint32* edi, sint32* ebp)
@ -479,6 +537,7 @@ void game_command_cheat(sint32* eax, sint32* ebx, sint32* ecx, sint32* edx, sint
case CHEAT_SETFORCEDPARKRATING: if(*edx > -1) { park_rating_spinner_value = *edx; } set_forced_park_rating(*edx); break;
case CHEAT_RESETDATE: date_reset(); window_invalidate_by_class(WC_BOTTOM_TOOLBAR); break;
case CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES: gCheatsAllowArbitraryRideTypeChanges = *edx != 0; window_invalidate_by_class(WC_RIDE); break;
case CHEAT_OWNALLLAND: cheat_own_all_land(); break;
}
if (network_get_mode() == NETWORK_MODE_NONE) {
config_save_default();

View File

@ -85,6 +85,7 @@ enum {
CHEAT_NEVERENDINGMARKETING,
CHEAT_RESETDATE,
CHEAT_ALLOW_ARBITRARY_RIDE_TYPE_CHANGES,
CHEAT_OWNALLLAND,
};
enum {

View File

@ -3726,6 +3726,8 @@ enum {
STR_MONEY_EFFECT_RECEIVE_HIGHP = 6062,
STR_MONEY_EFFECT_SPEND_HIGHP = 6063,
STR_CHEAT_OWN_ALL_LAND = 6064,
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
STR_COUNT = 32768
};

View File

@ -110,6 +110,7 @@ enum WINDOW_CHEATS_WIDGET_IDX {
WIDX_PARK_PARAMETERS,
WIDX_SANDBOX_MODE,
WIDX_RESET_DATE,
WIDX_OWN_ALL_LAND,
WIDX_UNLOCK_ALL_PRICES,
WIDX_FORCE_PARK_RATING,
WIDX_PARK_RATING_SPINNER,
@ -237,32 +238,33 @@ static rct_widget window_cheats_guests_widgets[] = {
//Strings for following moved to window_cheats_paint()
static rct_widget window_cheats_misc_widgets[] = {
MAIN_CHEATS_WIDGETS,
{ WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(6.25), STR_CHEAT_GENERAL_GROUP, STR_NONE }, // General group
{ WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(0), HPL(7.25), STR_CHEAT_GENERAL_GROUP, STR_NONE }, // General group
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_OPEN_PARK, STR_CHEAT_OPEN_PARK_TIP }, // open / close park
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_PARK_PARAMETERS_TIP }, // Park parameters
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CHEAT_SANDBOX_MODE, STR_CHEAT_SANDBOX_MODE_TIP }, // Sandbox mode (edit land ownership in-game)
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(2), HPL(2), STR_CHEAT_RESET_DATE, STR_NONE }, // Reset date
{ WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(3), OHPL(3), STR_CHEAT_UNLOCK_PRICES, STR_CHEAT_UNLOCK_PRICES_TIP }, // Unlock all prices
{ WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(4), HPL(4), STR_FORCE_PARK_RATING, STR_NONE }, // Force park rating
{ WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(4) + 2, HPL(4) - 3, STR_NONE, STR_NONE }, // park rating
{ WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(4) + 3, YPL(4) + 7, STR_NUMERIC_UP, STR_NONE }, // increase rating
{ WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(4) + 8, YPL(4) + 12, STR_NUMERIC_DOWN, STR_NONE }, // decrease rating
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_CHEAT_WIN_SCENARIO, STR_NONE }, // Win scenario
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(5), HPL(5), STR_CHEAT_HAVE_FUN, STR_NONE }, // Have fun!
{ WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(6), HPL(6), STR_CHEAT_NEVERENDING_MARKETING, STR_CHEAT_NEVERENDING_MARKETING_TIP }, // never ending marketing campaigns
{ WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(7.25), HPL(9.5), STR_CHEAT_CLIMATE_GROUP, STR_NONE }, // Climate group
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(8), HPL(8), STR_CHEAT_FREEZE_CLIMATE, STR_CHEAT_FREEZE_CLIMATE_TIP }, // Freeze climate
{ WWT_DROPDOWN, 1, XPL(1), WPL(1), YPL(9) + 2, YPL(9) + 13, STR_NONE, STR_FORCE_WEATHER_TOOLTIP }, // Force weather
{ WWT_DROPDOWN_BUTTON, 1, WPL(1) - 11, WPL(1) - 1, YPL(9) + 3, YPL(9) + 12, STR_DROPDOWN_GLYPH, STR_FORCE_WEATHER_TOOLTIP }, // Force weather
{ WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(11), HPL(16.5), STR_CHEAT_STAFF_GROUP, STR_NONE }, // Staff group
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(12), HPL(12), STR_CHEAT_CLEAR_GRASS, STR_NONE }, // Clear grass
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(12), HPL(12), STR_CHEAT_MOWED_GRASS, STR_NONE }, // Mowed grass
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), STR_CHEAT_WATER_PLANTS, STR_NONE }, // Water plants
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), STR_CHEAT_FIX_VANDALISM, STR_NONE }, // Fix vandalism
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(14), HPL(14), STR_CHEAT_REMOVE_LITTER, STR_NONE }, // Remove litter
{ WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(15), HPL(15), STR_CHEAT_DISABLE_PLANT_AGING, STR_CHEAT_DISABLE_PLANT_AGING_TIP }, // Disable plant ageing
{ WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(16), HPL(16), STR_FAST, STR_NONE }, // Fast staff
{ WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(16), HPL(16), STR_NORMAL, STR_NONE }, // Normal staff
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(3), HPL(3), STR_CHEAT_OWN_ALL_LAND, STR_NONE }, // Own all land
{ WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(4), OHPL(4), STR_CHEAT_UNLOCK_PRICES, STR_CHEAT_UNLOCK_PRICES_TIP }, // Unlock all prices
{ WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_FORCE_PARK_RATING, STR_NONE }, // Force park rating
{ WWT_SPINNER, 1, XPL(1), WPL(1) - 10, YPL(5) + 2, HPL(5) - 3, STR_NONE, STR_NONE }, // park rating
{ WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(5) + 3, YPL(5) + 7, STR_NUMERIC_UP, STR_NONE }, // increase rating
{ WWT_DROPDOWN_BUTTON, 1, WPL(1) - 10, WPL(1), YPL(5) + 8, YPL(5) + 12, STR_NUMERIC_DOWN, STR_NONE }, // decrease rating
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(6), HPL(6), STR_CHEAT_WIN_SCENARIO, STR_NONE }, // Win scenario
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(6), HPL(6), STR_CHEAT_HAVE_FUN, STR_NONE }, // Have fun!
{ WWT_CHECKBOX, 1, XPL(0), OWPL, YPL(7), HPL(7), STR_CHEAT_NEVERENDING_MARKETING, STR_CHEAT_NEVERENDING_MARKETING_TIP }, // never ending marketing campaigns
{ WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(8.25), HPL(10.5), STR_CHEAT_CLIMATE_GROUP, STR_NONE }, // Climate group
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(9), HPL(9), STR_CHEAT_FREEZE_CLIMATE, STR_CHEAT_FREEZE_CLIMATE_TIP }, // Freeze climate
{ WWT_DROPDOWN, 1, XPL(1), WPL(1), YPL(10) + 2, YPL(10) + 13, STR_NONE, STR_FORCE_WEATHER_TOOLTIP }, // Force weather
{ WWT_DROPDOWN_BUTTON, 1, WPL(1) - 11, WPL(1) - 1, YPL(10) + 3, YPL(10) + 12, STR_DROPDOWN_GLYPH, STR_FORCE_WEATHER_TOOLTIP }, // Force weather
{ WWT_GROUPBOX, 1, XPL(0) - GROUP_SPACE, WPL(1) + GROUP_SPACE, YPL(12), HPL(17.5), STR_CHEAT_STAFF_GROUP, STR_NONE }, // Staff group
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(13), HPL(13), STR_CHEAT_CLEAR_GRASS, STR_NONE }, // Clear grass
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(13), HPL(13), STR_CHEAT_MOWED_GRASS, STR_NONE }, // Mowed grass
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(14), HPL(14), STR_CHEAT_WATER_PLANTS, STR_NONE }, // Water plants
{ WWT_CLOSEBOX, 1, XPL(1), WPL(1), YPL(14), HPL(14), STR_CHEAT_FIX_VANDALISM, STR_NONE }, // Fix vandalism
{ WWT_CLOSEBOX, 1, XPL(0), WPL(0), YPL(15), HPL(15), STR_CHEAT_REMOVE_LITTER, STR_NONE }, // Remove litter
{ WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(16), HPL(16), STR_CHEAT_DISABLE_PLANT_AGING, STR_CHEAT_DISABLE_PLANT_AGING_TIP }, // Disable plant ageing
{ WWT_CLOSEBOX, 1, MAX_BTN_LEFT, MAX_BTN_RIGHT, YPL(17), HPL(17), STR_FAST, STR_NONE }, // Fast staff
{ WWT_CLOSEBOX, 1, MIN_BTN_LEFT, MIN_BTN_RIGHT, YPL(17), HPL(17), STR_NORMAL, STR_NONE }, // Normal staff
{ WIDGETS_END },
};
static rct_widget window_cheats_rides_widgets[] = {
@ -451,7 +453,7 @@ static uint64 window_cheats_page_enabled_widgets[] = {
(1ULL << WIDX_DISABLE_VANDALISM) | (1ULL << WIDX_DISABLE_LITTERING),
MAIN_CHEAT_ENABLED_WIDGETS | (1ULL << WIDX_FREEZE_CLIMATE) |
(1ULL << WIDX_OPEN_CLOSE_PARK) | (1ULL << WIDX_WEATHER) | (1ULL << WIDX_WEATHER_DROPDOWN_BUTTON) | (1ULL << WIDX_CLEAR_GRASS) | (1ULL << WIDX_MOWED_GRASS) |
(1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_DISABLE_PLANT_AGING) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) |
(1ULL << WIDX_WATER_PLANTS) | (1ULL << WIDX_DISABLE_PLANT_AGING) | (1ULL << WIDX_FIX_VANDALISM) | (1ULL << WIDX_REMOVE_LITTER) | (1ULL << WIDX_WIN_SCENARIO) | (1ULL << WIDX_HAVE_FUN) | (1ULL << WIDX_OWN_ALL_LAND) |
(1ULL << WIDX_NEVERENDING_MARKETING) | (1ULL << WIDX_UNLOCK_ALL_PRICES) | (1ULL << WIDX_SANDBOX_MODE) | (1ULL << WIDX_RESET_DATE) | (1ULL << WIDX_FAST_STAFF) | (1ULL << WIDX_NORMAL_STAFF) |
(1ULL << WIDX_PARK_PARAMETERS) | (1ULL << WIDX_FORCE_PARK_RATING) | (1ULL << WIDX_INCREASE_PARK_RATING) | (1ULL << WIDX_DECREASE_PARK_RATING),
MAIN_CHEAT_ENABLED_WIDGETS | (1ULL << WIDX_RENEW_RIDES) |
@ -726,6 +728,9 @@ static void window_cheats_misc_mouseup(rct_window *w, rct_widgetindex widgetInde
case WIDX_HAVE_FUN:
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_HAVEFUN, 0, GAME_COMMAND_CHEAT, 0, 0);
break;
case WIDX_OWN_ALL_LAND:
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_OWNALLLAND, 0, GAME_COMMAND_CHEAT, 0, 0);
break;
case WIDX_NEVERENDING_MARKETING:
game_do_command(0, GAME_COMMAND_FLAG_APPLY, CHEAT_NEVERENDINGMARKETING, !gCheatsNeverendingMarketing, GAME_COMMAND_CHEAT, 0, 0);
break;
@ -928,9 +933,9 @@ static void window_cheats_paint(rct_window *w, rct_drawpixelinfo *dpi)
gfx_draw_string_left(dpi, STR_BOTTOM_TOOLBAR_CASH, gCommonFormatArgs, colour, w->x + XPL(0) + TXTO, w->y + YPL(2) + TXTO);
}
else if(w->page == WINDOW_CHEATS_PAGE_MISC){
gfx_draw_string_left(dpi, STR_CHEAT_STAFF_SPEED, NULL, COLOUR_BLACK, w->x + XPL(0) + TXTO, w->y + YPL(16) + TXTO);
gfx_draw_string_left(dpi, STR_FORCE_WEATHER, NULL, COLOUR_BLACK, w->x + XPL(0) + TXTO, w->y + YPL(9) + TXTO);
gfx_draw_string_right(dpi, STR_FORMAT_INTEGER, &park_rating_spinner_value, w->colours[1], w->x + WPL(1) - 10 - TXTO, w->y + YPL(4) + TXTO);
gfx_draw_string_left(dpi, STR_CHEAT_STAFF_SPEED, NULL, COLOUR_BLACK, w->x + XPL(0) + TXTO, w->y + YPL(17) + TXTO);
gfx_draw_string_left(dpi, STR_FORCE_WEATHER, NULL, COLOUR_BLACK, w->x + XPL(0) + TXTO, w->y + YPL(10) + TXTO);
gfx_draw_string_right(dpi, STR_FORMAT_INTEGER, &park_rating_spinner_value, w->colours[1], w->x + WPL(1) - 10 - TXTO, w->y + YPL(5) + TXTO);
}
else if (w->page == WINDOW_CHEATS_PAGE_GUESTS){
gfx_draw_string_left(dpi, STR_CHEAT_GUEST_HAPPINESS, NULL, COLOUR_BLACK, w->x + XPL(0) + TXTO, w->y + YPL(1) + TXTO);