diff options
-rw-r--r-- | engines/adl/adl.cpp | 11 | ||||
-rw-r--r-- | engines/adl/adl.h | 3 | ||||
-rw-r--r-- | engines/adl/hires1.cpp | 23 | ||||
-rw-r--r-- | engines/adl/hires1.h | 1 |
4 files changed, 34 insertions, 4 deletions
diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp index e395c8266f..24a18d62ac 100644 --- a/engines/adl/adl.cpp +++ b/engines/adl/adl.cpp @@ -43,7 +43,8 @@ AdlEngine::AdlEngine(OSystem *syst, const AdlGameDescription *gd) : Engine(syst), _gameDescription(gd), _display(nullptr), - _parser(nullptr) { + _parser(nullptr), + _isRestarting(false) { } AdlEngine::~AdlEngine() { @@ -271,7 +272,8 @@ void AdlEngine::doActions(const Command &command, byte noun, byte offset) { _display->printString(_strings[IDI_STR_PLAY_AGAIN]); Common::String input = _display->inputString(); if (input.size() == 0 || input[0] != APPLECHAR('N')) { - warning("Restart game not implemented"); + _isRestarting = true; + restartGame(); return; } // Fall-through @@ -392,8 +394,11 @@ bool AdlEngine::doOneCommand(const Commands &commands, byte verb, byte noun) { void AdlEngine::doAllCommands(const Commands &commands, byte verb, byte noun) { Commands::const_iterator cmd; - for (cmd = commands.begin(); cmd != commands.end(); ++cmd) + for (cmd = commands.begin(); cmd != commands.end(); ++cmd) { checkCommand(*cmd, verb, noun); + if (_isRestarting) + return; + } } void AdlEngine::clearScreen() { diff --git a/engines/adl/adl.h b/engines/adl/adl.h index d39e0e3638..8b0aa45937 100644 --- a/engines/adl/adl.h +++ b/engines/adl/adl.h @@ -175,6 +175,8 @@ public: protected: virtual void runGame() = 0; + virtual void initState() = 0; + virtual void restartGame() = 0; virtual uint getEngineMessage(EngineMessage msg) = 0; Common::String readString(Common::ReadStream &stream, byte until = 0); void printStrings(Common::SeekableReadStream &stream, int count = 1); @@ -194,6 +196,7 @@ protected: Display *_display; Parser *_parser; + bool _isRestarting; Common::Array<Common::String> _strings; Common::Array<Common::String> _messages; diff --git a/engines/adl/hires1.cpp b/engines/adl/hires1.cpp index 1316bf2d70..4cf7b4599d 100644 --- a/engines/adl/hires1.cpp +++ b/engines/adl/hires1.cpp @@ -56,6 +56,7 @@ enum { IDI_HR1_STR_DONT_HAVE_IT, IDI_HR1_STR_DONT_UNDERSTAND, IDI_HR1_STR_GETTING_DARK, + IDI_HR1_STR_PRESS_RETURN, IDI_HR1_STR_TOTAL }; @@ -69,7 +70,8 @@ static const StringOffset stringOffsets[] = { { IDI_HR1_STR_CANT_GO_THERE, 0x6c0a }, { IDI_HR1_STR_DONT_HAVE_IT, 0x6c31 }, { IDI_HR1_STR_DONT_UNDERSTAND, 0x6c51 }, - { IDI_HR1_STR_GETTING_DARK, 0x6c7c } + { IDI_HR1_STR_GETTING_DARK, 0x6c7c }, + { IDI_HR1_STR_PRESS_RETURN, 0x5f68 } }; #define IDI_HR1_OFS_PD_TEXT_0 0x5d @@ -268,6 +270,13 @@ void HiRes1Engine::initState() { } } +void HiRes1Engine::restartGame() { + initState(); + _display->printString(_strings[IDI_HR1_STR_PRESS_RETURN]); + _display->inputString(); // Missing in the original + _display->printASCIIString("\r\r\r\r\r"); +} + void HiRes1Engine::runGame() { runIntro(); _display->printASCIIString("\r"); @@ -348,7 +357,12 @@ void HiRes1Engine::runGame() { f.seek(0xf00); _parser->loadNouns(f); + _display->printASCIIString("\r\r\r\r\r"); + while (1) { + if (_isRestarting) + _isRestarting = false; + uint verb = 0, noun = 0; clearScreen(); showRoom(); @@ -356,8 +370,15 @@ void HiRes1Engine::runGame() { if (!doOneCommand(_roomCommands, verb, noun)) printMessage(37); + + if (_isRestarting) + continue; + doAllCommands(_globalCommands, verb, noun); + if (_isRestarting) + continue; + _state.moves++; if (shouldQuit()) diff --git a/engines/adl/hires1.h b/engines/adl/hires1.h index 5cc9f3ac98..a378dc9423 100644 --- a/engines/adl/hires1.h +++ b/engines/adl/hires1.h @@ -49,6 +49,7 @@ private: MH_ITEM_OFFSETS = 21 }; + void restartGame(); void printMessage(uint idx, bool wait = true); uint getEngineMessage(EngineMessage msg); |