diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 7a77af69bc..9d970c2ed1 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3724,7 +3724,7 @@ STR_6273 :Music STR_6274 :Can't set colour scheme... STR_6275 :{WINDOW_COLOUR_2}Station style: STR_6276 :{RED}{STRINGID} has guests getting stuck, possibly due to invalid ride type or operating mode. -STR_6277 :{WINDOW_COLOUR_2}Station index: {BLACK}{COMMA16} +STR_6277 :{WINDOW_COLOUR_2}Station index: {BLACK}{STRINGID} STR_6278 :Autosave amount STR_6279 :{SMALLFONT}{BLACK}Number of autosaves that should be kept STR_6280 :{SMALLFONT}{BLACK}Chat @@ -3778,6 +3778,7 @@ STR_6327 :Transparent background for giant screenshots STR_6328 :{SMALLFONT}{BLACK}With this option enabled, giant screenshots will have a transparent background instead of the default black colour. STR_6329 :{STRING}{STRINGID} STR_6330 :Downloading [{STRING}] from {STRING} ({COMMA16} / {COMMA16}) +STR_6331 :Create Ducks ############# # Scenarios # diff --git a/src/openrct2-ui/windows/Cheats.cpp b/src/openrct2-ui/windows/Cheats.cpp index 7e1a89e5e1..4c7213278b 100644 --- a/src/openrct2-ui/windows/Cheats.cpp +++ b/src/openrct2-ui/windows/Cheats.cpp @@ -126,6 +126,7 @@ enum WINDOW_CHEATS_WIDGET_IDX WIDX_GENERAL_GROUP = WIDX_TAB_CONTENT, WIDX_OPEN_CLOSE_PARK, + WIDX_CREATE_DUCKS, WIDX_PARK_PARAMETERS, WIDX_OWN_ALL_LAND, WIDX_FORCE_PARK_RATING, @@ -269,6 +270,7 @@ static rct_widget window_cheats_misc_widgets[] = MAIN_CHEATS_WIDGETS, { 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_BUTTON, 1, XPL(0), WPL(0), YPL(1), HPL(1), STR_CHEAT_OPEN_PARK, STR_CHEAT_OPEN_PARK_TIP }, // open / close park + { WWT_BUTTON, 1, XPL(0), WPL(0), YPL(2), HPL(2), STR_CREATE_DUCKS, STR_CREATE_DUCKS }, // Create ducks { WWT_BUTTON, 1, XPL(1), WPL(1), YPL(1), HPL(1), STR_CHEAT_PARK_PARAMETERS, STR_CHEAT_PARK_PARAMETERS_TIP }, // Park parameters { WWT_BUTTON, 1, XPL(0), WPL(0), YPL(3), HPL(3), STR_CHEAT_OWN_ALL_LAND, STR_CHEAT_OWN_ALL_LAND_TIP }, // Own all land { WWT_CHECKBOX, 1, XPL(0), WPL(0), YPL(5), HPL(5), STR_FORCE_PARK_RATING, STR_NONE }, // Force park rating @@ -535,6 +537,7 @@ static uint64_t window_cheats_page_enabled_widgets[] = { MAIN_CHEAT_ENABLED_WIDGETS | (1ULL << WIDX_FREEZE_WEATHER) | (1ULL << WIDX_OPEN_CLOSE_PARK) | + (1ULL << WIDX_CREATE_DUCKS) | (1ULL << WIDX_WEATHER) | (1ULL << WIDX_WEATHER_DROPDOWN_BUTTON) | (1ULL << WIDX_CLEAR_GRASS) | @@ -925,6 +928,9 @@ static void window_cheats_misc_mouseup(rct_window* w, rct_widgetindex widgetInde case WIDX_OPEN_CLOSE_PARK: CheatsSet(CheatType::OpenClosePark); break; + case WIDX_CREATE_DUCKS: + CheatsSet(CheatType::CreateDucks, CHEATS_DUCK_INCREMENT); + break; case WIDX_CLEAR_GRASS: CheatsSet(CheatType::SetGrassLength, GRASS_LENGTH_CLEAR_0); break; diff --git a/src/openrct2/Cheats.h b/src/openrct2/Cheats.h index 7d45615e2e..1204a85d3b 100644 --- a/src/openrct2/Cheats.h +++ b/src/openrct2/Cheats.h @@ -83,6 +83,7 @@ enum class CheatType : int32_t DisableRideValueAging, IgnoreResearchStatus, EnableAllDrawableTrackPieces, + CreateDucks, Count, }; @@ -108,6 +109,7 @@ enum #define CHEATS_GIVE_GUESTS_MONEY MONEY(1000, 00) #define CHEATS_TRAM_INCREMENT 250 +#define CHEATS_DUCK_INCREMENT 20 #define CHEATS_STAFF_FAST_SPEED 0xFF #define CHEATS_STAFF_NORMAL_SPEED 0x60 #define CHEATS_STAFF_FREEZE_SPEED 0 diff --git a/src/openrct2/actions/SetCheatAction.hpp b/src/openrct2/actions/SetCheatAction.hpp index 7241c9ab68..931658ccd2 100644 --- a/src/openrct2/actions/SetCheatAction.hpp +++ b/src/openrct2/actions/SetCheatAction.hpp @@ -230,6 +230,9 @@ public: case CheatType::EnableAllDrawableTrackPieces: gCheatsEnableAllDrawableTrackPieces = _param1 != 0; break; + case CheatType::CreateDucks: + CreateDucks(_param1); + break; default: { log_error("Unabled cheat: %d", _cheatType.id); @@ -343,6 +346,8 @@ private: return { { 0, 5 }, { 0, 0 } }; case CheatType::SetForcedParkRating: return { { 0, 999 }, { 0, 0 } }; + case CheatType::CreateDucks: + return { { 0, 100 }, { 0, 0 } }; default: return { { 0, 0 }, { 0, 0 } }; } @@ -772,4 +777,17 @@ private: auto parkSetParameter = ParkSetParameterAction(isOpen ? ParkParameter::Open : ParkParameter::Close); GameActions::ExecuteNested(&parkSetParameter); } + + void CreateDucks(int count) const + { + for (int i = 0; i < count; i++) + { + // 100 attempts at finding some water to create a few ducks at + for (int32_t attempts = 0; attempts < 100; attempts++) + { + if (scenario_create_ducks()) + break; + } + } + } }; diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 0cbaca5234..fa93f8332a 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -3968,6 +3968,8 @@ enum STR_STRING_STRINGID = 6329, STR_DOWNLOADING_OBJECTS_FROM = 6330, + STR_CREATE_DUCKS = 6331, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index 74d49b2d0d..2582d28e0a 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -82,7 +82,6 @@ money32 gScenarioCompanyValueRecord; char gScenarioFileName[MAX_PATH]; -static int32_t scenario_create_ducks(); static void scenario_objective_check(); using namespace OpenRCT2; @@ -420,7 +419,7 @@ void scenario_update() * * rct2: 0x006744A9 */ -static int32_t scenario_create_ducks() +bool scenario_create_ducks() { CoordsXY centrePos; centrePos.x = 64 + (scenario_rand_max(MAXIMUM_MAP_SIZE_PRACTICAL) * 32); @@ -429,11 +428,11 @@ static int32_t scenario_create_ducks() Guard::Assert(map_is_location_valid(centrePos)); if (!map_is_location_in_park(centrePos)) - return 0; + return false; int32_t centreWaterZ = (tile_element_water_height(centrePos)); if (centreWaterZ == 0) - return 0; + return false; // Check NxN area around centre tile defined by SquareSize constexpr int32_t SquareSize = 7; @@ -463,7 +462,7 @@ static int32_t scenario_create_ducks() // Must be at least 25 water tiles of the same height in 7x7 area if (waterTiles < 25) - return 0; + return false; // Set x, y to the centre of the tile centrePos.x += 16; @@ -481,7 +480,7 @@ static int32_t scenario_create_ducks() create_duck(targetPos); } - return 1; + return true; } const random_engine_t::state_type& scenario_rand_state() diff --git a/src/openrct2/scenario/Scenario.h b/src/openrct2/scenario/Scenario.h index 5b6c97483e..56e06876e0 100644 --- a/src/openrct2/scenario/Scenario.h +++ b/src/openrct2/scenario/Scenario.h @@ -395,6 +395,7 @@ extern char gScenarioFileName[260]; void load_from_sc6(const char* path); void scenario_begin(); void scenario_update(); +bool scenario_create_ducks(); const random_engine_t::state_type& scenario_rand_state(); void scenario_rand_seed(random_engine_t::result_type s0, random_engine_t::result_type s1);