From 63c93f22b39611d8563501c450d771541863235a Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 26 Nov 2016 15:32:49 +0000 Subject: [PATCH] Fix seeking --- src/title/TitleScreen.cpp | 5 ++ src/title/TitleScreen.h | 2 + src/title/TitleSequence.cpp | 12 +++ src/title/TitleSequence.h | 2 + src/title/TitleSequencePlayer.cpp | 121 +++++++++++++++++-------- src/title/TitleSequencePlayer.h | 17 ++++ src/windows/title_editor.c | 145 +++++++++++++++--------------- 7 files changed, 191 insertions(+), 113 deletions(-) diff --git a/src/title/TitleScreen.cpp b/src/title/TitleScreen.cpp index 7a735813a7..92035df398 100644 --- a/src/title/TitleScreen.cpp +++ b/src/title/TitleScreen.cpp @@ -215,4 +215,9 @@ extern "C" snprintf(ch, 256 - (ch - buffer), "%s (%s)", OPENRCT2_PLATFORM, OPENRCT2_ARCHITECTURE); gfx_draw_string(dpi, buffer, COLOUR_BLACK, x + 5, y + 5); } + + void * title_get_sequence_player() + { + return _sequencePlayer; + } } diff --git a/src/title/TitleScreen.h b/src/title/TitleScreen.h index b3fbda5410..112671b5df 100644 --- a/src/title/TitleScreen.h +++ b/src/title/TitleScreen.h @@ -28,6 +28,8 @@ extern "C" void title_create_windows(); void title_update(); void DrawOpenRCT2(rct_drawpixelinfo *dpi, int x, int y); + + void * title_get_sequence_player(); #ifdef __cplusplus } #endif diff --git a/src/title/TitleSequence.cpp b/src/title/TitleSequence.cpp index 24ef1dce2f..724defe78b 100644 --- a/src/title/TitleSequence.cpp +++ b/src/title/TitleSequence.cpp @@ -437,3 +437,15 @@ static utf8 * LegacyScriptWrite(TitleSequence * seq) utf8 * result = sb.StealString(); return result; } + +bool TitleSequenceIsLoadCommand(const TitleCommand * command) +{ + switch (command->Type) { + case TITLE_SCRIPT_LOADMM: + case TITLE_SCRIPT_LOAD: + case TITLE_SCRIPT_LOADRCT1: + return true; + default: + return false; + } +} diff --git a/src/title/TitleSequence.h b/src/title/TitleSequence.h index 72f017b981..6d5fbbc9f1 100644 --- a/src/title/TitleSequence.h +++ b/src/title/TitleSequence.h @@ -90,6 +90,8 @@ extern "C" TitleSequenceParkHandle * TitleSequenceGetParkHandle(TitleSequence * seq, size_t index); void TitleSequenceCloseParkHandle(TitleSequenceParkHandle * handle); bool TileSequenceSave(TitleSequence * seq); + + bool TitleSequenceIsLoadCommand(const TitleCommand * command); #ifdef __cplusplus } #endif diff --git a/src/title/TitleSequencePlayer.cpp b/src/title/TitleSequencePlayer.cpp index c8d8e1c18c..6399729618 100644 --- a/src/title/TitleSequencePlayer.cpp +++ b/src/title/TitleSequencePlayer.cpp @@ -83,50 +83,53 @@ public: bool Update() override { + sint32 entryPosition = _position; FixViewLocation(); - sint32 entryPosition = _position; - if (_waitCounter <= 0) + // Check that position is valid + if (_position > (sint32)_sequence->NumCommands) { - do - { - if (_position > (sint32)_sequence->NumCommands) - { - _position = 0; - return false; - } + _position = 0; + return false; + } + // Don't execute next command until we are done with the current wait command + if (_waitCounter != 0) + { + _waitCounter--; + if (_waitCounter == 0) + { const TitleCommand * command = &_sequence->Commands[_position]; - bool successful = ExecuteCommand(command); - IncrementPosition(); - if (!successful) + if (command->Type == TITLE_SCRIPT_WAIT) { - bool isLoadCommand = false; - do - { - const TitleCommand * command = &_sequence->Commands[_position]; - switch (command->Type) { - case TITLE_SCRIPT_LOADMM: - case TITLE_SCRIPT_LOAD: - case TITLE_SCRIPT_LOADRCT1: - isLoadCommand = true; - break; - default: - IncrementPosition(); - if (_position == entryPosition) - { - // We have got back to where we started so we can't load any of these parks - return false; - } - break; - } - } - while (!isLoadCommand); + IncrementPosition(); + } + } + } + else + { + while (true) + { + const TitleCommand * command = &_sequence->Commands[_position]; + if (ExecuteCommand(command)) + { + if (command->Type == TITLE_SCRIPT_WAIT) + { + break; + } + IncrementPosition(); + } + else + { + SkipToNextLoadCommand(); + if (_position == entryPosition) + { + // Unable to load any of the parks + return false; + } } } - while (_waitCounter == 0); } - _waitCounter--; return true; } @@ -151,12 +154,11 @@ public: // Set position to the last LOAD command before target position for (sint32 i = targetPosition; i >= 0; i--) { - uint8 commandType = _sequence->Commands[i].Type; - if (commandType == TITLE_SCRIPT_LOADMM || - commandType == TITLE_SCRIPT_LOAD || - commandType == TITLE_SCRIPT_LOADRCT1) + const TitleCommand * command = &_sequence->Commands[i]; + if (TitleSequenceIsLoadCommand(command)) { _position = i; + break; } } @@ -172,6 +174,8 @@ public: break; } } + + _waitCounter = 0; } private: @@ -184,6 +188,17 @@ private: } } + void SkipToNextLoadCommand() + { + const TitleCommand * command; + do + { + IncrementPosition(); + command = &_sequence->Commands[_position]; + } + while (!TitleSequenceIsLoadCommand(command)); + } + bool ExecuteCommand(const TitleCommand * command) { switch (command->Type) { @@ -400,3 +415,31 @@ ITitleSequencePlayer * CreateTitleSequencePlayer() { return new TitleSequencePlayer(); } + +extern "C" +{ + sint32 title_sequence_player_get_current_position(ITitleSequencePlayer * player) + { + return player->GetCurrentPosition(); + } + + bool title_sequence_player_begin(ITitleSequencePlayer * player, uint32 titleSequenceId) + { + return player->Begin(titleSequenceId); + } + + void title_sequence_player_reset(ITitleSequencePlayer * player) + { + player->Reset(); + } + + bool title_sequence_player_update(ITitleSequencePlayer * player) + { + return player->Update(); + } + + void title_sequence_player_seek(ITitleSequencePlayer * player, uint32 position) + { + player->Seek(position); + } +} diff --git a/src/title/TitleSequencePlayer.h b/src/title/TitleSequencePlayer.h index dcca351f2d..0bacb048ba 100644 --- a/src/title/TitleSequencePlayer.h +++ b/src/title/TitleSequencePlayer.h @@ -35,4 +35,21 @@ interface ITitleSequencePlayer ITitleSequencePlayer * CreateTitleSequencePlayer(); +#else + +typedef struct ITitleSequencePlayer ITitleSequencePlayer; + +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + sint32 title_sequence_player_get_current_position(ITitleSequencePlayer * player); + bool title_sequence_player_begin(ITitleSequencePlayer * player, uint32 titleSequenceId); + void title_sequence_player_reset(ITitleSequencePlayer * player); + bool title_sequence_player_update(ITitleSequencePlayer * player); + void title_sequence_player_seek(ITitleSequencePlayer * player, uint32 position); +#ifdef __cplusplus +} #endif diff --git a/src/windows/title_editor.c b/src/windows/title_editor.c index f7d85d01c1..5f70bb81e4 100644 --- a/src/windows/title_editor.c +++ b/src/windows/title_editor.c @@ -32,6 +32,7 @@ #include "../title/TitleScreen.h" #include "../title/TitleSequence.h" #include "../title/TitleSequenceManager.h" +#include "../title/TitleSequencePlayer.h" #include "../util/util.h" #include "../world/sprite.h" #include "dropdown.h" @@ -62,6 +63,7 @@ static void window_title_editor_scrollpaint_saves(rct_window *w, rct_drawpixelin static void window_title_editor_scrollpaint_commands(rct_window *w, rct_drawpixelinfo *dpi); static void window_title_editor_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w); static void window_title_editor_load_sequence(); +static ITitleSequencePlayer * window_title_editor_get_player(); static rct_window_event_list window_title_editor_events = { window_title_editor_close, @@ -190,12 +192,8 @@ static rct_widget window_title_editor_widgets[] = { }; static sint16 _window_title_editor_highlighted_index; -static TitleSequence * _loadedTitleSequence; - -int gTitleScriptCommand; -int gTitleScriptSkipLoad; -int gTitleScriptSkipTo; -int gTitleScriptSave; +static TitleSequence * _editingTitleSequence = NULL; +static bool _playingTitleSequence = false; static int window_title_editor_tab_animation_loops[] = { 64, @@ -299,7 +297,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) break; case WIDX_TITLE_EDITOR_DUPLICATE_BUTTON: if (!commandEditorOpen) { - window_text_input_open(w, widgetIndex, STR_TITLE_EDITOR_ACTION_DUPLICATE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_loadedTitleSequence->Name, 64); + window_text_input_open(w, widgetIndex, STR_TITLE_EDITOR_ACTION_DUPLICATE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_editingTitleSequence->Name, 64); } break; case WIDX_TITLE_EDITOR_DELETE_BUTTON: @@ -309,7 +307,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) break; case WIDX_TITLE_EDITOR_RENAME_BUTTON: if (!readOnly && !commandEditorOpen) { - window_text_input_open(w, widgetIndex, STR_TRACK_MANAGE_RENAME, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_loadedTitleSequence->Name, 64); + window_text_input_open(w, widgetIndex, STR_TRACK_MANAGE_RENAME, STR_TITLE_EDITOR_ENTER_NAME_FOR_SEQUENCE, STR_STRING, (uintptr_t)_editingTitleSequence->Name, 64); } break; case WIDX_TITLE_EDITOR_ADD: @@ -324,8 +322,8 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) title_sequence_remove_save(gCurrentTitleSequence, w->selected_list_item); if (w->selected_list_item > 0) { w->selected_list_item--; - } else if (w->selected_list_item > (sint16)_loadedTitleSequence->NumSaves) { - w->selected_list_item = (sint16)(_loadedTitleSequence->NumSaves - 1); + } else if (w->selected_list_item > (sint16)_editingTitleSequence->NumSaves) { + w->selected_list_item = (sint16)(_editingTitleSequence->NumSaves - 1); } } } @@ -333,22 +331,22 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) case WIDX_TITLE_EDITOR_RENAME: if (!readOnly && !playing && !commandEditorOpen) { if (w->selected_list_item != -1) { - window_text_input_open(w, widgetIndex, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SAVE, STR_STRING, (uintptr_t)_loadedTitleSequence->Saves[w->selected_list_item], 52 - 1); + window_text_input_open(w, widgetIndex, STR_FILEBROWSER_RENAME_SAVE_TITLE, STR_TITLE_EDITOR_ENTER_NAME_FOR_SAVE, STR_STRING, (uintptr_t)_editingTitleSequence->Saves[w->selected_list_item], 52 - 1); } } break; case WIDX_TITLE_EDITOR_LOAD: if (w->selected_list_item != -1) { utf8 path[MAX_PATH]; - if (str_is_null_or_empty(_loadedTitleSequence->Path)) { - safe_strcpy(path, _loadedTitleSequence->Path, sizeof(path)); + if (str_is_null_or_empty(_editingTitleSequence->Path)) { + safe_strcpy(path, _editingTitleSequence->Path, sizeof(path)); } else { // TODO: This should probably use a constant platform_get_user_directory(path, "title sequences", sizeof(path)); - safe_strcat_path(path, _loadedTitleSequence->Name, sizeof(path)); + safe_strcat_path(path, _editingTitleSequence->Name, sizeof(path)); } - safe_strcat_path(path, _loadedTitleSequence->Saves[w->selected_list_item], sizeof(path)); + safe_strcat_path(path, _editingTitleSequence->Saves[w->selected_list_item], sizeof(path)); game_load_save(path); window_title_editor_open(1); } @@ -358,25 +356,25 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) if (w->selected_list_item != -1) { window_title_command_editor_open(w->selected_list_item + 1, true); } else { - window_title_command_editor_open((int)_loadedTitleSequence->NumCommands, true); + window_title_command_editor_open((int)_editingTitleSequence->NumCommands, true); } } break; case WIDX_TITLE_EDITOR_EDIT: if (!readOnly && !playing && !commandEditorOpen) { - if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_loadedTitleSequence->NumCommands) { + if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_editingTitleSequence->NumCommands) { window_title_command_editor_open(w->selected_list_item, false); } } break; case WIDX_TITLE_EDITOR_DELETE: if (!readOnly && !playing && !commandEditorOpen) { - if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_loadedTitleSequence->NumCommands) { + if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_editingTitleSequence->NumCommands) { title_sequence_delete_command(gCurrentTitleSequence, w->selected_list_item); if (w->selected_list_item > 0) { w->selected_list_item--; - } else if (w->selected_list_item >= (sint16)_loadedTitleSequence->NumCommands) { - w->selected_list_item = (sint16)(_loadedTitleSequence->NumCommands - 1); + } else if (w->selected_list_item >= (sint16)_editingTitleSequence->NumCommands) { + w->selected_list_item = (sint16)(_editingTitleSequence->NumCommands - 1); } } } @@ -387,27 +385,18 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) } break;*/ case WIDX_TITLE_EDITOR_SKIP_TO: - if (playing && w->selected_list_item != -1 && w->selected_list_item < (sint16)_loadedTitleSequence->NumCommands) { - if (gTitleScriptCommand > w->selected_list_item) { - gTitleScriptCommand = 0; - } - if (gTitleScriptCommand != w->selected_list_item) { - for (int i = gTitleScriptCommand + 1; i < (int)_loadedTitleSequence->NumCommands; i++) { - if (_loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_LOAD || - _loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_LOADMM) { - gTitleScriptSkipLoad = i; - } - if (i == w->selected_list_item) { - gTitleScriptSkipTo = i; - break; - } - } - } + { + sint32 position = w->selected_list_item; + if (playing && position != -1 && position < (sint32)_editingTitleSequence->NumCommands) { + ITitleSequencePlayer * player = window_title_editor_get_player(); + title_sequence_player_seek(player, position); + title_sequence_player_update(player); } break; + } case WIDX_TITLE_EDITOR_MOVE_DOWN: if (!readOnly && !playing && !commandEditorOpen) { - if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_loadedTitleSequence->NumCommands - 1) { + if (w->selected_list_item != -1 && w->selected_list_item < (sint16)_editingTitleSequence->NumCommands - 1) { title_sequence_move_down_command(gCurrentTitleSequence, w->selected_list_item); w->selected_list_item++; } @@ -422,6 +411,11 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) } break; case WIDX_TITLE_EDITOR_REPLAY: + if (playing) { + ITitleSequencePlayer * player = window_title_editor_get_player(); + title_sequence_player_reset(player); + title_sequence_player_update(player); + } break; case WIDX_TITLE_EDITOR_STOP: if (playing) { @@ -431,31 +425,18 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) case WIDX_TITLE_EDITOR_PLAY: if (gCurrentTitleSequence != gCurrentPreviewTitleSequence && inTitle) { gCurrentPreviewTitleSequence = gCurrentTitleSequence; + _playingTitleSequence = true; } break; case WIDX_TITLE_EDITOR_SKIP: if (playing) { - int i; - for (i = gTitleScriptCommand; i < (int)_loadedTitleSequence->NumCommands; i++) { - if (_loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_LOAD || - _loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_LOADMM - ) { - gTitleScriptSkipLoad = i; - break; - } else if (_loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_WAIT || - _loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_END) { - gTitleScriptSkipTo = i; - break; - } else if (_loadedTitleSequence->Commands[i].Type == TITLE_SCRIPT_RESTART) { - gTitleScriptSkipLoad = -1; - gTitleScriptSkipTo = -1; - break; - } - } - if (i == _loadedTitleSequence->NumCommands && i - 1 > gTitleScriptCommand) { - gTitleScriptSkipTo = i - 1; - gTitleScriptSkipLoad = -1; + ITitleSequencePlayer * player = window_title_editor_get_player(); + sint32 position = title_sequence_player_get_current_position(player) + 1; + if (position >= (sint32)_editingTitleSequence->NumCommands) { + position = 0; } + title_sequence_player_seek(player, position); + title_sequence_player_update(player); } break; } @@ -471,7 +452,7 @@ static void window_title_editor_mouseup(rct_window *w, int widgetIndex) static void window_title_editor_resize(rct_window *w) { if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_PRESETS) { - window_set_resize(w, WW, WH, WH2, WH2); + window_set_resize(w, WW, WH, 500, WH2); } else { window_set_resize(w, WW, WH, 500, 580); } @@ -554,9 +535,9 @@ static void window_title_editor_scrollgetsize(rct_window *w, int scrollIndex, in { size_t lineCount = 1; if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SAVES) { - lineCount = _loadedTitleSequence->NumSaves; + lineCount = _editingTitleSequence->NumSaves; } else if (w->selected_tab == WINDOW_TITLE_EDITOR_TAB_SCRIPT) { - lineCount = _loadedTitleSequence->NumCommands; + lineCount = _editingTitleSequence->NumCommands; } *height = (int)(lineCount * ROW_HEIGHT); @@ -578,13 +559,13 @@ static void window_title_editor_scrollmousedown(rct_window *w, int scrollIndex, w->selected_list_item = -1; switch (w->selected_tab) { case WINDOW_TITLE_EDITOR_TAB_SAVES: - if (index < (int)_loadedTitleSequence->NumSaves) { + if (index < (int)_editingTitleSequence->NumSaves) { w->selected_list_item = index; widget_invalidate(w, WIDX_TITLE_EDITOR_LIST); } break; case WINDOW_TITLE_EDITOR_TAB_SCRIPT: - if (index < (int)_loadedTitleSequence->NumCommands) { + if (index < (int)_editingTitleSequence->NumCommands) { w->selected_list_item = index; widget_invalidate(w, WIDX_TITLE_EDITOR_LIST); } @@ -597,11 +578,11 @@ static void window_title_editor_scrollmouseover(rct_window *w, int scrollIndex, int index = y / ROW_HEIGHT; switch (w->selected_tab) { case WINDOW_TITLE_EDITOR_TAB_SAVES: - if (index < (int)_loadedTitleSequence->NumSaves) + if (index < (int)_editingTitleSequence->NumSaves) _window_title_editor_highlighted_index = (sint16)index; break; case WINDOW_TITLE_EDITOR_TAB_SCRIPT: - if (index < (int)_loadedTitleSequence->NumCommands) + if (index < (int)_editingTitleSequence->NumCommands) _window_title_editor_highlighted_index = (sint16)index; break; } @@ -640,7 +621,7 @@ static void window_title_editor_textinput(rct_window *w, int widgetIndex, char * if (filename_valid_characters(text)) { if (!title_sequence_save_exists(gCurrentTitleSequence, text)) { title_sequence_rename_save(gCurrentTitleSequence, w->selected_list_item, text); - TileSequenceSave(_loadedTitleSequence); + TileSequenceSave(_editingTitleSequence); window_invalidate(w); } else { window_error_open(STR_ERROR_EXISTING_NAME, STR_NONE); @@ -770,7 +751,7 @@ static void window_title_editor_paint(rct_window *w, rct_drawpixelinfo *dpi) // Draw strings switch (w->selected_tab) { case WINDOW_TITLE_EDITOR_TAB_PRESETS: - set_format_arg(0, uintptr_t, _loadedTitleSequence->Name); + set_format_arg(0, uintptr_t, _editingTitleSequence->Name); gfx_draw_string_left(dpi, STR_TITLE_SEQUENCE, NULL, w->colours[1], w->x + 10, w->y + window_title_editor_widgets[WIDX_TITLE_EDITOR_PRESETS].top + 1); gfx_draw_string_left_clipped( dpi, @@ -803,16 +784,21 @@ static void window_title_editor_scrollpaint(rct_window *w, rct_drawpixelinfo *dp static void window_title_editor_scrollpaint_saves(rct_window *w, rct_drawpixelinfo *dpi) { + sint32 currentSaveIndex = -1; + // ITitleSequencePlayer * player = window_title_editor_get_player(); + // sint32 position = title_sequence_player_get_current_position(player); + // const TitleCommand * command = &_editingTitleSequence->Commands[position]; + int x = 0; int y = 0; bool inTitle = ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO); - for (int i = 0; i < (int)_loadedTitleSequence->NumSaves; i++, y += ROW_HEIGHT) { + for (int i = 0; i < (int)_editingTitleSequence->NumSaves; i++, y += ROW_HEIGHT) { bool selected = false; bool hover = false; if (i == w->selected_list_item) { selected = true; gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].dark); - } else if (i == _window_title_editor_highlighted_index || (i == gTitleScriptSave && inTitle && gCurrentTitleSequence == gCurrentPreviewTitleSequence)) { + } else if (i == _window_title_editor_highlighted_index || i == currentSaveIndex) { hover = true; gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].mid_dark); } else if (i & 1) { @@ -820,7 +806,7 @@ static void window_title_editor_scrollpaint_saves(rct_window *w, rct_drawpixelin } char buffer[256]; - set_format_arg(0, uintptr_t, _loadedTitleSequence->Saves[i]); + set_format_arg(0, uintptr_t, _editingTitleSequence->Saves[i]); if (selected || hover) { format_string(buffer, 256, STR_STRING, gCommonFormatArgs); } else { @@ -834,18 +820,24 @@ static void window_title_editor_scrollpaint_saves(rct_window *w, rct_drawpixelin static void window_title_editor_scrollpaint_commands(rct_window *w, rct_drawpixelinfo *dpi) { + sint32 position = -1; + if (_playingTitleSequence) { + ITitleSequencePlayer * player = window_title_editor_get_player(); + position = title_sequence_player_get_current_position(player); + } + int x = 0; int y = 0; bool inTitle = ((gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) == SCREEN_FLAGS_TITLE_DEMO); - for (int i = 0; i < (int)_loadedTitleSequence->NumCommands; i++, y += ROW_HEIGHT) { - TitleCommand * command = &_loadedTitleSequence->Commands[i]; + for (int i = 0; i < (int)_editingTitleSequence->NumCommands; i++, y += ROW_HEIGHT) { + TitleCommand * command = &_editingTitleSequence->Commands[i]; bool selected = false; bool hover = false; bool error = false; if (i == w->selected_list_item) { selected = true; gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].dark); - } else if (i == (int)_window_title_editor_highlighted_index || (i == gTitleScriptCommand && inTitle && gCurrentTitleSequence == gCurrentPreviewTitleSequence)) { + } else if (i == (int)_window_title_editor_highlighted_index || i == position) { hover = true; gfx_fill_rect(dpi, x, y, x + SCROLL_WIDTH + 100, y + ROW_HEIGHT - 1, ColourMapA[w->colours[1]].mid_dark); } else if (i & 1) { @@ -860,7 +852,7 @@ static void window_title_editor_scrollpaint_commands(rct_window *w, rct_drawpixe commandName = STR_TITLE_EDITOR_COMMAND_LOAD_NO_SAVE; error = true; } - set_format_arg(0, uintptr_t, _loadedTitleSequence->Saves[command->SaveIndex]); + set_format_arg(0, uintptr_t, _editingTitleSequence->Saves[command->SaveIndex]); break; case TITLE_SCRIPT_LOADMM: commandName = STR_TITLE_EDITOR_COMMAND_LOAD_SFMM; @@ -939,5 +931,10 @@ static void window_title_editor_draw_tab_images(rct_drawpixelinfo *dpi, rct_wind static void window_title_editor_load_sequence() { const char * path = title_sequence_manager_get_path(gCurrentTitleSequence); - _loadedTitleSequence = LoadTitleSequence(path); + _editingTitleSequence = LoadTitleSequence(path); +} + +static ITitleSequencePlayer * window_title_editor_get_player() +{ + return (ITitleSequencePlayer *)title_get_sequence_player(); }