From 463ec2025a2c66321668b14a027112bf79425a2a Mon Sep 17 00:00:00 2001 From: Ted John Date: Sat, 24 Dec 2016 00:53:33 +0000 Subject: [PATCH] Fix #4902: Title Sequences hang when no waits are in, or loading single save --- src/title/TitleScreen.cpp | 40 ++++++++++++++++--------------- src/title/TitleSequence.cpp | 2 ++ src/title/TitleSequencePlayer.cpp | 21 ++++++++++++---- src/title/TitleSequencePlayer.h | 1 + 4 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/title/TitleScreen.cpp b/src/title/TitleScreen.cpp index 42e933bf80..cf4770583f 100644 --- a/src/title/TitleScreen.cpp +++ b/src/title/TitleScreen.cpp @@ -14,6 +14,7 @@ *****************************************************************************/ #pragma endregion +#include "../core/Console.hpp" #include "../network/network.h" #include "../OpenRCT2.h" #include "TitleScreen.h" @@ -44,12 +45,11 @@ extern "C" } static sint32 _sequenceAttemptId; -static sint32 _loadedTitleSequenceId = -1; +static uint16 _loadedTitleSequenceId = UINT16_MAX; static ITitleSequencePlayer * _sequencePlayer = nullptr; static void TitleInitialise(); static void TryLoadSequence(); -static void TryNextSequence(); /** * @@ -78,24 +78,30 @@ static void TryLoadSequence() { if (_loadedTitleSequenceId != gTitleCurrentSequence) { - if (_sequencePlayer->Begin(gTitleCurrentSequence)) + uint16 numSequences = (uint16)TitleSequenceManager::GetCount(); + if (numSequences > 0) { - _loadedTitleSequenceId = gTitleCurrentSequence; - gfx_invalidate_screen(); + uint16 targetSequence = gTitleCurrentSequence; + do + { + if (_sequencePlayer->Begin(targetSequence) && _sequencePlayer->Update()) + { + _loadedTitleSequenceId = targetSequence; + gTitleCurrentSequence = targetSequence; + gfx_invalidate_screen(); + return; + } + targetSequence = (targetSequence + 1) % numSequences; + } + while (targetSequence != gTitleCurrentSequence); } + Console::Error::WriteLine("Unable to play any title sequences."); + _sequencePlayer->Eject(); + gTitleCurrentSequence = UINT16_MAX; + _loadedTitleSequenceId = UINT16_MAX; } } -static void TryNextSequence() -{ - gTitleCurrentSequence = _sequenceAttemptId++; - if (_sequenceAttemptId >= (sint32)TitleSequenceManager::GetCount()) - { - _sequenceAttemptId = 0; - } - TryLoadSequence(); -} - extern "C" { /** @@ -176,10 +182,6 @@ extern "C" if (game_is_not_paused()) { TryLoadSequence(); - if (_sequencePlayer != nullptr && !_sequencePlayer->Update()) - { - TryNextSequence(); - } sint32 numUpdates = 1; if (gGameSpeed > 1) { diff --git a/src/title/TitleSequence.cpp b/src/title/TitleSequence.cpp index d60dd41250..919f9a2bff 100644 --- a/src/title/TitleSequence.cpp +++ b/src/title/TitleSequence.cpp @@ -58,6 +58,8 @@ extern "C" std::vector saves; bool isZip; + log_verbose("Loading title sequence: %s", path); + const utf8 * ext = Path::GetExtension(path); if (String::Equals(ext, TITLE_SEQUENCE_EXTENSION)) { diff --git a/src/title/TitleSequencePlayer.cpp b/src/title/TitleSequencePlayer.cpp index a031f1a724..edbf72d2bc 100644 --- a/src/title/TitleSequencePlayer.cpp +++ b/src/title/TitleSequencePlayer.cpp @@ -50,14 +50,20 @@ private: public: ~TitleSequencePlayer() override { - FreeTitleSequence(_sequence); + Eject(); } sint32 GetCurrentPosition() const override { return _position; } - + + void Eject() override + { + FreeTitleSequence(_sequence); + _sequence = nullptr; + } + bool Begin(uint32 titleSequenceId) override { size_t numSequences = TitleSequenceManager::GetCount(); @@ -73,7 +79,7 @@ public: return false; } - FreeTitleSequence(_sequence); + Eject(); _sequence = sequence; _sequenceId = titleSequenceId; @@ -124,13 +130,19 @@ public: break; } IncrementPosition(); + if (_position == entryPosition) + { + Console::Error::WriteLine("Infinite loop detected in title sequence."); + Console::Error::WriteLine(" A wait command may be missing."); + return false; + } } else { SkipToNextLoadCommand(); if (_position == entryPosition) { - // Unable to load any of the parks + Console::Error::WriteLine("Unable to load any parks within title sequence."); return false; } } @@ -143,7 +155,6 @@ public: { _position = 0; _waitCounter = 0; - Update(); } void Seek(sint32 targetPosition) override diff --git a/src/title/TitleSequencePlayer.h b/src/title/TitleSequencePlayer.h index 30023ebe57..ef6f6f18ce 100644 --- a/src/title/TitleSequencePlayer.h +++ b/src/title/TitleSequencePlayer.h @@ -30,6 +30,7 @@ interface ITitleSequencePlayer virtual void Reset() abstract; virtual bool Update() abstract; virtual void Seek(sint32 position) abstract; + virtual void Eject() abstract; }; ITitleSequencePlayer * CreateTitleSequencePlayer();