From 943747056e3aace09a57cd66a56276fe9bc705c1 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Mon, 17 Jul 2017 23:36:17 +0200 Subject: [PATCH] Add window settings and save support for follow sprite command --- data/language/en-GB.txt | 2 + .../windows/TitleCommandEditor.cpp | 123 +++++++++++++++--- src/openrct2-ui/windows/TitleEditor.cpp | 5 +- src/openrct2/localisation/string_ids.h | 3 + src/openrct2/title/TitleSequence.cpp | 4 + 5 files changed, 115 insertions(+), 22 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 66a4d597ad..400338d5bf 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -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 # diff --git a/src/openrct2-ui/windows/TitleCommandEditor.cpp b/src/openrct2-ui/windows/TitleCommandEditor.cpp index cc4d60b5a8..c2cdb987c2 100644 --- a/src/openrct2-ui/windows/TitleCommandEditor.cpp +++ b/src/openrct2-ui/windows/TitleCommandEditor.cpp @@ -21,12 +21,14 @@ #include #include +#include #include #include #include #include #include #include +#include #include #include @@ -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) diff --git a/src/openrct2-ui/windows/TitleEditor.cpp b/src/openrct2-ui/windows/TitleEditor.cpp index 40867d3cb0..87a660dd49 100644 --- a/src/openrct2-ui/windows/TitleEditor.cpp +++ b/src/openrct2-ui/windows/TitleEditor.cpp @@ -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; diff --git a/src/openrct2/localisation/string_ids.h b/src/openrct2/localisation/string_ids.h index 522e4167ac..ade8ce949c 100644 --- a/src/openrct2/localisation/string_ids.h +++ b/src/openrct2/localisation/string_ids.h @@ -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 }; diff --git a/src/openrct2/title/TitleSequence.cpp b/src/openrct2/title/TitleSequence.cpp index 189dcda04d..ed1b616ee1 100644 --- a/src/openrct2/title/TitleSequence.cpp +++ b/src/openrct2/title/TitleSequence.cpp @@ -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);