diff --git a/src/openrct2-ui/title/TitleSequencePlayer.cpp b/src/openrct2-ui/title/TitleSequencePlayer.cpp index 31693e90c0..8a624e6bd1 100644 --- a/src/openrct2-ui/title/TitleSequencePlayer.cpp +++ b/src/openrct2-ui/title/TitleSequencePlayer.cpp @@ -123,7 +123,7 @@ public: if (_waitCounter == 0) { const auto& command = _sequence->Commands[_position]; - if (command.Type == TITLE_SCRIPT_WAIT) + if (command.Type == TitleScript::Wait) { IncrementPosition(); } @@ -136,11 +136,11 @@ public: const auto& command = _sequence->Commands[_position]; if (ExecuteCommand(command)) { - if (command.Type == TITLE_SCRIPT_WAIT) + if (command.Type == TitleScript::Wait) { break; } - if (command.Type != TITLE_SCRIPT_RESTART) + if (command.Type != TitleScript::Restart) { IncrementPosition(); } @@ -181,7 +181,7 @@ public: Reset(); } - if (_sequence->Commands[targetPosition].Type == TITLE_SCRIPT_RESTART) + if (_sequence->Commands[targetPosition].Type == TitleScript::Restart) { targetPosition = 0; } @@ -243,36 +243,42 @@ private: { switch (command.Type) { - case TITLE_SCRIPT_END: + case TitleScript::End: _waitCounter = 1; break; - case TITLE_SCRIPT_WAIT: + case TitleScript::Wait: // The waitCounter is measured in 25-ms game ticks. Previously it was seconds * 40 ticks/second, now it is ms / // 25 ms/tick _waitCounter = std::max(1, command.Milliseconds / static_cast(GAME_UPDATE_TIME_MS)); break; - case TITLE_SCRIPT_LOCATION: + case TitleScript::Location: { auto loc = TileCoordsXY(command.X, command.Y).ToCoordsXY().ToTileCentre(); SetViewLocation(loc); break; } - case TITLE_SCRIPT_ROTATE: + case TitleScript::Undefined: + break; + case TitleScript::Loop: + break; + case TitleScript::EndLoop: + break; + case TitleScript::Rotate: RotateView(command.Rotations); break; - case TITLE_SCRIPT_ZOOM: + case TitleScript::Zoom: SetViewZoom(command.Zoom); break; - case TITLE_SCRIPT_SPEED: + case TitleScript::Speed: gGameSpeed = std::clamp(command.Speed, 1, 4); break; - case TITLE_SCRIPT_FOLLOW: + case TitleScript::Follow: FollowSprite(command.SpriteIndex); break; - case TITLE_SCRIPT_RESTART: + case TitleScript::Restart: Reset(); break; - case TITLE_SCRIPT_LOAD: + case TitleScript::Load: { bool loadSuccess = false; uint8_t saveIndex = command.SaveIndex; @@ -292,7 +298,7 @@ private: } break; } - case TITLE_SCRIPT_LOADSC: + case TitleScript::LoadSc: { bool loadSuccess = false; auto scenario = GetScenarioRepository()->GetByInternalName(command.Scenario); diff --git a/src/openrct2-ui/windows/TitleCommandEditor.cpp b/src/openrct2-ui/windows/TitleCommandEditor.cpp index d52fdfb7a6..3cb2aa14c7 100644 --- a/src/openrct2-ui/windows/TitleCommandEditor.cpp +++ b/src/openrct2-ui/windows/TitleCommandEditor.cpp @@ -29,23 +29,22 @@ // clang-format off struct TITLE_COMMAND_ORDER { - // originally a uint8_t, but the new millisecond wait times require a uint16_t. - uint16_t command; + TitleScript command; rct_string_id nameStringId; rct_string_id descStringId; }; 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_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 }, + { TitleScript::Load, STR_TITLE_EDITOR_ACTION_LOAD_SAVE, STR_TITLE_EDITOR_ARGUMENT_SAVEFILE }, + { TitleScript::LoadSc, STR_TITLE_EDITOR_ACTION_LOAD_SCENARIO, STR_TITLE_EDITOR_ARGUMENT_SCENARIO }, + { TitleScript::Location, STR_TITLE_EDITOR_COMMAND_TYPE_LOCATION, STR_TITLE_EDITOR_ARGUMENT_COORDINATES }, + { TitleScript::Rotate, STR_TITLE_EDITOR_COMMAND_TYPE_ROTATE, STR_TITLE_EDITOR_ARGUMENT_ROTATIONS }, + { TitleScript::Zoom, STR_TITLE_EDITOR_COMMAND_TYPE_ZOOM, STR_TITLE_EDITOR_ARGUMENT_ZOOM_LEVEL }, + { TitleScript::Speed, STR_TITLE_EDITOR_COMMAND_TYPE_SPEED, STR_TITLE_EDITOR_ARGUMENT_SPEED }, + { TitleScript::Follow, STR_TITLE_EDITOR_COMMAND_TYPE_FOLLOW, STR_NONE }, + { TitleScript::Wait, STR_TITLE_EDITOR_COMMAND_TYPE_WAIT, STR_TITLE_EDITOR_ARGUMENT_WAIT_SECONDS }, + { TitleScript::Restart, STR_TITLE_EDITOR_RESTART, STR_NONE }, + { TitleScript::End, STR_TITLE_EDITOR_END, STR_NONE }, }; #define NUM_COMMANDS std::size(_window_title_command_editor_orders) @@ -81,7 +80,7 @@ static int32_t _window_title_command_editor_index; constexpr size_t BUF_SIZE = 50; static char textbox1Buffer[BUF_SIZE]; static char textbox2Buffer[BUF_SIZE]; -static TitleCommand command = { TITLE_SCRIPT_LOAD, { 0 } }; +static TitleCommand _command = { TitleScript::Load, { 0 } }; static TitleSequence * _sequence = nullptr; static rct_widget window_title_command_editor_widgets[] = { @@ -117,8 +116,8 @@ 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); static void scenario_select_callback(const utf8 * path); -static int32_t get_command_info_index(int32_t index); -static TITLE_COMMAND_ORDER get_command_info(int32_t index); +static int32_t get_command_info_index(TitleScript commandType); +static TITLE_COMMAND_ORDER get_command_info(TitleScript commandType); static TileCoordsXY get_location(); static uint8_t get_zoom(); @@ -138,29 +137,29 @@ static rct_window_event_list window_title_command_editor_events([](auto& events) static void scenario_select_callback(const utf8* path) { - if (command.Type == TITLE_SCRIPT_LOADSC) + if (_command.Type == TitleScript::LoadSc) { const utf8* fileName = path_get_filename(path); auto scenario = GetScenarioRepository()->GetByFilename(fileName); - safe_strcpy(command.Scenario, scenario->internal_name, sizeof(command.Scenario)); + safe_strcpy(_command.Scenario, scenario->internal_name, sizeof(_command.Scenario)); } } -static int32_t get_command_info_index(int32_t index) +static int32_t get_command_info_index(TitleScript commandType) { for (int32_t i = 0; i < static_cast(NUM_COMMANDS); i++) { - if (_window_title_command_editor_orders[i].command == index) + if (_window_title_command_editor_orders[i].command == commandType) return i; } return 0; } -static TITLE_COMMAND_ORDER get_command_info(int32_t index) +static TITLE_COMMAND_ORDER get_command_info(TitleScript commandType) { for (int32_t i = 0; i < static_cast(NUM_COMMANDS); i++) { - if (_window_title_command_editor_orders[i].command == index) + if (_window_title_command_editor_orders[i].command == commandType) return _window_title_command_editor_orders[i]; } return _window_title_command_editor_orders[0]; @@ -232,32 +231,46 @@ void window_title_command_editor_open(TitleSequence* sequence, int32_t index, bo _window_title_command_editor_insert = insert; if (!insert) { - command = _sequence->Commands[index]; + _command = _sequence->Commands[index]; } - switch (command.Type) + switch (_command.Type) { - case TITLE_SCRIPT_LOAD: - if (command.SaveIndex >= _sequence->Saves.size()) - command.SaveIndex = SAVE_INDEX_INVALID; + case TitleScript::Load: + if (_command.SaveIndex >= _sequence->Saves.size()) + _command.SaveIndex = SAVE_INDEX_INVALID; break; - case TITLE_SCRIPT_LOCATION: - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.X); - snprintf(textbox2Buffer, BUF_SIZE, "%d", command.Y); + case TitleScript::Location: + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.X); + snprintf(textbox2Buffer, BUF_SIZE, "%d", _command.Y); break; - case TITLE_SCRIPT_ROTATE: - case TITLE_SCRIPT_ZOOM: - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.Rotations); + case TitleScript::Rotate: + case TitleScript::Zoom: + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.Rotations); break; - case TITLE_SCRIPT_WAIT: - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.Milliseconds); + case TitleScript::Wait: + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.Milliseconds); break; - case TITLE_SCRIPT_FOLLOW: - if (command.SpriteIndex != SPRITE_INDEX_NULL) + case TitleScript::Follow: + if (_command.SpriteIndex != SPRITE_INDEX_NULL) { - window_follow_sprite(window, static_cast(command.SpriteIndex)); + window_follow_sprite(window, static_cast(_command.SpriteIndex)); } break; + case TitleScript::Undefined: + break; + case TitleScript::Restart: + break; + case TitleScript::End: + break; + case TitleScript::Speed: + break; + case TitleScript::Loop: + break; + case TitleScript::EndLoop: + break; + case TitleScript::LoadSc: + break; } } @@ -280,7 +293,7 @@ static void window_title_command_editor_mouseup(rct_window* w, rct_widgetindex w case WIDX_TEXTBOX_FULL: // The only commands that use TEXTBOX_FULL currently are Wait, Rotate, and Zoom. Rotate and Zoom have single-digit // maximum values, while Wait has 5-digit maximum values. - if (command.Type == TITLE_SCRIPT_WAIT) + if (_command.Type == TitleScript::Wait) { window_start_textbox(w, widgetIndex, STR_STRING, textbox1Buffer, 6); } @@ -296,19 +309,19 @@ static void window_title_command_editor_mouseup(rct_window* w, rct_widgetindex w window_start_textbox(w, widgetIndex, STR_STRING, textbox2Buffer, 4); break; case WIDX_GET: - if (command.Type == TITLE_SCRIPT_LOCATION) + if (_command.Type == TitleScript::Location) { auto tileCoord = get_location(); - command.X = static_cast(tileCoord.x); - command.Y = static_cast(tileCoord.y); - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.X); - snprintf(textbox2Buffer, BUF_SIZE, "%d", command.Y); + _command.X = static_cast(tileCoord.x); + _command.Y = static_cast(tileCoord.y); + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.X); + snprintf(textbox2Buffer, BUF_SIZE, "%d", _command.Y); } - else if (command.Type == TITLE_SCRIPT_ZOOM) + else if (_command.Type == TitleScript::Zoom) { uint8_t zoom = get_zoom(); - command.Zoom = zoom; - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.Zoom); + _command.Zoom = zoom; + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.Zoom); } w->Invalidate(); break; @@ -329,11 +342,11 @@ static void window_title_command_editor_mouseup(rct_window* w, rct_widgetindex w if (_window_title_command_editor_insert) { size_t insertIndex = _window_title_command_editor_index; - _sequence->Commands.insert(_sequence->Commands.begin() + insertIndex, command); + _sequence->Commands.insert(_sequence->Commands.begin() + insertIndex, _command); } else { - _sequence->Commands[_window_title_command_editor_index] = command; + _sequence->Commands[_window_title_command_editor_index] = _command; } TitleSequenceSave(*_sequence); @@ -365,11 +378,11 @@ static void window_title_command_editor_mousedown(rct_window* w, rct_widgetindex { w->windowPos.x + widget->left, w->windowPos.y + widget->top }, widget->height() + 1, w->colours[1], 0, Dropdown::Flag::StayOpen, numItems, widget->width() - 3); - Dropdown::SetChecked(get_command_info_index(command.Type), true); + Dropdown::SetChecked(get_command_info_index(_command.Type), true); break; } case WIDX_INPUT_DROPDOWN: - if (command.Type == TITLE_SCRIPT_SPEED) + if (_command.Type == TitleScript::Speed) { int32_t numItems = 4; for (int32_t i = 0; i < numItems; i++) @@ -382,9 +395,9 @@ static void window_title_command_editor_mousedown(rct_window* w, rct_widgetindex { w->windowPos.x + widget->left, w->windowPos.y + widget->top }, widget->height() + 1, w->colours[1], 0, Dropdown::Flag::StayOpen, numItems, widget->width() - 3); - Dropdown::SetChecked(command.Speed - 1, true); + Dropdown::SetChecked(_command.Speed - 1, true); } - else if (command.Type == TITLE_SCRIPT_LOAD) + else if (_command.Type == TitleScript::Load) { int32_t numItems = static_cast(_sequence->Saves.size()); for (int32_t i = 0; i < numItems; i++) @@ -397,7 +410,7 @@ static void window_title_command_editor_mousedown(rct_window* w, rct_widgetindex { w->windowPos.x + widget->left, w->windowPos.y + widget->top }, widget->height() + 1, w->colours[1], 0, Dropdown::Flag::StayOpen, numItems, widget->width() - 3); - Dropdown::SetChecked(command.SaveIndex, true); + Dropdown::SetChecked(_command.SaveIndex, true); } break; } @@ -417,76 +430,108 @@ static void window_title_command_editor_dropdown(rct_window* w, rct_widgetindex switch (widgetIndex) { case WIDX_COMMAND_DROPDOWN: - if (command.SpriteIndex != SPRITE_INDEX_NULL) + if (_command.SpriteIndex != SPRITE_INDEX_NULL) { window_unfollow_sprite(w); } - if (dropdownIndex == get_command_info_index(command.Type)) + if (dropdownIndex == get_command_info_index(_command.Type)) { break; } - command.Type = _window_title_command_editor_orders[dropdownIndex].command; - switch (command.Type) + _command.Type = _window_title_command_editor_orders[dropdownIndex].command; + switch (_command.Type) { - case TITLE_SCRIPT_LOCATION: + case TitleScript::Location: { auto tileCoord = get_location(); - command.X = static_cast(tileCoord.x); - command.Y = static_cast(tileCoord.y); - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.X); - snprintf(textbox2Buffer, BUF_SIZE, "%d", command.Y); + _command.X = static_cast(tileCoord.x); + _command.Y = static_cast(tileCoord.y); + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.X); + snprintf(textbox2Buffer, BUF_SIZE, "%d", _command.Y); break; } - case TITLE_SCRIPT_ROTATE: - command.Rotations = 1; - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.Rotations); + case TitleScript::Rotate: + _command.Rotations = 1; + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.Rotations); break; - case TITLE_SCRIPT_ZOOM: - command.Zoom = 0; - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.Zoom); + case TitleScript::Undefined: break; - case TITLE_SCRIPT_FOLLOW: - command.SpriteIndex = SPRITE_INDEX_NULL; - command.SpriteName[0] = '\0'; + case TitleScript::Restart: + break; + case TitleScript::End: + break; + case TitleScript::Loop: + break; + case TitleScript::EndLoop: + break; + case TitleScript::Zoom: + _command.Zoom = 0; + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.Zoom); + break; + case TitleScript::Follow: + _command.SpriteIndex = SPRITE_INDEX_NULL; + _command.SpriteName[0] = '\0'; window_unfollow_sprite(w); w->viewport->flags &= ~VIEWPORT_FOCUS_TYPE_SPRITE; break; - case TITLE_SCRIPT_SPEED: - command.Speed = 1; + case TitleScript::Speed: + _command.Speed = 1; break; - case TITLE_SCRIPT_WAIT: - command.Milliseconds = 10000; - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.Milliseconds); + case TitleScript::Wait: + _command.Milliseconds = 10000; + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.Milliseconds); break; - case TITLE_SCRIPT_LOAD: - command.SaveIndex = 0; - if (command.SaveIndex >= _sequence->Saves.size()) + case TitleScript::Load: + _command.SaveIndex = 0; + if (_command.SaveIndex >= _sequence->Saves.size()) { - command.SaveIndex = 0xFF; + _command.SaveIndex = 0xFF; } break; - case TITLE_SCRIPT_LOADSC: - command.Scenario[0] = '\0'; + case TitleScript::LoadSc: + _command.Scenario[0] = '\0'; } w->Invalidate(); break; case WIDX_INPUT_DROPDOWN: - switch (command.Type) + switch (_command.Type) { - case TITLE_SCRIPT_SPEED: - if (dropdownIndex != command.Speed - 1) + case TitleScript::Speed: + if (dropdownIndex != _command.Speed - 1) { - command.Speed = static_cast(dropdownIndex + 1); + _command.Speed = static_cast(dropdownIndex + 1); w->Invalidate(); } break; - case TITLE_SCRIPT_LOAD: - if (dropdownIndex != command.SaveIndex) + case TitleScript::Load: + if (dropdownIndex != _command.SaveIndex) { - command.SaveIndex = static_cast(dropdownIndex); + _command.SaveIndex = static_cast(dropdownIndex); w->Invalidate(); } break; + case TitleScript::Restart: + break; + case TitleScript::End: + break; + case TitleScript::Loop: + break; + case TitleScript::EndLoop: + break; + case TitleScript::Undefined: + break; + case TitleScript::Location: + break; + case TitleScript::Wait: + break; + case TitleScript::Rotate: + break; + case TitleScript::Zoom: + break; + case TitleScript::Follow: + break; + case TitleScript::LoadSc: + break; } break; } @@ -499,7 +544,7 @@ static void window_title_command_editor_textinput(rct_window* w, rct_widgetindex if (value < 0) value = 0; // The Wait command is the only one with acceptable values greater than 255. - if (value > 255 && command.Type != TITLE_SCRIPT_WAIT) + if (value > 255 && _command.Type != TitleScript::Wait) value = 255; switch (widgetIndex) { @@ -508,24 +553,24 @@ static void window_title_command_editor_textinput(rct_window* w, rct_widgetindex { if (*end == '\0') { - if (command.Type == TITLE_SCRIPT_WAIT) + if (_command.Type == TitleScript::Wait) { if (value < 100) value = 100; if (value > 65000) value = 65000; - command.Milliseconds = static_cast(value); - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.Milliseconds); + _command.Milliseconds = static_cast(value); + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.Milliseconds); } else { // Both Rotate and Zoom have a maximum value of 3, but Rotate has a min value of 1 not 0. if (value > 3) value = 3; - if (value < 1 && command.Type == TITLE_SCRIPT_ROTATE) + if (value < 1 && _command.Type == TitleScript::Rotate) value = 1; - command.Rotations = static_cast(value); - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.Rotations); + _command.Rotations = static_cast(value); + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.Rotations); } } w->Invalidate(); @@ -540,9 +585,9 @@ static void window_title_command_editor_textinput(rct_window* w, rct_widgetindex { if (*end == '\0') { - command.X = static_cast(value); + _command.X = static_cast(value); } - snprintf(textbox1Buffer, BUF_SIZE, "%d", command.X); + snprintf(textbox1Buffer, BUF_SIZE, "%d", _command.X); w->Invalidate(); } else @@ -555,9 +600,9 @@ static void window_title_command_editor_textinput(rct_window* w, rct_widgetindex { if (*end == '\0') { - command.Y = static_cast(value); + _command.Y = static_cast(value); } - snprintf(textbox2Buffer, BUF_SIZE, "%d", command.Y); + snprintf(textbox2Buffer, BUF_SIZE, "%d", _command.Y); w->Invalidate(); } else @@ -596,7 +641,7 @@ static void window_title_command_editor_tool_down( validSprite = true; Formatter ft; peep->FormatNameTo(ft); - format_string(command.SpriteName, USER_STRING_MAX_LENGTH, STR_STRINGID, &peep->Id); + format_string(_command.SpriteName, USER_STRING_MAX_LENGTH, STR_STRINGID, &peep->Id); } else if (vehicle != nullptr) { @@ -607,7 +652,7 @@ static void window_title_command_editor_tool_down( { Formatter ft; ride->FormatNameTo(ft); - format_string(command.SpriteName, USER_STRING_MAX_LENGTH, STR_STRINGID, ft.Data()); + format_string(_command.SpriteName, USER_STRING_MAX_LENGTH, STR_STRINGID, ft.Data()); } } else if (litter != nullptr) @@ -615,24 +660,24 @@ static void window_title_command_editor_tool_down( if (litter->type < std::size(litterNames)) { validSprite = true; - format_string(command.SpriteName, USER_STRING_MAX_LENGTH, litterNames[litter->type], nullptr); + format_string(_command.SpriteName, USER_STRING_MAX_LENGTH, litterNames[litter->type], nullptr); } } else if (balloon != nullptr) { validSprite = true; - format_string(command.SpriteName, USER_STRING_MAX_LENGTH, STR_SHOP_ITEM_SINGULAR_BALLOON, nullptr); + format_string(_command.SpriteName, USER_STRING_MAX_LENGTH, STR_SHOP_ITEM_SINGULAR_BALLOON, nullptr); } else if (duck != nullptr) { validSprite = true; - format_string(command.SpriteName, USER_STRING_MAX_LENGTH, STR_DUCK, nullptr); + format_string(_command.SpriteName, USER_STRING_MAX_LENGTH, STR_DUCK, nullptr); } if (validSprite) { - command.SpriteIndex = entity->sprite_index; - window_follow_sprite(w, static_cast(command.SpriteIndex)); + _command.SpriteIndex = entity->sprite_index; + window_follow_sprite(w, static_cast(_command.SpriteIndex)); tool_cancel(); w->Invalidate(); } @@ -652,31 +697,41 @@ static void window_title_command_editor_invalidate(rct_window* w) window_title_command_editor_widgets[WIDX_SELECT_SCENARIO].type = WindowWidgetType::Empty; window_title_command_editor_widgets[WIDX_SELECT_SPRITE].type = WindowWidgetType::Empty; window_title_command_editor_widgets[WIDX_VIEWPORT].type = WindowWidgetType::Empty; - switch (command.Type) + switch (_command.Type) { - case TITLE_SCRIPT_LOAD: - case TITLE_SCRIPT_SPEED: + case TitleScript::Load: + case TitleScript::Speed: window_title_command_editor_widgets[WIDX_INPUT].type = WindowWidgetType::DropdownMenu; window_title_command_editor_widgets[WIDX_INPUT_DROPDOWN].type = WindowWidgetType::Button; break; - case TITLE_SCRIPT_LOADSC: + case TitleScript::LoadSc: window_title_command_editor_widgets[WIDX_INPUT].type = WindowWidgetType::DropdownMenu; window_title_command_editor_widgets[WIDX_SELECT_SCENARIO].type = WindowWidgetType::Button; break; - case TITLE_SCRIPT_LOCATION: + case TitleScript::Location: window_title_command_editor_widgets[WIDX_TEXTBOX_X].type = WindowWidgetType::TextBox; window_title_command_editor_widgets[WIDX_TEXTBOX_Y].type = WindowWidgetType::TextBox; window_title_command_editor_widgets[WIDX_GET].type = WindowWidgetType::Button; break; - case TITLE_SCRIPT_ROTATE: - case TITLE_SCRIPT_WAIT: + case TitleScript::Rotate: + case TitleScript::Wait: window_title_command_editor_widgets[WIDX_TEXTBOX_FULL].type = WindowWidgetType::TextBox; break; - case TITLE_SCRIPT_ZOOM: + case TitleScript::Zoom: window_title_command_editor_widgets[WIDX_GET].type = WindowWidgetType::Button; window_title_command_editor_widgets[WIDX_TEXTBOX_FULL].type = WindowWidgetType::TextBox; break; - case TITLE_SCRIPT_FOLLOW: + case TitleScript::Undefined: + break; + case TitleScript::Restart: + break; + case TitleScript::End: + break; + case TitleScript::Loop: + break; + case TitleScript::EndLoop: + break; + case TitleScript::Follow: window_title_command_editor_widgets[WIDX_SELECT_SPRITE].type = WindowWidgetType::Button; window_title_command_editor_widgets[WIDX_VIEWPORT].type = WindowWidgetType::Viewport; @@ -705,7 +760,7 @@ static void window_title_command_editor_paint(rct_window* w, rct_drawpixelinfo* { WindowDrawWidgets(w, dpi); - TITLE_COMMAND_ORDER command_info = get_command_info(command.Type); + TITLE_COMMAND_ORDER command_info = get_command_info(_command.Type); // "Command:" label gfx_draw_string_left( @@ -720,22 +775,22 @@ static void window_title_command_editor_paint(rct_window* w, rct_drawpixelinfo* // Label (e.g. "Location:") gfx_draw_string_left(dpi, command_info.descStringId, nullptr, w->colours[1], w->windowPos + ScreenCoordsXY{ WS, BY2 - 14 }); - if (command.Type == TITLE_SCRIPT_SPEED) + if (_command.Type == TitleScript::Speed) { DrawTextEllipsised( dpi, { w->windowPos.x + w->widgets[WIDX_INPUT].left + 1, w->windowPos.y + w->widgets[WIDX_INPUT].top }, - w->widgets[WIDX_INPUT_DROPDOWN].left - w->widgets[WIDX_INPUT].left - 4, SpeedNames[command.Speed - 1], {}, + w->widgets[WIDX_INPUT_DROPDOWN].left - w->widgets[WIDX_INPUT].left - 4, SpeedNames[_command.Speed - 1], {}, w->colours[1]); } - if (command.Type == TITLE_SCRIPT_FOLLOW) + if (_command.Type == TitleScript::Follow) { uint8_t colour = COLOUR_BLACK; rct_string_id spriteString = STR_TITLE_COMMAND_EDITOR_FORMAT_SPRITE_NAME; auto ft = Formatter(); - if (command.SpriteIndex != SPRITE_INDEX_NULL) + if (_command.SpriteIndex != SPRITE_INDEX_NULL) { window_draw_viewport(dpi, w); - ft.Add(command.SpriteName); + ft.Add(_command.SpriteName); } else { @@ -750,9 +805,9 @@ static void window_title_command_editor_paint(rct_window* w, rct_drawpixelinfo* dpi, { w->windowPos.x + w->widgets[WIDX_VIEWPORT].left + 2, w->windowPos.y + w->widgets[WIDX_VIEWPORT].top + 1 }, w->widgets[WIDX_VIEWPORT].width() - 2, spriteString, ft, colour); } - else if (command.Type == TITLE_SCRIPT_LOAD) + else if (_command.Type == TitleScript::Load) { - if (command.SaveIndex == SAVE_INDEX_INVALID) + if (_command.SaveIndex == SAVE_INDEX_INVALID) { DrawTextEllipsised( dpi, { w->windowPos.x + w->widgets[WIDX_INPUT].left + 1, w->windowPos.y + w->widgets[WIDX_INPUT].top }, @@ -762,15 +817,15 @@ static void window_title_command_editor_paint(rct_window* w, rct_drawpixelinfo* else { auto ft = Formatter(); - ft.Add(_sequence->Saves[command.SaveIndex].c_str()); + ft.Add(_sequence->Saves[_command.SaveIndex].c_str()); DrawTextEllipsised( dpi, { w->windowPos.x + w->widgets[WIDX_INPUT].left + 1, w->windowPos.y + w->widgets[WIDX_INPUT].top }, w->widgets[WIDX_INPUT_DROPDOWN].left - w->widgets[WIDX_INPUT].left - 4, STR_STRING, ft, w->colours[1]); } } - else if (command.Type == TITLE_SCRIPT_LOADSC) + else if (_command.Type == TitleScript::LoadSc) { - if (command.Scenario[0] == '\0') + if (_command.Scenario[0] == '\0') { DrawTextEllipsised( dpi, { w->windowPos.x + w->widgets[WIDX_INPUT].left + 1, w->windowPos.y + w->widgets[WIDX_INPUT].top }, @@ -781,7 +836,7 @@ static void window_title_command_editor_paint(rct_window* w, rct_drawpixelinfo* { const char* name = ""; rct_string_id nameString = STR_STRING; - auto scenario = GetScenarioRepository()->GetByInternalName(command.Scenario); + auto scenario = GetScenarioRepository()->GetByInternalName(_command.Scenario); if (scenario != nullptr) { name = scenario->name; diff --git a/src/openrct2-ui/windows/TitleEditor.cpp b/src/openrct2-ui/windows/TitleEditor.cpp index 052aac6c6b..90bdea3f47 100644 --- a/src/openrct2-ui/windows/TitleEditor.cpp +++ b/src/openrct2-ui/windows/TitleEditor.cpp @@ -925,7 +925,7 @@ static void window_title_editor_scrollpaint_commands(rct_window* w, rct_drawpixe gfx_fill_rect(dpi, fillRect, ColourMapA[w->colours[1]].lighter | 0x1000000); } - if (command.Type == TITLE_SCRIPT_LOAD && command.SaveIndex == SAVE_INDEX_INVALID) + if (command.Type == TitleScript::Load && command.SaveIndex == SAVE_INDEX_INVALID) error = true; auto ft = Formatter(); @@ -940,7 +940,7 @@ static void window_title_editor_scrollpaint_commands(rct_window* w, rct_drawpixe switch (command.Type) { - case TITLE_SCRIPT_LOAD: + case TitleScript::Load: { auto commandName = STR_TITLE_EDITOR_COMMAND_LOAD_FILE; if (command.SaveIndex == SAVE_INDEX_INVALID) @@ -955,7 +955,7 @@ static void window_title_editor_scrollpaint_commands(rct_window* w, rct_drawpixe } break; } - case TITLE_SCRIPT_LOCATION: + case TitleScript::Location: { auto commandName = STR_TITLE_EDITOR_COMMAND_LOCATION; ft.Add(commandName); @@ -963,28 +963,28 @@ static void window_title_editor_scrollpaint_commands(rct_window* w, rct_drawpixe ft.Add(command.Y); break; } - case TITLE_SCRIPT_ROTATE: + case TitleScript::Rotate: { auto commandName = STR_TITLE_EDITOR_COMMAND_ROTATE; ft.Add(commandName); ft.Add(command.Rotations); break; } - case TITLE_SCRIPT_ZOOM: + case TitleScript::Zoom: { auto commandName = STR_TITLE_EDITOR_COMMAND_ZOOM; ft.Add(commandName); ft.Add(command.Zoom); break; } - case TITLE_SCRIPT_SPEED: + case TitleScript::Speed: { auto commandName = STR_TITLE_EDITOR_COMMAND_SPEED; ft.Add(commandName); ft.Add(SpeedNames[command.Speed - 1]); break; } - case TITLE_SCRIPT_FOLLOW: + case TitleScript::Follow: { auto commandName = STR_TITLE_EDITOR_COMMAND_FOLLOW; if (command.SpriteIndex == SPRITE_INDEX_NULL) @@ -999,26 +999,26 @@ static void window_title_editor_scrollpaint_commands(rct_window* w, rct_drawpixe } break; } - case TITLE_SCRIPT_WAIT: + case TitleScript::Wait: { auto commandName = STR_TITLE_EDITOR_COMMAND_WAIT; ft.Add(commandName); ft.Add(command.Milliseconds); break; } - case TITLE_SCRIPT_RESTART: + case TitleScript::Restart: { auto commandName = STR_TITLE_EDITOR_RESTART; ft.Add(commandName); break; } - case TITLE_SCRIPT_END: + case TitleScript::End: { auto commandName = STR_TITLE_EDITOR_END; ft.Add(commandName); break; } - case TITLE_SCRIPT_LOADSC: + case TitleScript::LoadSc: { auto commandName = STR_TITLE_EDITOR_COMMAND_LOAD_FILE; const char* name = ""; diff --git a/src/openrct2/title/TitleSequence.cpp b/src/openrct2/title/TitleSequence.cpp index daeec2af8f..e049424dfd 100644 --- a/src/openrct2/title/TitleSequence.cpp +++ b/src/openrct2/title/TitleSequence.cpp @@ -269,7 +269,7 @@ bool TitleSequenceRemovePark(TitleSequence& seq, size_t index) // Update load commands for (auto& command : seq.Commands) { - if (command.Type == TITLE_SCRIPT_LOAD) + if (command.Type == TitleScript::Load) { if (command.SaveIndex == index) { @@ -330,13 +330,13 @@ static std::vector LegacyScriptRead(const std::vector& sc part1 = &parts[1 * 128]; part2 = &parts[2 * 128]; TitleCommand command = {}; - command.Type = TITLE_SCRIPT_UNDEFINED; + command.Type = TitleScript::Undefined; if (token[0] != 0) { if (_stricmp(token, "LOAD") == 0) { - command.Type = TITLE_SCRIPT_LOAD; + command.Type = TitleScript::Load; command.SaveIndex = SAVE_INDEX_INVALID; for (size_t i = 0; i < saves.size(); i++) { @@ -349,51 +349,51 @@ static std::vector LegacyScriptRead(const std::vector& sc } else if (_stricmp(token, "LOCATION") == 0) { - command.Type = TITLE_SCRIPT_LOCATION; + command.Type = TitleScript::Location; command.X = atoi(part1) & 0xFF; command.Y = atoi(part2) & 0xFF; } else if (_stricmp(token, "ROTATE") == 0) { - command.Type = TITLE_SCRIPT_ROTATE; + command.Type = TitleScript::Rotate; command.Rotations = atoi(part1) & 0xFF; } else if (_stricmp(token, "ZOOM") == 0) { - command.Type = TITLE_SCRIPT_ZOOM; + command.Type = TitleScript::Zoom; command.Zoom = atoi(part1) & 0xFF; } else if (_stricmp(token, "SPEED") == 0) { - command.Type = TITLE_SCRIPT_SPEED; + command.Type = TitleScript::Speed; command.Speed = std::max(1, std::min(4, atoi(part1) & 0xFF)); } else if (_stricmp(token, "FOLLOW") == 0) { - command.Type = TITLE_SCRIPT_FOLLOW; + command.Type = TitleScript::Follow; command.SpriteIndex = atoi(part1) & 0xFFFF; safe_strcpy(command.SpriteName, part2, USER_STRING_MAX_LENGTH); } else if (_stricmp(token, "WAIT") == 0) { - command.Type = TITLE_SCRIPT_WAIT; + command.Type = TitleScript::Wait; command.Milliseconds = atoi(part1) & 0xFFFF; } else if (_stricmp(token, "RESTART") == 0) { - command.Type = TITLE_SCRIPT_RESTART; + command.Type = TitleScript::Restart; } else if (_stricmp(token, "END") == 0) { - command.Type = TITLE_SCRIPT_END; + command.Type = TitleScript::End; } else if (_stricmp(token, "LOADSC") == 0) { - command.Type = TITLE_SCRIPT_LOADSC; + command.Type = TitleScript::LoadSc; safe_strcpy(command.Scenario, part1, sizeof(command.Scenario)); } } - if (command.Type != TITLE_SCRIPT_UNDEFINED) + if (command.Type != TitleScript::Undefined) { commands.push_back(command); } @@ -497,7 +497,7 @@ static std::string LegacyScriptWrite(const TitleSequence& seq) { switch (command.Type) { - case TITLE_SCRIPT_LOAD: + case TitleScript::Load: if (command.SaveIndex == 0xFF) { sb.Append("LOAD "); @@ -508,7 +508,7 @@ static std::string LegacyScriptWrite(const TitleSequence& seq) sb.Append(seq.Saves[command.SaveIndex].c_str()); } break; - case TITLE_SCRIPT_LOADSC: + case TitleScript::LoadSc: if (command.Scenario[0] == '\0') { sb.Append("LOADSC "); @@ -519,35 +519,41 @@ static std::string LegacyScriptWrite(const TitleSequence& seq) sb.Append(command.Scenario); } break; - case TITLE_SCRIPT_LOCATION: + case TitleScript::Undefined: + break; + case TitleScript::Loop: + break; + case TitleScript::EndLoop: + break; + case TitleScript::Location: String::Format(buffer, sizeof(buffer), "LOCATION %u %u", command.X, command.Y); sb.Append(buffer); break; - case TITLE_SCRIPT_ROTATE: + case TitleScript::Rotate: String::Format(buffer, sizeof(buffer), "ROTATE %u", command.Rotations); sb.Append(buffer); break; - case TITLE_SCRIPT_ZOOM: + case TitleScript::Zoom: String::Format(buffer, sizeof(buffer), "ZOOM %u", command.Zoom); sb.Append(buffer); break; - case TITLE_SCRIPT_FOLLOW: + case TitleScript::Follow: String::Format(buffer, sizeof(buffer), "FOLLOW %u ", command.SpriteIndex); sb.Append(buffer); sb.Append(command.SpriteName); break; - case TITLE_SCRIPT_SPEED: + case TitleScript::Speed: String::Format(buffer, sizeof(buffer), "SPEED %u", command.Speed); sb.Append(buffer); break; - case TITLE_SCRIPT_WAIT: + case TitleScript::Wait: String::Format(buffer, sizeof(buffer), "WAIT %u", command.Milliseconds); sb.Append(buffer); break; - case TITLE_SCRIPT_RESTART: + case TitleScript::Restart: sb.Append("RESTART"); break; - case TITLE_SCRIPT_END: + case TitleScript::End: sb.Append("END"); } sb.Append("\n"); @@ -560,8 +566,8 @@ bool TitleSequenceIsLoadCommand(const TitleCommand& command) { switch (command.Type) { - case TITLE_SCRIPT_LOAD: - case TITLE_SCRIPT_LOADSC: + case TitleScript::Load: + case TitleScript::LoadSc: return true; default: return false; diff --git a/src/openrct2/title/TitleSequence.h b/src/openrct2/title/TitleSequence.h index 6fdb52368e..447eef9390 100644 --- a/src/openrct2/title/TitleSequence.h +++ b/src/openrct2/title/TitleSequence.h @@ -16,10 +16,10 @@ #include #define TITLE_COMMAND_SCENARIO_LENGTH 64 - +enum class TitleScript : uint8_t; struct TitleCommand { - uint8_t Type; + TitleScript Type; union { uint8_t SaveIndex; // LOAD (this index is internal only) @@ -58,21 +58,21 @@ struct TitleSequenceParkHandle std::unique_ptr Stream; }; -enum TITLE_SCRIPT +enum class TitleScript : uint8_t { - TITLE_SCRIPT_UNDEFINED = 0xFF, - TITLE_SCRIPT_WAIT = 0, - TITLE_SCRIPT_LOCATION, - TITLE_SCRIPT_ROTATE, - TITLE_SCRIPT_ZOOM, - TITLE_SCRIPT_FOLLOW, - TITLE_SCRIPT_RESTART, - TITLE_SCRIPT_LOAD, - TITLE_SCRIPT_END, - TITLE_SCRIPT_SPEED, - TITLE_SCRIPT_LOOP, - TITLE_SCRIPT_ENDLOOP, - TITLE_SCRIPT_LOADSC, + Undefined = 0xFF, + Wait = 0, + Location, + Rotate, + Zoom, + Follow, + Restart, + Load, + End, + Speed, + Loop, + EndLoop, + LoadSc, }; constexpr const utf8* TITLE_SEQUENCE_EXTENSION = ".parkseq";