[Scummvm-git-logs] scummvm master -> e59340e191d94c6ad58c0d9c8554e24e54324536

waltervn walter at vanniftrik-it.nl
Wed Dec 26 12:49:04 CET 2018


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
e59340e191 ADL: Add debug function to load commands from file


Commit: e59340e191d94c6ad58c0d9c8554e24e54324536
    https://github.com/scummvm/scummvm/commit/e59340e191d94c6ad58c0d9c8554e24e54324536
Author: Walter van Niftrik (walter at scummvm.org)
Date: 2018-12-26T12:28:09+01:00

Commit Message:
ADL: Add debug function to load commands from file

Changed paths:
    engines/adl/adl.cpp
    engines/adl/adl.h
    engines/adl/adl_v2.cpp
    engines/adl/adl_v2.h
    engines/adl/console.cpp
    engines/adl/console.h


diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp
index bf04860..f4f306a 100644
--- a/engines/adl/adl.cpp
+++ b/engines/adl/adl.cpp
@@ -29,6 +29,7 @@
 #include "common/events.h"
 #include "common/stream.h"
 #include "common/savefile.h"
+#include "common/random.h"
 
 #include "engines/util.h"
 
@@ -48,6 +49,8 @@ AdlEngine::~AdlEngine() {
 	delete _graphics;
 	delete _console;
 	delete _dumpFile;
+	delete _inputScript;
+	delete _random;
 }
 
 AdlEngine::AdlEngine(OSystem *syst, const AdlGameDescription *gd) :
@@ -62,6 +65,9 @@ AdlEngine::AdlEngine(OSystem *syst, const AdlGameDescription *gd) :
 		_isQuitting(false),
 		_abortScript(false),
 		_gameDescription(gd),
+		_inputScript(nullptr),
+		_scriptDelay(1000),
+		_scriptPaused(false),
 		_console(nullptr),
 		_messageIds(),
 		_saveVerb(0),
@@ -71,6 +77,7 @@ AdlEngine::AdlEngine(OSystem *syst, const AdlGameDescription *gd) :
 		_canSaveNow(false),
 		_canRestoreNow(false) {
 
+	_random = new Common::RandomSource("adl");
 	DebugMan.addDebugChannel(kDebugChannelScript, "Script", "Trace script execution");
 }
 
@@ -139,6 +146,9 @@ Common::String AdlEngine::getItemDescription(const Item &item) const {
 }
 
 void AdlEngine::delay(uint32 ms) const {
+	if (_inputScript && !_scriptPaused)
+		return;
+
 	uint32 now = g_system->getMillis();
 	const uint32 end = now + ms;
 
@@ -159,8 +169,36 @@ Common::String AdlEngine::inputString(byte prompt) const {
 	while (1) {
 		byte b = inputKey();
 
+		if (_inputScript) {
+			// If debug script is active, read input line from file
+			Common::String line(getScriptLine());
+
+			// Debug script terminated, go back to keyboard input
+			if (line.empty())
+				continue;
+
+			line += '\r';
+
+			Common::String native;
+
+			for (uint i = 0; i < line.size(); ++i)
+				native += APPLECHAR(line[i]);
+
+			_display->printString(native);
+			// Set pause flag to activate regular behaviour of delay and inputKey
+			_scriptPaused = true;
+
+			if (_scriptDelay > 0)
+				delay(_scriptDelay);
+			else
+				inputKey();
+
+			_scriptPaused = false;
+			return native;
+		}
+
 		if (shouldQuit() || _isRestoring)
-			return 0;
+			return Common::String();
 
 		if (b == 0)
 			continue;
@@ -193,6 +231,10 @@ Common::String AdlEngine::inputString(byte prompt) const {
 byte AdlEngine::inputKey(bool showCursor) const {
 	byte key = 0;
 
+	// If debug script is active, we fake a return press for the text overflow handling
+	if (_inputScript && !_scriptPaused)
+		return APPLECHAR('\r');
+
 	if (showCursor)
 		_display->showCursor(true);
 
@@ -213,6 +255,10 @@ byte AdlEngine::inputKey(bool showCursor) const {
 			};
 		}
 
+		// If debug script was activated in the meantime, abort input
+		if (_inputScript && !_scriptPaused)
+			return APPLECHAR('\r');
+
 		_display->updateTextScreen();
 		g_system->delayMillis(16);
 	}
@@ -481,6 +527,9 @@ void AdlEngine::bell(uint count) const {
 }
 
 bool AdlEngine::playTones(const Tones &tones, bool isMusic, bool allowSkip) const {
+	if (_inputScript && !_scriptPaused)
+		return false;
+
 	Audio::SoundHandle handle;
 	Audio::AudioStream *stream = new Sound(tones);
 
@@ -721,6 +770,44 @@ bool AdlEngine::hasFeature(EngineFeature f) const {
 	}
 }
 
+Common::String AdlEngine::getScriptLine() const {
+	Common::String line;
+
+	do {
+		line = _inputScript->readLine();
+
+		if (_inputScript->eos() || _inputScript->err()) {
+			stopScript();
+			return Common::String();
+		}
+
+		line.trim();
+	} while (line.size() == 0 || line.firstChar() == ';');
+
+	return line;
+}
+
+void AdlEngine::runScript(const char *filename) const {
+	// Debug functionality to read input from a text file
+	_inputScript = new Common::File;
+	if (!_inputScript->open(filename)) {
+		stopScript();
+		return;
+	}
+
+	Common::String line(getScriptLine());
+
+	if (!line.empty()) {
+		// Read random seed
+		_random->setSeed((uint32)line.asUint64());
+	}
+}
+
+void AdlEngine::stopScript() const {
+	delete _inputScript;
+	_inputScript = nullptr;
+}
+
 void AdlEngine::loadState(Common::ReadStream &stream) {
 	_state.room = stream.readByte();
 	_state.moves = stream.readByte();
@@ -935,7 +1022,7 @@ Common::String AdlEngine::getLine() {
 		Common::String line = inputString(APPLECHAR('?'));
 
 		if (shouldQuit() || _isRestoring)
-			return "";
+			return Common::String();
 
 		if ((byte)line[0] == ('\r' | 0x80)) {
 			_textMode = !_textMode;
diff --git a/engines/adl/adl.h b/engines/adl/adl.h
index d53cf5a..5de53ca 100644
--- a/engines/adl/adl.h
+++ b/engines/adl/adl.h
@@ -48,6 +48,7 @@ class WriteStream;
 class SeekableReadStream;
 class File;
 struct Event;
+class RandomSource;
 }
 
 namespace Adl {
@@ -399,9 +400,14 @@ protected:
 	bool _isRestarting, _isRestoring, _isQuitting;
 	bool _canSaveNow, _canRestoreNow;
 	bool _abortScript;
+	Common::RandomSource *_random;
 
 	const AdlGameDescription *_gameDescription;
 
+	mutable Common::File *_inputScript;
+	mutable uint _scriptDelay;
+	mutable bool _scriptPaused;
+
 private:
 	virtual void runIntro() { }
 	virtual void init() = 0;
@@ -411,7 +417,10 @@ private:
 	virtual void loadRoom(byte roomNr) = 0;
 	virtual void showRoom() = 0;
 	virtual void switchRegion(byte region) { }
-
+	void runScript(const char *filename) const;
+	void stopScript() const;
+	void setScriptDelay(uint delay) const { _scriptDelay = delay; }
+	Common::String getScriptLine() const;
 	// Engine
 	Common::Error run();
 	bool hasFeature(EngineFeature f) const;
diff --git a/engines/adl/adl_v2.cpp b/engines/adl/adl_v2.cpp
index 4eb12c3..4089ab3 100644
--- a/engines/adl/adl_v2.cpp
+++ b/engines/adl/adl_v2.cpp
@@ -31,7 +31,6 @@
 namespace Adl {
 
 AdlEngine_v2::~AdlEngine_v2() {
-	delete _random;
 	delete _disk;
 }
 
@@ -43,9 +42,7 @@ AdlEngine_v2::AdlEngine_v2(OSystem *syst, const AdlGameDescription *gd) :
 		_itemRemoved(false),
 		_roomOnScreen(0),
 		_picOnScreen(0),
-		_itemsOnScreen(0) {
-	_random = new Common::RandomSource("adl");
-}
+		_itemsOnScreen(0) { }
 
 void AdlEngine_v2::insertDisk(byte volume) {
 	delete _disk;
@@ -170,6 +167,20 @@ void AdlEngine_v2::checkTextOverflow(char c) {
 void AdlEngine_v2::handleTextOverflow() {
 	_linesPrinted = 0;
 	_display->updateTextScreen();
+
+	if (_inputScript) {
+		// Set pause flag to activate regular behaviour of delay and inputKey
+		_scriptPaused = true;
+
+		if (_scriptDelay > 0)
+			delay(_scriptDelay);
+		else
+			inputKey();
+
+		_scriptPaused = false;
+		return;
+	}
+
 	bell();
 
 	while (true) {
diff --git a/engines/adl/adl_v2.h b/engines/adl/adl_v2.h
index 1b4ee4d..861694a 100644
--- a/engines/adl/adl_v2.h
+++ b/engines/adl/adl_v2.h
@@ -25,10 +25,6 @@
 
 #include "adl/adl.h"
 
-namespace Common {
-class RandomSource;
-}
-
 namespace Adl {
 
 class AdlEngine_v2 : public AdlEngine {
@@ -97,9 +93,6 @@ protected:
 	bool _itemRemoved;
 	byte _roomOnScreen, _picOnScreen, _itemsOnScreen;
 	Common::Array<byte> _brokenRooms;
-
-private:
-	Common::RandomSource *_random;
 };
 
 } // End of namespace Adl
diff --git a/engines/adl/console.cpp b/engines/adl/console.cpp
index e1242fa..527a575 100644
--- a/engines/adl/console.cpp
+++ b/engines/adl/console.cpp
@@ -44,6 +44,9 @@ Console::Console(AdlEngine *engine) : GUI::Debugger() {
 	registerCmd("vars", WRAP_METHOD(Console, Cmd_Vars));
 	registerCmd("var", WRAP_METHOD(Console, Cmd_Var));
 	registerCmd("convert_disk", WRAP_METHOD(Console, Cmd_ConvertDisk));
+	registerCmd("run_script", WRAP_METHOD(Console, Cmd_RunScript));
+	registerCmd("stop_script", WRAP_METHOD(Console, Cmd_StopScript));
+	registerCmd("set_script_delay", WRAP_METHOD(Console, Cmd_SetScriptDelay));
 }
 
 Common::String Console::toAscii(const Common::String &str) {
@@ -423,4 +426,39 @@ bool Console::Cmd_ConvertDisk(int argc, const char **argv) {
 	return true;
 }
 
+bool Console::Cmd_RunScript(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("Usage: %s <file>\n", argv[0]);
+		return true;
+	}
+
+	_engine->runScript(argv[1]);
+
+	return false;
+}
+
+bool Console::Cmd_StopScript(int argc, const char **argv) {
+	if (argc != 1) {
+		debugPrintf("Usage: %s\n", argv[0]);
+		return true;
+	}
+
+	_engine->stopScript();
+
+	return true;
+}
+
+bool Console::Cmd_SetScriptDelay(int argc, const char **argv) {
+	if (argc != 2) {
+		debugPrintf("Usage: %s <delay>\n", argv[0]);
+		debugPrintf("A delay of zero indicates wait-for-key\n");
+		return true;
+	}
+
+	Common::String value(argv[1]);
+	_engine->setScriptDelay((uint)value.asUint64());
+
+	return true;
+}
+
 } // End of namespace Adl
diff --git a/engines/adl/console.h b/engines/adl/console.h
index 338fc42..db2e8ca 100644
--- a/engines/adl/console.h
+++ b/engines/adl/console.h
@@ -55,6 +55,9 @@ private:
 	bool Cmd_Vars(int argc, const char **argv);
 	bool Cmd_Var(int argc, const char **argv);
 	bool Cmd_ConvertDisk(int argc, const char **argv);
+	bool Cmd_RunScript(int argc, const char **argv);
+	bool Cmd_StopScript(int argc, const char **argv);
+	bool Cmd_SetScriptDelay(int argc, const char **argv);
 
 	void printItem(const Item &item);
 	void printWordMap(const Common::HashMap<Common::String, uint> &wordMap);





More information about the Scummvm-git-logs mailing list