1
0
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:
Hielke Morsink
2017-07-17 23:36:17 +02:00
committed by Aaron van Geffen
parent 500b0d09aa
commit 943747056e
5 changed files with 115 additions and 22 deletions

View File

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

View File

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

View File

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

View File

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

View File

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