mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-25 07:44:38 +01:00
Add window settings and save support for follow sprite command
This commit is contained in:
committed by
Aaron van Geffen
parent
500b0d09aa
commit
943747056e
@@ -4488,6 +4488,8 @@ STR_6178 :Load{MOVE_X}{87}{RED}Missing scenario
|
||||
STR_6179 :Select
|
||||
STR_6180 :No scenario selected
|
||||
STR_6181 :{RED}Missing scenario
|
||||
STR_6182 :Follow sprite
|
||||
STR_6183 :Select sprite
|
||||
|
||||
#############
|
||||
# Scenarios #
|
||||
|
||||
@@ -21,12 +21,14 @@
|
||||
|
||||
#include <openrct2/Game.h>
|
||||
#include <openrct2/Input.h>
|
||||
#include <openrct2/core/Util.hpp>
|
||||
#include <openrct2/interface/themes.h>
|
||||
#include <openrct2/interface/viewport.h>
|
||||
#include <openrct2/interface/widget.h>
|
||||
#include <openrct2/scenario/ScenarioRepository.h>
|
||||
#include <openrct2/scenario/ScenarioSources.h>
|
||||
#include <openrct2/localisation/localisation.h>
|
||||
#include <openrct2/sprites.h>
|
||||
#include <openrct2/util/Util.h>
|
||||
#include <openrct2-ui/interface/Dropdown.h>
|
||||
|
||||
@@ -41,15 +43,16 @@ static TITLE_COMMAND_ORDER _window_title_command_editor_orders[] = {
|
||||
{ TITLE_SCRIPT_LOAD, STR_TITLE_EDITOR_ACTION_LOAD_SAVE, STR_TITLE_EDITOR_ARGUMENT_SAVEFILE },
|
||||
{ TITLE_SCRIPT_LOADSC, STR_TITLE_EDITOR_ACTION_LOAD_SCENARIO, STR_TITLE_EDITOR_ARGUMENT_SCENARIO },
|
||||
{ TITLE_SCRIPT_LOCATION, STR_TITLE_EDITOR_COMMAND_TYPE_LOCATION, STR_TITLE_EDITOR_ARGUMENT_COORDINATES },
|
||||
{ TITLE_SCRIPT_ROTATE, STR_TITLE_EDITOR_COMMAND_TYPE_ROTATE, STR_TITLE_EDITOR_ARGUMENT_ROTATIONS },
|
||||
{ TITLE_SCRIPT_ZOOM, STR_TITLE_EDITOR_COMMAND_TYPE_ZOOM, STR_TITLE_EDITOR_ARGUMENT_ZOOM_LEVEL },
|
||||
{ TITLE_SCRIPT_SPEED, STR_TITLE_EDITOR_COMMAND_TYPE_SPEED, STR_TITLE_EDITOR_ARGUMENT_SPEED },
|
||||
{ TITLE_SCRIPT_WAIT, STR_TITLE_EDITOR_COMMAND_TYPE_WAIT, STR_TITLE_EDITOR_ARGUMENT_WAIT_SECONDS },
|
||||
{ TITLE_SCRIPT_RESTART, STR_TITLE_EDITOR_RESTART, STR_NONE },
|
||||
{ TITLE_SCRIPT_END, STR_TITLE_EDITOR_END, STR_NONE },
|
||||
{ TITLE_SCRIPT_ROTATE, STR_TITLE_EDITOR_COMMAND_TYPE_ROTATE, STR_TITLE_EDITOR_ARGUMENT_ROTATIONS },
|
||||
{ TITLE_SCRIPT_ZOOM, STR_TITLE_EDITOR_COMMAND_TYPE_ZOOM, STR_TITLE_EDITOR_ARGUMENT_ZOOM_LEVEL },
|
||||
{ TITLE_SCRIPT_SPEED, STR_TITLE_EDITOR_COMMAND_TYPE_SPEED, STR_TITLE_EDITOR_ARGUMENT_SPEED },
|
||||
{ TITLE_SCRIPT_FOLLOW, STR_TITLE_EDITOR_COMMAND_TYPE_FOLLOW, STR_NONE },
|
||||
{ TITLE_SCRIPT_WAIT, STR_TITLE_EDITOR_COMMAND_TYPE_WAIT, STR_TITLE_EDITOR_ARGUMENT_WAIT_SECONDS },
|
||||
{ TITLE_SCRIPT_RESTART, STR_TITLE_EDITOR_RESTART, STR_NONE },
|
||||
{ TITLE_SCRIPT_END, STR_TITLE_EDITOR_END, STR_NONE },
|
||||
};
|
||||
|
||||
#define NUM_COMMANDS 9
|
||||
#define NUM_COMMANDS Util::CountOf(_window_title_command_editor_orders)
|
||||
|
||||
enum WINDOW_WATER_WIDGET_IDX {
|
||||
WIDX_BACKGROUND,
|
||||
@@ -63,7 +66,9 @@ enum WINDOW_WATER_WIDGET_IDX {
|
||||
WIDX_INPUT,
|
||||
WIDX_INPUT_DROPDOWN,
|
||||
WIDX_GET,
|
||||
WIDX_SELECT,
|
||||
WIDX_SELECT_SCENARIO,
|
||||
WIDX_SELECT_SPRITE,
|
||||
WIDX_SPRITE_INDEX,
|
||||
WIDX_OKAY,
|
||||
WIDX_CANCEL
|
||||
};
|
||||
@@ -84,9 +89,9 @@ static TitleCommand command = { TITLE_SCRIPT_LOAD, { 0 } };
|
||||
static TitleSequence * _sequence = nullptr;
|
||||
|
||||
static rct_widget window_title_command_editor_widgets[] = {
|
||||
{ WWT_FRAME, 1, 0, WW-1, 0, WH-1, 0xFFFFFFFF, STR_NONE }, // panel / background
|
||||
{ WWT_CAPTION, 1, 1, WW-2, 1, 14, STR_TITLE_COMMAND_EDITOR_TITLE, STR_WINDOW_TITLE_TIP }, // title bar
|
||||
{ WWT_CLOSEBOX, 1, WW-13, WW-3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button
|
||||
{ WWT_FRAME, 1, 0, WW-1, 0, WH-1, 0xFFFFFFFF, STR_NONE }, // panel / background
|
||||
{ WWT_CAPTION, 1, 1, WW-2, 1, 14, STR_TITLE_COMMAND_EDITOR_TITLE, STR_WINDOW_TITLE_TIP }, // title bar
|
||||
{ WWT_CLOSEBOX, 1, WW-13, WW-3, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button
|
||||
{ WWT_DROPDOWN, 1, WS, WW-WS-1, BY, BY+11, STR_NONE, STR_NONE }, // Command dropdown
|
||||
{ WWT_DROPDOWN_BUTTON, 1, WW-WS-12, WW-WS-2, BY+1, BY+10, STR_DROPDOWN_GLYPH, STR_NONE },
|
||||
{ WWT_TEXT_BOX, 1, WS, WW-WS-1, BY2, BY2+11, STR_NONE, STR_NONE }, // full textbox
|
||||
@@ -100,16 +105,21 @@ static rct_widget window_title_command_editor_widgets[] = {
|
||||
{ WWT_DROPDOWN_BUTTON, 1, WS+WHA+3, WW-WS-1, BY2-14, BY2-3, STR_TITLE_COMMAND_EDITOR_ACTION_GET_LOCATION, STR_NONE }, // Get location/zoom/etc
|
||||
{ WWT_DROPDOWN_BUTTON, 1, WS+WHA+12, WW-WS-1, BY2-14, BY2-3, STR_TITLE_COMMAND_EDITOR_ACTION_SELECT_SCENARIO, STR_NONE }, // Select scenario
|
||||
|
||||
{ WWT_DROPDOWN_BUTTON, 1, WS, WW-WS-1, BY2-14, BY2-3, STR_TITLE_COMMAND_EDITOR_SELECT_SPRITE, STR_NONE }, // Select sprite
|
||||
{ WWT_SPINNER, 1, WS, WW-WS-1, BY2, BY2+11, (uint32) SPR_NONE, STR_NONE }, // Sprite index
|
||||
|
||||
{ WWT_DROPDOWN_BUTTON, 1, 10, 80, WH-21, WH-10, STR_OK, STR_NONE }, // OKAY
|
||||
{ WWT_DROPDOWN_BUTTON, 1, WW-80, WW-10, WH-21, WH-10, STR_CANCEL, STR_NONE }, // Cancel
|
||||
|
||||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
static void window_title_command_editor_close(rct_window * w);
|
||||
static void window_title_command_editor_mouseup(rct_window * w, rct_widgetindex widgetIndex);
|
||||
static void window_title_command_editor_mousedown(rct_window * w, rct_widgetindex widgetIndex, rct_widget * widget);
|
||||
static void window_title_command_editor_dropdown(rct_window * w, rct_widgetindex widgetIndex, sint32 dropdownIndex);
|
||||
static void window_title_command_editor_update(rct_window * w);
|
||||
static void window_title_command_editor_tool_down(rct_window * w, rct_widgetindex widgetIndex, sint32 x, sint32 y);
|
||||
static void window_title_command_editor_invalidate(rct_window * w);
|
||||
static void window_title_command_editor_paint(rct_window * w, rct_drawpixelinfo * dpi);
|
||||
static void window_title_command_editor_textinput(rct_window * w, rct_widgetindex widgetIndex, char * text);
|
||||
@@ -121,7 +131,7 @@ static LocationXY16 get_location();
|
||||
static uint8 get_zoom();
|
||||
|
||||
static rct_window_event_list window_title_command_editor_events = {
|
||||
nullptr,
|
||||
window_title_command_editor_close,
|
||||
window_title_command_editor_mouseup,
|
||||
nullptr,
|
||||
window_title_command_editor_mousedown,
|
||||
@@ -131,7 +141,7 @@ static rct_window_event_list window_title_command_editor_events = {
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
window_title_command_editor_tool_down,
|
||||
nullptr,
|
||||
nullptr,
|
||||
nullptr,
|
||||
@@ -212,6 +222,15 @@ static uint8 get_zoom()
|
||||
return zoom;
|
||||
}
|
||||
|
||||
static bool sprite_selector_tool_is_active()
|
||||
{
|
||||
if (!(input_test_flag(INPUT_FLAG_TOOL_ACTIVE)))
|
||||
return false;
|
||||
if (gCurrentToolWidget.window_classification != WC_TITLE_COMMAND_EDITOR)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void window_title_command_editor_open(TitleSequence * sequence, sint32 index, bool insert)
|
||||
{
|
||||
_sequence = sequence;
|
||||
@@ -241,7 +260,8 @@ void window_title_command_editor_open(TitleSequence * sequence, sint32 index, bo
|
||||
(1 << WIDX_INPUT) |
|
||||
(1 << WIDX_INPUT_DROPDOWN) |
|
||||
(1 << WIDX_GET) |
|
||||
(1 << WIDX_SELECT) |
|
||||
(1 << WIDX_SELECT_SCENARIO) |
|
||||
(1 << WIDX_SELECT_SPRITE) |
|
||||
(1 << WIDX_OKAY) |
|
||||
(1 << WIDX_CANCEL);
|
||||
window_init_scroll_widgets(window);
|
||||
@@ -273,6 +293,14 @@ void window_title_command_editor_open(TitleSequence * sequence, sint32 index, bo
|
||||
}
|
||||
}
|
||||
|
||||
static void window_title_command_editor_close(rct_window * w)
|
||||
{
|
||||
if (sprite_selector_tool_is_active())
|
||||
{
|
||||
tool_cancel();
|
||||
}
|
||||
}
|
||||
|
||||
static void window_title_command_editor_mouseup(rct_window * w, rct_widgetindex widgetIndex)
|
||||
{
|
||||
switch (widgetIndex)
|
||||
@@ -315,9 +343,15 @@ static void window_title_command_editor_mouseup(rct_window * w, rct_widgetindex
|
||||
}
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_SELECT:
|
||||
case WIDX_SELECT_SCENARIO:
|
||||
window_scenarioselect_open(scenario_select_callback, true);
|
||||
break;
|
||||
case WIDX_SELECT_SPRITE:
|
||||
if (!sprite_selector_tool_is_active())
|
||||
{
|
||||
tool_set(w, WIDX_BACKGROUND, TOOL_CROSSHAIR);
|
||||
}
|
||||
break;
|
||||
case WIDX_OKAY:
|
||||
if (_window_title_command_editor_insert)
|
||||
{
|
||||
@@ -425,6 +459,12 @@ static void window_title_command_editor_dropdown(rct_window * w, rct_widgetindex
|
||||
if (dropdownIndex == -1)
|
||||
return;
|
||||
|
||||
// Cancel sprite selector tool if it's active
|
||||
if (sprite_selector_tool_is_active())
|
||||
{
|
||||
tool_cancel();
|
||||
}
|
||||
|
||||
switch (widgetIndex)
|
||||
{
|
||||
case WIDX_COMMAND_DROPDOWN:
|
||||
@@ -452,6 +492,9 @@ static void window_title_command_editor_dropdown(rct_window * w, rct_widgetindex
|
||||
command.Zoom = 0;
|
||||
snprintf(textbox1Buffer, BUF_SIZE, "%d", command.Zoom);
|
||||
break;
|
||||
case TITLE_SCRIPT_FOLLOW:
|
||||
command.SpriteIndex = SPRITE_INDEX_NULL;
|
||||
break;
|
||||
case TITLE_SCRIPT_SPEED:
|
||||
command.Speed = 1;
|
||||
break;
|
||||
@@ -573,6 +616,19 @@ static void window_title_command_editor_update(rct_window * w)
|
||||
}
|
||||
}
|
||||
|
||||
static void window_title_command_editor_tool_down(rct_window * w, rct_widgetindex widgetIndex, sint32 x, sint32 y)
|
||||
{
|
||||
viewport_interaction_info info;
|
||||
viewport_interaction_get_item_left(x, y, &info);
|
||||
|
||||
if (info.type == VIEWPORT_INTERACTION_ITEM_SPRITE)
|
||||
{
|
||||
command.SpriteIndex = info.sprite->unknown.sprite_index;
|
||||
tool_cancel();
|
||||
window_invalidate(w);
|
||||
}
|
||||
}
|
||||
|
||||
static void window_title_command_editor_invalidate(rct_window * w)
|
||||
{
|
||||
colour_scheme_update_by_class(w, WC_TITLE_EDITOR);
|
||||
@@ -583,7 +639,9 @@ static void window_title_command_editor_invalidate(rct_window * w)
|
||||
window_title_command_editor_widgets[WIDX_INPUT].type = WWT_EMPTY;
|
||||
window_title_command_editor_widgets[WIDX_INPUT_DROPDOWN].type = WWT_EMPTY;
|
||||
window_title_command_editor_widgets[WIDX_GET].type = WWT_EMPTY;
|
||||
window_title_command_editor_widgets[WIDX_SELECT].type = WWT_EMPTY;
|
||||
window_title_command_editor_widgets[WIDX_SELECT_SCENARIO].type = WWT_EMPTY;
|
||||
window_title_command_editor_widgets[WIDX_SELECT_SPRITE].type = WWT_EMPTY;
|
||||
window_title_command_editor_widgets[WIDX_SPRITE_INDEX].type = WWT_EMPTY;
|
||||
switch (command.Type)
|
||||
{
|
||||
case TITLE_SCRIPT_LOAD:
|
||||
@@ -593,7 +651,7 @@ static void window_title_command_editor_invalidate(rct_window * w)
|
||||
break;
|
||||
case TITLE_SCRIPT_LOADSC:
|
||||
window_title_command_editor_widgets[WIDX_INPUT].type = WWT_DROPDOWN;
|
||||
window_title_command_editor_widgets[WIDX_SELECT].type = WWT_DROPDOWN_BUTTON;
|
||||
window_title_command_editor_widgets[WIDX_SELECT_SCENARIO].type = WWT_DROPDOWN_BUTTON;
|
||||
break;
|
||||
case TITLE_SCRIPT_LOCATION:
|
||||
window_title_command_editor_widgets[WIDX_TEXTBOX_X].type = WWT_TEXT_BOX;
|
||||
@@ -608,6 +666,14 @@ static void window_title_command_editor_invalidate(rct_window * w)
|
||||
window_title_command_editor_widgets[WIDX_GET].type = WWT_DROPDOWN_BUTTON;
|
||||
window_title_command_editor_widgets[WIDX_TEXTBOX_FULL].type = WWT_TEXT_BOX;
|
||||
break;
|
||||
case TITLE_SCRIPT_FOLLOW:
|
||||
window_title_command_editor_widgets[WIDX_SELECT_SPRITE].type = WWT_DROPDOWN_BUTTON;
|
||||
window_title_command_editor_widgets[WIDX_SPRITE_INDEX].type = WWT_SPINNER;
|
||||
// Draw button pressed while the tool is active
|
||||
w->pressed_widgets &= ~(1 << WIDX_SELECT_SPRITE);
|
||||
if (sprite_selector_tool_is_active())
|
||||
w->pressed_widgets |= (1 << WIDX_SELECT_SPRITE);
|
||||
break;
|
||||
}
|
||||
|
||||
if ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO)
|
||||
@@ -620,18 +686,24 @@ static void window_title_command_editor_paint(rct_window * w, rct_drawpixelinfo
|
||||
{
|
||||
window_draw_widgets(w, dpi);
|
||||
|
||||
gfx_draw_string_left(dpi, STR_TITLE_COMMAND_EDITOR_COMMAND_LABEL, nullptr, w->colours[1], w->x + WS, w->y + BY - 14);
|
||||
gfx_draw_string_left(dpi, get_command_info(command.Type).descStringId, nullptr, w->colours[1], w->x + WS, w->y + BY2 - 14);
|
||||
TITLE_COMMAND_ORDER command_info = get_command_info(command.Type);
|
||||
|
||||
// "Command:" label
|
||||
gfx_draw_string_left(dpi, STR_TITLE_COMMAND_EDITOR_COMMAND_LABEL, nullptr, w->colours[1], w->x + WS, w->y + BY - 14);
|
||||
|
||||
// Command dropdown name
|
||||
gfx_draw_string_left_clipped(
|
||||
dpi,
|
||||
get_command_info(command.Type).nameStringId,
|
||||
command_info.nameStringId,
|
||||
nullptr,
|
||||
w->colours[1],
|
||||
w->x + w->widgets[WIDX_COMMAND].left + 1,
|
||||
w->y + w->widgets[WIDX_COMMAND].top,
|
||||
w->widgets[WIDX_COMMAND_DROPDOWN].left - w->widgets[WIDX_COMMAND].left - 4);
|
||||
|
||||
// Label (e.g. "Location:")
|
||||
gfx_draw_string_left(dpi, command_info.descStringId, NULL, w->colours[1], w->x + WS, w->y + BY2 - 14);
|
||||
|
||||
if (command.Type == TITLE_SCRIPT_SPEED)
|
||||
{
|
||||
gfx_draw_string_left_clipped(
|
||||
@@ -643,6 +715,17 @@ static void window_title_command_editor_paint(rct_window * w, rct_drawpixelinfo
|
||||
w->y + w->widgets[WIDX_INPUT].top,
|
||||
w->widgets[WIDX_INPUT_DROPDOWN].left - w->widgets[WIDX_INPUT].left - 4);
|
||||
}
|
||||
if (command.Type == TITLE_SCRIPT_FOLLOW)
|
||||
{
|
||||
sint32 value = command.SpriteIndex;
|
||||
gfx_draw_string_left(
|
||||
dpi,
|
||||
STR_FORMAT_INTEGER,
|
||||
&value,
|
||||
w->colours[1],
|
||||
w->x + w->widgets[WIDX_SPRITE_INDEX].left + 1,
|
||||
w->y + w->widgets[WIDX_SPRITE_INDEX].top);
|
||||
}
|
||||
else if (command.Type == TITLE_SCRIPT_LOAD)
|
||||
{
|
||||
if (command.SaveIndex == SAVE_INDEX_INVALID)
|
||||
|
||||
@@ -978,14 +978,15 @@ static void window_title_editor_scrollpaint_commands(rct_window * w, rct_drawpix
|
||||
commandName = STR_TITLE_EDITOR_COMMAND_SPEED;
|
||||
set_format_arg(0, rct_string_id, SpeedNames[command->Speed - 1]);
|
||||
break;
|
||||
case TITLE_SCRIPT_FOLLOW:
|
||||
commandName = STR_TITLE_EDITOR_COMMAND_TYPE_FOLLOW;
|
||||
break;
|
||||
case TITLE_SCRIPT_WAIT:
|
||||
commandName = STR_TITLE_EDITOR_COMMAND_WAIT;
|
||||
set_format_arg(0, uint16, command->Milliseconds);
|
||||
break;
|
||||
case TITLE_SCRIPT_RESTART:
|
||||
commandName = STR_TITLE_EDITOR_RESTART;
|
||||
// TODO: Why the format arg?
|
||||
set_format_arg(0, uint16, command->Zoom);
|
||||
break;
|
||||
case TITLE_SCRIPT_END:
|
||||
commandName = STR_TITLE_EDITOR_END;
|
||||
|
||||
@@ -3831,6 +3831,9 @@ enum {
|
||||
STR_TITLE_COMMAND_EDITOR_NO_SCENARIO_SELECTED = 6180,
|
||||
STR_TITLE_COMMAND_EDITOR_MISSING_SCENARIO = 6181,
|
||||
|
||||
STR_TITLE_EDITOR_COMMAND_TYPE_FOLLOW = 6182,
|
||||
STR_TITLE_COMMAND_EDITOR_SELECT_SPRITE = 6183,
|
||||
|
||||
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
|
||||
STR_COUNT = 32768
|
||||
};
|
||||
|
||||
@@ -637,6 +637,10 @@ static utf8 * LegacyScriptWrite(TitleSequence * seq)
|
||||
String::Format(buffer, sizeof(buffer), "ZOOM %u", command->Zoom);
|
||||
sb.Append(buffer);
|
||||
break;
|
||||
case TITLE_SCRIPT_FOLLOW:
|
||||
String::Format(buffer, sizeof(buffer), "FOLLOW %u", command->SpriteIndex);
|
||||
sb.Append(buffer);
|
||||
break;
|
||||
case TITLE_SCRIPT_SPEED:
|
||||
String::Format(buffer, sizeof(buffer), "SPEED %u", command->Speed);
|
||||
sb.Append(buffer);
|
||||
|
||||
Reference in New Issue
Block a user