Merge pull request #8235 from Broxzier/ui/climate

Move climate setting from objective to scenario settings window
This commit is contained in:
Hielke Morsink 2018-11-09 00:10:52 +01:00 committed by GitHub
commit 18f1fab2cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 359 additions and 213 deletions

View File

@ -3729,6 +3729,7 @@ STR_6265 :{SMALLFONT}{BLACK}When enabled, your operating system's file browse
STR_6266 :Open custom content folder
STR_6267 :Open tile inspector
STR_6268 :Advance to next tick
STR_6269 :Invalid climate ID
#############
# Scenarios #

View File

@ -11,6 +11,7 @@
- Feature: [#8099] Add Powered Launch mode to Inverted RC (for RCT1 parity).
- Feature: [#8190] Allow building footpaths on 'corner down' terrain.
- Feature: [#8191] Allow building on-ride photos and water S-bends on the Water Coaster.
- Change: [#8222] The climate setting has been moved from objective options to scenario options.
- Fix: [#6191] OpenRCT2 fails to run when the path has an emoji in it.
- Fix: [#7473] Disabling sound effects also disables "Disable audio on focus loss".
- Fix: [#7828] Copied entrances and exits stay when demolishing ride.

View File

@ -7,20 +7,26 @@
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include <openrct2-ui/interface/Dropdown.h>
#include <openrct2-ui/interface/Widget.h>
#include <openrct2-ui/windows/Window.h>
#include "../interface/Dropdown.h"
#include "../interface/Widget.h"
#include "../interface/Window.h"
#include "Window.h"
#include <openrct2/Context.h>
#include <openrct2/Game.h>
#include <openrct2/OpenRCT2.h>
#include <openrct2/actions/ParkSetNameAction.hpp>
#include <openrct2/core/Util.hpp>
#include <openrct2/drawing/Drawing.h>
#include <openrct2/drawing/Font.h>
#include <openrct2/interface/Colour.h>
#include <openrct2/localisation/Date.h>
#include <openrct2/localisation/Language.h>
#include <openrct2/localisation/Localisation.h>
#include <openrct2/localisation/StringIds.h>
#include <openrct2/ride/Ride.h>
#include <openrct2/scenario/Scenario.h>
#include <openrct2/sprites.h>
#include <openrct2/util/Util.h>
#include <openrct2/world/Climate.h>
#include <openrct2/world/Park.h>
#pragma region Widgets
@ -32,13 +38,6 @@ enum {
WINDOW_EDITOR_OBJECTIVE_OPTIONS_PAGE_COUNT
};
static constexpr const rct_string_id ClimateNames[] = {
STR_CLIMATE_COOL_AND_WET,
STR_CLIMATE_WARM,
STR_CLIMATE_HOT_AND_DRY,
STR_CLIMATE_COLD,
};
static constexpr const rct_string_id ObjectiveDropdownOptionNames[] = {
STR_OBJECTIVE_DROPDOWN_NONE,
STR_OBJECTIVE_DROPDOWN_NUMBER_OF_GUESTS_AT_A_GIVEN_DATE,
@ -70,8 +69,6 @@ enum {
WIDX_OBJECTIVE_ARG_2,
WIDX_OBJECTIVE_ARG_2_INCREASE,
WIDX_OBJECTIVE_ARG_2_DECREASE,
WIDX_CLIMATE,
WIDX_CLIMATE_DROPDOWN,
WIDX_PARK_NAME,
WIDX_SCENARIO_NAME,
WIDX_CATEGORY,
@ -86,8 +83,8 @@ enum {
{ WWT_CAPTION, 0, 1, 448, 1, 14, STR_OBJECTIVE_SELECTION, STR_WINDOW_TITLE_TIP }, \
{ WWT_CLOSEBOX, 0, 437, 447, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, \
{ WWT_RESIZE, 1, 0, 279, 43, 148, STR_NONE, STR_NONE }, \
{ WWT_TAB, 1, 3, 33, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SELECT_OBJECTIVE_AND_PARK_NAME_TIP }, \
{ WWT_TAB, 1, 34, 64, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SELECT_RIDES_TO_BE_PRESERVED_TIP }
{ WWT_TAB, 1, 3, 33, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SELECT_OBJECTIVE_AND_PARK_NAME_TIP }, \
{ WWT_TAB, 1, 34, 64, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SELECT_RIDES_TO_BE_PRESERVED_TIP }
static rct_widget window_editor_objective_options_main_widgets[] = {
MAIN_OBJECTIVE_OPTIONS_WIDGETS,
@ -95,19 +92,17 @@ static rct_widget window_editor_objective_options_main_widgets[] = {
{ WWT_BUTTON, 1, 430, 440, 49, 58, STR_DROPDOWN_GLYPH, STR_SELECT_OBJECTIVE_FOR_THIS_SCENARIO_TIP },
SPINNER_WIDGETS (1, 158, 277, 65, 76, STR_NONE, STR_NONE), // NB: 3 widgets
SPINNER_WIDGETS (1, 158, 277, 82, 93, STR_NONE, STR_NONE), // NB: 3 widgets
{ WWT_DROPDOWN, 1, 98, 277, 99, 110, STR_NONE, STR_SELECT_CLIMATE_TIP },
{ WWT_BUTTON, 1, 266, 276, 100, 109, STR_DROPDOWN_GLYPH, STR_SELECT_CLIMATE_TIP },
{ WWT_BUTTON, 1, 370, 444, 116, 127, STR_CHANGE, STR_CHANGE_NAME_OF_PARK_TIP },
{ WWT_BUTTON, 1, 370, 444, 133, 144, STR_CHANGE, STR_CHANGE_NAME_OF_SCENARIO_TIP },
{ WWT_DROPDOWN, 1, 98, 277, 150, 161, STR_NONE, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN },
{ WWT_BUTTON, 1, 266, 276, 151, 160, STR_DROPDOWN_GLYPH, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN },
{ WWT_BUTTON, 1, 370, 444, 167, 178, STR_CHANGE, STR_CHANGE_DETAIL_NOTES_ABOUT_PARK_SCENARIO_TIP },
{ WWT_BUTTON, 1, 370, 444, 99, 110, STR_CHANGE, STR_CHANGE_NAME_OF_PARK_TIP },
{ WWT_BUTTON, 1, 370, 444, 116, 127, STR_CHANGE, STR_CHANGE_NAME_OF_SCENARIO_TIP },
{ WWT_DROPDOWN, 1, 98, 277, 133, 144, STR_NONE, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN },
{ WWT_BUTTON, 1, 266, 276, 134, 143, STR_DROPDOWN_GLYPH, STR_SELECT_WHICH_GROUP_THIS_SCENARIO_APPEARS_IN },
{ WWT_BUTTON, 1, 370, 444, 150, 161, STR_CHANGE, STR_CHANGE_DETAIL_NOTES_ABOUT_PARK_SCENARIO_TIP },
{ WIDGETS_END }
};
static rct_widget window_editor_objective_options_rides_widgets[] = {
MAIN_OBJECTIVE_OPTIONS_WIDGETS,
{ WWT_SCROLL, 1, 3, 376, 60, 220, SCROLL_VERTICAL, STR_NONE },
{ WWT_SCROLL, 1, 3, 376, 60, 220, SCROLL_VERTICAL, STR_NONE },
{ WIDGETS_END }
};
@ -222,8 +217,6 @@ static uint64_t window_editor_objective_options_page_enabled_widgets[] = {
(1 << WIDX_OBJECTIVE_ARG_1_DECREASE) |
(1 << WIDX_OBJECTIVE_ARG_2_INCREASE) |
(1 << WIDX_OBJECTIVE_ARG_2_DECREASE) |
(1 << WIDX_CLIMATE) |
(1 << WIDX_CLIMATE_DROPDOWN) |
(1 << WIDX_PARK_NAME) |
(1 << WIDX_SCENARIO_NAME) |
(1 << WIDX_CATEGORY) |
@ -501,24 +494,6 @@ static void window_editor_objective_options_show_objective_dropdown(rct_window*
}
}
static void window_editor_objective_options_show_climate_dropdown(rct_window* w)
{
int32_t i;
rct_widget* dropdownWidget;
dropdownWidget = &w->widgets[WIDX_CLIMATE];
for (i = 0; i < 4; i++)
{
gDropdownItemsFormat[i] = STR_DROPDOWN_MENU_LABEL;
gDropdownItemsArgs[i] = ClimateNames[i];
}
window_dropdown_show_text_custom_width(
w->x + dropdownWidget->left, w->y + dropdownWidget->top, dropdownWidget->bottom - dropdownWidget->top + 1,
w->colours[1], 0, DROPDOWN_FLAG_STAY_OPEN, 4, dropdownWidget->right - dropdownWidget->left - 3);
dropdown_set_checked(gClimate, true);
}
static void window_editor_objective_options_show_category_dropdown(rct_window* w)
{
int32_t i;
@ -714,9 +689,6 @@ static void window_editor_objective_options_main_mousedown(rct_window* w, rct_wi
case WIDX_OBJECTIVE_ARG_2_DECREASE:
window_editor_objective_options_arg_2_decrease(w);
break;
case WIDX_CLIMATE_DROPDOWN:
window_editor_objective_options_show_climate_dropdown(w);
break;
case WIDX_CATEGORY_DROPDOWN:
window_editor_objective_options_show_category_dropdown(w);
break;
@ -742,13 +714,6 @@ static void window_editor_objective_options_main_dropdown(rct_window* w, rct_wid
if (gScenarioObjectiveType != newObjectiveType)
window_editor_objective_options_set_objective(w, newObjectiveType);
break;
case WIDX_CLIMATE_DROPDOWN:
if (gClimate != (uint8_t)dropdownIndex)
{
gClimate = (uint8_t)dropdownIndex;
window_invalidate(w);
}
break;
case WIDX_CATEGORY_DROPDOWN:
if (gS6Info.category != (uint8_t)dropdownIndex)
{
@ -777,14 +742,12 @@ static void window_editor_objective_options_main_update(rct_window* w)
// Reset objective if invalid
if (((parkFlags & PARK_FLAGS_NO_MONEY_SCENARIO) &&
// The following objectives are the only valid objectives when there is no money
objectiveType != OBJECTIVE_HAVE_FUN && objectiveType != OBJECTIVE_10_ROLLERCOASTERS
&& objectiveType != OBJECTIVE_GUESTS_AND_RATING && objectiveType != OBJECTIVE_10_ROLLERCOASTERS_LENGTH
&& objectiveType != OBJECTIVE_FINISH_5_ROLLERCOASTERS)
|| (
// The park must be free for the monthly ride income objective
!(parkFlags & PARK_FLAGS_PARK_FREE_ENTRY) && objectiveType == OBJECTIVE_MONTHLY_RIDE_INCOME))
// The park must be free for the monthly ride income objective
|| (!(parkFlags & PARK_FLAGS_PARK_FREE_ENTRY) && objectiveType == OBJECTIVE_MONTHLY_RIDE_INCOME))
{
// Reset objective
window_editor_objective_options_set_objective(w, OBJECTIVE_GUESTS_AND_RATING);
@ -975,17 +938,6 @@ static void window_editor_objective_options_main_paint(rct_window* w, rct_drawpi
gfx_draw_string_left(dpi, STR_WINDOW_OBJECTIVE_VALUE_DATE, &arg, COLOUR_BLACK, x, y);
}
// Climate label
x = w->x + 8;
y = w->y + w->widgets[WIDX_CLIMATE].top;
gfx_draw_string_left(dpi, STR_CLIMATE_LABEL, nullptr, COLOUR_BLACK, x, y);
// Climate value
x = w->x + w->widgets[WIDX_CLIMATE].left + 1;
y = w->y + w->widgets[WIDX_CLIMATE].top;
stringId = ClimateNames[gClimate];
gfx_draw_string_left(dpi, STR_WINDOW_COLOUR_2_STRINGID, &stringId, COLOUR_BLACK, x, y);
// Park name
x = w->x + 8;
y = w->y + w->widgets[WIDX_PARK_NAME].top;

View File

@ -7,19 +7,24 @@
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#include "../interface/Dropdown.h"
#include "../interface/Widget.h"
#include "../interface/Window.h"
#include "Window.h"
#include <algorithm>
#include <openrct2-ui/interface/Dropdown.h>
#include <openrct2-ui/interface/Widget.h>
#include <openrct2-ui/windows/Window.h>
#include <openrct2/Context.h>
#include <openrct2/Editor.h>
#include <openrct2/Game.h>
#include <openrct2/OpenRCT2.h>
#include <openrct2/actions/ClimateSetAction.hpp>
#include <openrct2/drawing/Drawing.h>
#include <openrct2/localisation/Localisation.h>
#include <openrct2/interface/Colour.h>
#include <openrct2/localisation/StringIds.h>
#include <openrct2/management/Finance.h>
#include <openrct2/peep/Peep.h>
#include <openrct2/sprites.h>
#include <openrct2/world/Climate.h>
#include <openrct2/world/Park.h>
#pragma region Widgets
@ -32,6 +37,13 @@ enum {
WINDOW_EDITOR_SCENARIO_OPTIONS_PAGE_COUNT
};
static constexpr const rct_string_id ClimateNames[] = {
STR_CLIMATE_COOL_AND_WET,
STR_CLIMATE_WARM,
STR_CLIMATE_HOT_AND_DRY,
STR_CLIMATE_COLD,
};
enum {
WIDX_BACKGROUND,
WIDX_TITLE,
@ -40,8 +52,10 @@ enum {
WIDX_TAB_1,
WIDX_TAB_2,
WIDX_TAB_3,
WIDX_PAGE_START,
WIDX_NO_MONEY = 7,
// Financial tab
WIDX_NO_MONEY = WIDX_PAGE_START,
WIDX_INITIAL_CASH,
WIDX_INITIAL_CASH_INCREASE,
WIDX_INITIAL_CASH_DECREASE,
@ -56,7 +70,8 @@ enum {
WIDX_INTEREST_RATE_DECREASE,
WIDX_FORBID_MARKETING,
WIDX_CASH_PER_GUEST = 7,
// Guests tab
WIDX_CASH_PER_GUEST = WIDX_PAGE_START,
WIDX_CASH_PER_GUEST_INCREASE,
WIDX_CASH_PER_GUEST_DECREASE,
WIDX_GUEST_INITIAL_HAPPINESS,
@ -71,7 +86,8 @@ enum {
WIDX_GUEST_PREFER_LESS_INTENSE_RIDES,
WIDX_GUEST_PREFER_MORE_INTENSE_RIDES,
WIDX_LAND_COST = 7,
// Park tab
WIDX_LAND_COST = WIDX_PAGE_START,
WIDX_LAND_COST_INCREASE,
WIDX_LAND_COST_DECREASE,
WIDX_CONSTRUCTION_RIGHTS_COST,
@ -82,6 +98,8 @@ enum {
WIDX_ENTRY_PRICE,
WIDX_ENTRY_PRICE_INCREASE,
WIDX_ENTRY_PRICE_DECREASE,
WIDX_CLIMATE,
WIDX_CLIMATE_DROPDOWN,
WIDX_FORBID_TREE_REMOVAL,
WIDX_FORBID_LANDSCAPE_CHANGES,
WIDX_FORBID_HIGH_CONSTRUCTION,
@ -94,9 +112,9 @@ static rct_widget window_editor_scenario_options_financial_widgets[] = {
{ WWT_CAPTION, 0, 1, 278, 1, 14, STR_SCENARIO_OPTIONS_FINANCIAL, STR_WINDOW_TITLE_TIP },
{ WWT_CLOSEBOX, 0, 267, 277, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
{ WWT_RESIZE, 1, 0, 279, 43, 148, STR_NONE, STR_NONE },
{ WWT_TAB, 1, 3, 33, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_FINANCIAL_TIP },
{ WWT_TAB, 1, 34, 64, 17, 46, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_GUESTS_TIP },
{ WWT_TAB, 1, 65, 95, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_PARK_TIP },
{ WWT_TAB, 1, 3, 33, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_FINANCIAL_TIP },
{ WWT_TAB, 1, 34, 64, 17, 46, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_GUESTS_TIP },
{ WWT_TAB, 1, 65, 95, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_PARK_TIP },
{ WWT_CHECKBOX, 1, 8, 271, 48, 59, STR_MAKE_PARK_NO_MONEY, STR_MAKE_PARK_NO_MONEY_TIP },
SPINNER_WIDGETS (1, 168, 267, 65, 76, STR_NONE, STR_NONE ), // NB: 3 widgets
@ -112,9 +130,9 @@ static rct_widget window_editor_scenario_options_guests_widgets[] = {
{ WWT_CAPTION, 0, 1, 278, 1, 14, STR_SCENARIO_OPTIONS_GUESTS, STR_WINDOW_TITLE_TIP },
{ WWT_CLOSEBOX, 0, 267, 277, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
{ WWT_RESIZE, 1, 0, 279, 43, 148, STR_NONE, STR_NONE },
{ WWT_TAB, 1, 3, 33, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_FINANCIAL_TIP },
{ WWT_TAB, 1, 34, 64, 17, 46, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_GUESTS_TIP },
{ WWT_TAB, 1, 65, 95, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_PARK_TIP },
{ WWT_TAB, 1, 3, 33, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_FINANCIAL_TIP },
{ WWT_TAB, 1, 34, 64, 17, 46, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_GUESTS_TIP },
{ WWT_TAB, 1, 65, 95, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_PARK_TIP },
SPINNER_WIDGETS (1, 268, 337, 48, 59, STR_NONE, STR_NONE ), // NB: 3 widgets
SPINNER_WIDGETS (1, 268, 337, 65, 76, STR_NONE, STR_NONE ), // NB: 3 widgets
@ -130,20 +148,22 @@ static rct_widget window_editor_scenario_options_park_widgets[] = {
{ WWT_CAPTION, 0, 1, 278, 1, 14, STR_SCENARIO_OPTIONS_PARK, STR_WINDOW_TITLE_TIP },
{ WWT_CLOSEBOX, 0, 267, 277, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
{ WWT_RESIZE, 1, 0, 279, 43, 148, STR_NONE, STR_NONE },
{ WWT_TAB, 1, 3, 33, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_FINANCIAL_TIP },
{ WWT_TAB, 1, 34, 64, 17, 46, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_GUESTS_TIP },
{ WWT_TAB, 1, 65, 95, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_PARK_TIP },
{ WWT_TAB, 1, 3, 33, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_FINANCIAL_TIP },
{ WWT_TAB, 1, 34, 64, 17, 46, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_GUESTS_TIP },
{ WWT_TAB, 1, 65, 95, 17, 43, IMAGE_TYPE_REMAP | SPR_TAB, STR_SCENARIO_OPTIONS_PARK_TIP },
SPINNER_WIDGETS (1, 188, 257, 48, 59, STR_NONE, STR_NONE ), // NB: 3 widgets
SPINNER_WIDGETS (1, 188, 257, 65, 76, STR_NONE, STR_NONE ), // NB: 3 widgets
{ WWT_DROPDOWN, 1, 8, 217, 82, 93, STR_NONE, STR_PAY_FOR_PARK_PAY_FOR_RIDES_TIP },
{ WWT_BUTTON, 1, 206, 216, 83, 92, STR_DROPDOWN_GLYPH, STR_PAY_FOR_PARK_PAY_FOR_RIDES_TIP },
SPINNER_WIDGETS (1, 328, 397, 82, 93, STR_NONE, STR_NONE ), // NB: 3 widgets
{ WWT_CHECKBOX, 1, 8, 391, 99, 110, STR_FORBID_TREE_REMOVAL, STR_FORBID_TREE_REMOVAL_TIP },
{ WWT_CHECKBOX, 1, 8, 391, 116, 127, STR_FORBID_LANDSCAPE_CHANGES, STR_FORBID_LANDSCAPE_CHANGES_TIP },
{ WWT_CHECKBOX, 1, 8, 391, 133, 144, STR_FORBID_HIGH_CONSTRUCTION, STR_FORBID_HIGH_CONSTRUCTION_TIP },
{ WWT_CHECKBOX, 1, 8, 391, 150, 161, STR_HARD_PARK_RATING, STR_HARD_PARK_RATING_TIP },
{ WWT_CHECKBOX, 1, 8, 391, 167, 178, STR_HARD_GUEST_GENERATION, STR_HARD_GUEST_GENERATION_TIP },
SPINNER_WIDGETS (1, 328, 394, 82, 93, STR_NONE, STR_NONE ), // NB: 3 widgets
{ WWT_DROPDOWN, 1, 188, 394, 99, 110, STR_NONE, STR_SELECT_CLIMATE_TIP },
{ WWT_BUTTON, 1, 383, 393, 100, 109, STR_DROPDOWN_GLYPH, STR_SELECT_CLIMATE_TIP },
{ WWT_CHECKBOX, 1, 8, 391, 116, 127, STR_FORBID_TREE_REMOVAL, STR_FORBID_TREE_REMOVAL_TIP },
{ WWT_CHECKBOX, 1, 8, 391, 133, 144, STR_FORBID_LANDSCAPE_CHANGES, STR_FORBID_LANDSCAPE_CHANGES_TIP },
{ WWT_CHECKBOX, 1, 8, 391, 150, 161, STR_FORBID_HIGH_CONSTRUCTION, STR_FORBID_HIGH_CONSTRUCTION_TIP },
{ WWT_CHECKBOX, 1, 8, 391, 167, 178, STR_HARD_PARK_RATING, STR_HARD_PARK_RATING_TIP },
{ WWT_CHECKBOX, 1, 8, 391, 184, 195, STR_HARD_GUEST_GENERATION, STR_HARD_GUEST_GENERATION_TIP },
{ WIDGETS_END }
};
@ -323,6 +343,8 @@ static uint64_t window_editor_scenario_options_page_enabled_widgets[] = {
(1ULL << WIDX_PAY_FOR_PARK_OR_RIDES_DROPDOWN) |
(1ULL << WIDX_ENTRY_PRICE_INCREASE) |
(1ULL << WIDX_ENTRY_PRICE_DECREASE) |
(1ULL << WIDX_CLIMATE) |
(1ULL << WIDX_CLIMATE_DROPDOWN) |
(1ULL << WIDX_FORBID_TREE_REMOVAL) |
(1ULL << WIDX_FORBID_LANDSCAPE_CHANGES) |
(1ULL << WIDX_FORBID_HIGH_CONSTRUCTION) |
@ -510,6 +532,24 @@ static void window_editor_scenario_options_financial_resize(rct_window* w)
window_set_resize(w, 280, 149, 280, 149);
}
static void window_editor_scenario_options_show_climate_dropdown(rct_window* w)
{
int32_t i;
rct_widget* dropdownWidget;
dropdownWidget = &w->widgets[WIDX_CLIMATE];
for (i = 0; i < CLIMATE_COUNT; i++)
{
gDropdownItemsFormat[i] = STR_DROPDOWN_MENU_LABEL;
gDropdownItemsArgs[i] = ClimateNames[i];
}
window_dropdown_show_text_custom_width(
w->x + dropdownWidget->left, w->y + dropdownWidget->top, dropdownWidget->bottom - dropdownWidget->top + 1,
w->colours[1], 0, DROPDOWN_FLAG_STAY_OPEN, CLIMATE_COUNT, dropdownWidget->right - dropdownWidget->left - 3);
dropdown_set_checked(gClimate, true);
}
/**
*
* rct2: 0x006704C8
@ -1095,7 +1135,7 @@ static void window_editor_scenario_options_park_mouseup(rct_window* w, rct_widge
*/
static void window_editor_scenario_options_park_resize(rct_window* w)
{
window_set_resize(w, 400, 183, 400, 183);
window_set_resize(w, 400, 200, 400, 200);
}
/**
@ -1208,6 +1248,9 @@ static void window_editor_scenario_options_park_mousedown(rct_window* w, rct_wid
dropdown_set_checked(1, true);
break;
case WIDX_CLIMATE_DROPDOWN:
window_editor_scenario_options_show_climate_dropdown(w);
break;
}
}
@ -1217,12 +1260,27 @@ static void window_editor_scenario_options_park_mousedown(rct_window* w, rct_wid
*/
static void window_editor_scenario_options_park_dropdown(rct_window* w, rct_widgetindex widgetIndex, int32_t dropdownIndex)
{
if (widgetIndex == WIDX_PAY_FOR_PARK_OR_RIDES_DROPDOWN && dropdownIndex != -1)
if (dropdownIndex == -1)
{
game_do_command(
0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETPARKCHARGEMETHOD, dropdownIndex,
GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0);
window_invalidate(w);
return;
}
switch (widgetIndex)
{
case WIDX_PAY_FOR_PARK_OR_RIDES_DROPDOWN:
game_do_command(
0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETPARKCHARGEMETHOD, dropdownIndex,
GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0);
window_invalidate(w);
break;
case WIDX_CLIMATE_DROPDOWN:
if (gClimate != (uint8_t)dropdownIndex)
{
auto gameAction = ClimateSetAction(dropdownIndex);
GameActions::Execute(&gameAction);
}
break;
}
}
@ -1382,6 +1440,17 @@ static void window_editor_scenario_options_park_paint(rct_window* w, rct_drawpix
arg = gParkEntranceFee;
gfx_draw_string_left(dpi, STR_CURRENCY_FORMAT_LABEL, &arg, COLOUR_BLACK, x, y);
}
// Climate label
x = w->x + 8;
y = w->y + w->widgets[WIDX_CLIMATE].top;
gfx_draw_string_left(dpi, STR_CLIMATE_LABEL, nullptr, COLOUR_BLACK, x, y);
// Climate value
x = w->x + w->widgets[WIDX_CLIMATE].left + 1;
y = w->y + w->widgets[WIDX_CLIMATE].top;
stringId = ClimateNames[gClimate];
gfx_draw_string_left(dpi, STR_WINDOW_COLOUR_2_STRINGID, &stringId, COLOUR_BLACK, x, y);
}
#pragma endregion

View File

@ -89,7 +89,8 @@ enum GAME_COMMAND
GAME_COMMAND_MODIFY_TILE,
GAME_COMMAND_EDIT_SCENARIO_OPTIONS,
GAME_COMMAND_PLACE_PEEP_SPAWN, // GA, TODO: refactor to separate array for just game actions
GAME_COMMAND_COUNT
GAME_COMMAND_SET_CLIMATE, // GA
GAME_COMMAND_COUNT,
};
enum : uint32_t

View File

@ -0,0 +1,59 @@
/*****************************************************************************
* Copyright (c) 2014-2018 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
*
* OpenRCT2 is licensed under the GNU General Public License version 3.
*****************************************************************************/
#pragma once
#include "../world/Climate.h"
#include "GameAction.h"
struct ClimateSetAction : public GameActionBase<GAME_COMMAND_SET_CLIMATE, GameActionResult>
{
using climate_t = decltype(gClimate);
private:
climate_t _climate;
public:
ClimateSetAction() = default;
ClimateSetAction(climate_t climate)
: _climate(climate)
{
}
uint16_t GetActionFlags() const override
{
return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED;
}
void Serialise(DataSerialiser& stream) override
{
GameAction::Serialise(stream);
stream << _climate;
}
GameActionResult::Ptr Query() const override
{
if (_climate >= CLIMATE_COUNT)
{
return std::make_unique<GameActionResult>(GA_ERROR::INVALID_PARAMETERS, STR_INVALID_CLIMATE_ID, STR_NONE);
}
return std::make_unique<GameActionResult>();
}
GameActionResult::Ptr Execute() const override
{
gClimate = _climate;
gfx_invalidate_screen();
return std::make_unique<GameActionResult>();
}
};

View File

@ -8,6 +8,7 @@
*****************************************************************************/
#include "BannerSetNameAction.hpp"
#include "ClimateSetAction.hpp"
#include "FootpathRemoveAction.hpp"
#include "GameAction.h"
#include "GuestSetNameAction.hpp"
@ -32,24 +33,25 @@ namespace GameActions
{
void Register()
{
Register<SetParkEntranceFeeAction>();
Register<BannerSetNameAction>();
Register<ClimateSetAction>();
Register<FootpathRemoveAction>();
Register<GuestSetNameAction>();
Register<MazeSetTrackAction>();
Register<ParkMarketingAction>();
Register<ParkSetLoanAction>();
Register<ParkSetNameAction>();
Register<ParkSetResearchFundingAction>();
Register<PlaceParkEntranceAction>();
Register<PlacePeepSpawnAction>();
Register<RideCreateAction>();
Register<RideSetStatusAction>();
Register<RideSetNameAction>();
Register<RideDemolishAction>();
Register<GuestSetNameAction>();
Register<RideSetNameAction>();
Register<RideSetStatusAction>();
Register<SetParkEntranceFeeAction>();
Register<SignSetNameAction>();
Register<StaffSetColourAction>();
Register<StaffSetNameAction>();
Register<PlacePeepSpawnAction>();
Register<MazeSetTrackAction>();
Register<SignSetNameAction>();
Register<ParkSetNameAction>();
Register<BannerSetNameAction>();
Register<WallRemoveAction>();
Register<FootpathRemoveAction>();
}
} // namespace GameActions

View File

@ -14,6 +14,7 @@
#include "../Game.h"
#include "../OpenRCT2.h"
#include "../Version.h"
#include "../actions/ClimateSetAction.hpp"
#include "../config/Config.h"
#include "../core/Guard.hpp"
#include "../core/String.hpp"
@ -49,9 +50,15 @@
#ifndef NO_TTF
# include "../drawing/TTF.h"
#endif
static constexpr const utf8* ClimateNames[] = {
"cool_and_wet",
"warm",
"hot_and_dry",
"cold",
};
static void console_write_all_commands(InteractiveConsole& console);
static int32_t console_parse_int(const utf8* src, bool* valid);
static double console_parse_double(const utf8* src, bool* valid);
@ -558,8 +565,7 @@ static int32_t cc_get(InteractiveConsole& console, const utf8** argv, int32_t ar
}
else if (strcmp(argv[0], "climate") == 0)
{
const utf8* climate_names[] = { "cool_and_wet", "warm", "hot_and_dry", "cold" };
console.WriteFormatLine("climate %s (%d)", climate_names[gClimate], gClimate);
console.WriteFormatLine("climate %s (%d)", ClimateNames[gClimate], gClimate);
}
else if (strcmp(argv[0], "game_speed") == 0)
{
@ -804,21 +810,30 @@ static int32_t cc_set(InteractiveConsole& console, const utf8** argv, int32_t ar
{
if (int_valid[0])
{
gClimate = std::clamp(int_val[0], 0, 3);
const auto newClimate = int_val[0];
if (newClimate < 0 || newClimate >= CLIMATE_COUNT)
{
console.WriteLine(language_get_string(STR_INVALID_CLIMATE_ID));
}
else
{
auto gameAction = ClimateSetAction(newClimate);
GameActions::Execute(&gameAction);
}
}
else
{
const utf8* climate_names[] = { "cool_and_wet", "warm", "hot_and_dry", "cold" };
for (i = 0; i < 4; i++)
for (i = 0; i < CLIMATE_COUNT; i++)
{
if (strcmp(argv[1], climate_names[i]) == 0)
if (strcmp(argv[1], ClimateNames[i]) == 0)
{
gClimate = i;
break;
}
}
}
if (i == 4)
if (i == CLIMATE_COUNT)
invalidArgs = true;
else
console.Execute("get climate");

View File

@ -3897,6 +3897,8 @@ enum
STR_ADVANCE_TO_NEXT_TICK = 6268,
STR_INVALID_CLIMATE_ID = 6269,
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
STR_COUNT = 32768
};

View File

@ -28,7 +28,7 @@
// This string 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 "8"
#define NETWORK_STREAM_VERSION "9"
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
static rct_peep* _pickup_peep = nullptr;

View File

@ -47,47 +47,58 @@ int32_t NetworkActions::FindCommandByPermissionName(const std::string& permissio
return -1;
}
// clang-format off
const std::vector<NetworkAction> NetworkActions::Actions =
{
const std::vector<NetworkAction> NetworkActions::Actions = {
{
STR_ACTION_CHAT, "PERMISSION_CHAT",
STR_ACTION_CHAT,
"PERMISSION_CHAT",
{
MISC_COMMAND_CHAT
}
}, {
STR_ACTION_TERRAFORM, "PERMISSION_TERRAFORM",
MISC_COMMAND_CHAT,
},
},
{
STR_ACTION_TERRAFORM,
"PERMISSION_TERRAFORM",
{
GAME_COMMAND_SET_LAND_HEIGHT,
GAME_COMMAND_RAISE_LAND,
GAME_COMMAND_LOWER_LAND,
GAME_COMMAND_EDIT_LAND_SMOOTH,
GAME_COMMAND_CHANGE_SURFACE_STYLE
}
}, {
STR_ACTION_SET_WATER_LEVEL, "PERMISSION_SET_WATER_LEVEL",
GAME_COMMAND_CHANGE_SURFACE_STYLE,
},
},
{
STR_ACTION_SET_WATER_LEVEL,
"PERMISSION_SET_WATER_LEVEL",
{
GAME_COMMAND_SET_WATER_HEIGHT,
GAME_COMMAND_RAISE_WATER,
GAME_COMMAND_LOWER_WATER
}
}, {
STR_ACTION_TOGGLE_PAUSE, "PERMISSION_TOGGLE_PAUSE",
GAME_COMMAND_LOWER_WATER,
},
},
{
STR_ACTION_TOGGLE_PAUSE,
"PERMISSION_TOGGLE_PAUSE",
{
GAME_COMMAND_TOGGLE_PAUSE
}
}, {
STR_ACTION_CREATE_RIDE, "PERMISSION_CREATE_RIDE",
GAME_COMMAND_TOGGLE_PAUSE,
},
},
{
STR_ACTION_CREATE_RIDE,
"PERMISSION_CREATE_RIDE",
{
GAME_COMMAND_CREATE_RIDE
}
}, {
STR_ACTION_REMOVE_RIDE, "PERMISSION_REMOVE_RIDE",
GAME_COMMAND_CREATE_RIDE,
},
},
{
STR_ACTION_REMOVE_RIDE,
"PERMISSION_REMOVE_RIDE",
{
GAME_COMMAND_DEMOLISH_RIDE
}
}, {
STR_ACTION_BUILD_RIDE, "PERMISSION_BUILD_RIDE",
GAME_COMMAND_DEMOLISH_RIDE,
},
},
{
STR_ACTION_BUILD_RIDE,
"PERMISSION_BUILD_RIDE",
{
GAME_COMMAND_PLACE_TRACK,
GAME_COMMAND_REMOVE_TRACK,
@ -95,10 +106,12 @@ const std::vector<NetworkAction> NetworkActions::Actions =
GAME_COMMAND_PLACE_TRACK_DESIGN,
GAME_COMMAND_PLACE_MAZE_DESIGN,
GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT,
GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT
}
}, {
STR_ACTION_RIDE_PROPERTIES, "PERMISSION_RIDE_PROPERTIES",
GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT,
},
},
{
STR_ACTION_RIDE_PROPERTIES,
"PERMISSION_RIDE_PROPERTIES",
{
GAME_COMMAND_SET_RIDE_NAME,
GAME_COMMAND_SET_RIDE_APPEARANCE,
@ -106,10 +119,12 @@ const std::vector<NetworkAction> NetworkActions::Actions =
GAME_COMMAND_SET_RIDE_VEHICLES,
GAME_COMMAND_SET_RIDE_SETTING,
GAME_COMMAND_SET_RIDE_PRICE,
GAME_COMMAND_SET_BRAKES_SPEED
}
}, {
STR_ACTION_SCENERY, "PERMISSION_SCENERY",
GAME_COMMAND_SET_BRAKES_SPEED,
},
},
{
STR_ACTION_SCENERY,
"PERMISSION_SCENERY",
{
GAME_COMMAND_REMOVE_SCENERY,
GAME_COMMAND_PLACE_SCENERY,
@ -127,29 +142,37 @@ const std::vector<NetworkAction> NetworkActions::Actions =
GAME_COMMAND_SET_BANNER_NAME,
GAME_COMMAND_SET_SIGN_NAME,
GAME_COMMAND_SET_BANNER_STYLE,
GAME_COMMAND_SET_SIGN_STYLE
}
}, {
STR_ACTION_PATH, "PERMISSION_PATH",
GAME_COMMAND_SET_SIGN_STYLE,
},
},
{
STR_ACTION_PATH,
"PERMISSION_PATH",
{
GAME_COMMAND_PLACE_PATH,
GAME_COMMAND_PLACE_PATH_FROM_TRACK,
GAME_COMMAND_REMOVE_PATH
}
}, {
STR_ACTION_CLEAR_LANDSCAPE, "PERMISSION_CLEAR_LANDSCAPE",
GAME_COMMAND_REMOVE_PATH,
},
},
{
STR_ACTION_CLEAR_LANDSCAPE,
"PERMISSION_CLEAR_LANDSCAPE",
{
GAME_COMMAND_CLEAR_SCENERY
}
}, {
STR_ACTION_GUEST, "PERMISSION_GUEST",
GAME_COMMAND_CLEAR_SCENERY,
},
},
{
STR_ACTION_GUEST,
"PERMISSION_GUEST",
{
GAME_COMMAND_SET_GUEST_NAME,
GAME_COMMAND_PICKUP_GUEST,
GAME_COMMAND_BALLOON_PRESS
}
}, {
STR_ACTION_STAFF, "PERMISSION_STAFF",
GAME_COMMAND_BALLOON_PRESS,
},
},
{
STR_ACTION_STAFF,
"PERMISSION_STAFF",
{
GAME_COMMAND_HIRE_NEW_STAFF_MEMBER,
GAME_COMMAND_SET_STAFF_PATROL,
@ -157,10 +180,12 @@ const std::vector<NetworkAction> NetworkActions::Actions =
GAME_COMMAND_SET_STAFF_ORDER,
GAME_COMMAND_SET_STAFF_COLOUR,
GAME_COMMAND_SET_STAFF_NAME,
GAME_COMMAND_PICKUP_STAFF
}
}, {
STR_ACTION_PARK_PROPERTIES, "PERMISSION_PARK_PROPERTIES",
GAME_COMMAND_PICKUP_STAFF,
},
},
{
STR_ACTION_PARK_PROPERTIES,
"PERMISSION_PARK_PROPERTIES",
{
GAME_COMMAND_SET_PARK_NAME,
GAME_COMMAND_SET_PARK_OPEN,
@ -170,56 +195,74 @@ const std::vector<NetworkAction> NetworkActions::Actions =
GAME_COMMAND_PLACE_PARK_ENTRANCE,
GAME_COMMAND_REMOVE_PARK_ENTRANCE,
GAME_COMMAND_PLACE_PEEP_SPAWN,
}
}, {
STR_ACTION_PARK_FUNDING, "PERMISSION_PARK_FUNDING",
},
},
{
STR_ACTION_PARK_FUNDING,
"PERMISSION_PARK_FUNDING",
{
GAME_COMMAND_SET_CURRENT_LOAN,
GAME_COMMAND_SET_RESEARCH_FUNDING,
GAME_COMMAND_START_MARKETING_CAMPAIGN
}
}, {
STR_ACTION_KICK_PLAYER, "PERMISSION_KICK_PLAYER",
GAME_COMMAND_START_MARKETING_CAMPAIGN,
},
},
{
STR_ACTION_KICK_PLAYER,
"PERMISSION_KICK_PLAYER",
{
GAME_COMMAND_KICK_PLAYER
}
}, {
STR_ACTION_MODIFY_GROUPS, "PERMISSION_MODIFY_GROUPS",
GAME_COMMAND_KICK_PLAYER,
},
},
{
STR_ACTION_MODIFY_GROUPS,
"PERMISSION_MODIFY_GROUPS",
{
GAME_COMMAND_MODIFY_GROUPS
}
}, {
STR_ACTION_SET_PLAYER_GROUP, "PERMISSION_SET_PLAYER_GROUP",
GAME_COMMAND_MODIFY_GROUPS,
},
},
{
STR_ACTION_SET_PLAYER_GROUP,
"PERMISSION_SET_PLAYER_GROUP",
{
GAME_COMMAND_SET_PLAYER_GROUP
}
}, {
STR_ACTION_CHEAT, "PERMISSION_CHEAT",
GAME_COMMAND_SET_PLAYER_GROUP,
},
},
{
STR_ACTION_CHEAT,
"PERMISSION_CHEAT",
{
GAME_COMMAND_CHEAT
}
}, {
STR_ACTION_TOGGLE_SCENERY_CLUSTER, "PERMISSION_TOGGLE_SCENERY_CLUSTER",
GAME_COMMAND_CHEAT,
},
},
{
STR_ACTION_TOGGLE_SCENERY_CLUSTER,
"PERMISSION_TOGGLE_SCENERY_CLUSTER",
{
MISC_COMMAND_TOGGLE_SCENERY_CLUSTER
}
}, {
STR_ACTION_PASSWORDLESS_LOGIN, "PERMISSION_PASSWORDLESS_LOGIN",
MISC_COMMAND_TOGGLE_SCENERY_CLUSTER,
},
},
{
STR_ACTION_PASSWORDLESS_LOGIN,
"PERMISSION_PASSWORDLESS_LOGIN",
{
MISC_COMMAND_PASSWORDLESS_LOGIN
}
}, {
STR_ACTION_MODIFY_TILE, "PERMISSION_MODIFY_TILE",
MISC_COMMAND_PASSWORDLESS_LOGIN,
},
},
{
STR_ACTION_MODIFY_TILE,
"PERMISSION_MODIFY_TILE",
{
GAME_COMMAND_MODIFY_TILE
}
}, {
STR_ACTION_EDIT_SCENARIO_OPTIONS, "PERMISSION_EDIT_SCENARIO_OPTIONS",
GAME_COMMAND_MODIFY_TILE,
},
},
{
STR_ACTION_EDIT_SCENARIO_OPTIONS,
"PERMISSION_EDIT_SCENARIO_OPTIONS",
{
GAME_COMMAND_EDIT_SCENARIO_OPTIONS
}
}
GAME_COMMAND_EDIT_SCENARIO_OPTIONS,
GAME_COMMAND_SET_CLIMATE,
},
},
};
// clang-format on
#endif

View File

@ -17,7 +17,8 @@ enum CLIMATE
CLIMATE_COOL_AND_WET,
CLIMATE_WARM,
CLIMATE_HOT_AND_DRY,
CLIMATE_COLD
CLIMATE_COLD,
CLIMATE_COUNT,
};
enum WEATHER