diff options
| author | Ľubomír Remák | 2018-03-24 15:43:50 +0100 | 
|---|---|---|
| committer | Eugene Sandulenko | 2018-08-25 23:12:01 +0200 | 
| commit | 574bb83b9760ff7a92da2b43146d245c0331d8ad (patch) | |
| tree | d1d5c0cfd19e97912319c602b36bd85552eaaadc | |
| parent | e93e20dbe869f2d3906ec1d0a151a21de29e9714 (diff) | |
| download | scummvm-rg350-574bb83b9760ff7a92da2b43146d245c0331d8ad.tar.gz scummvm-rg350-574bb83b9760ff7a92da2b43146d245c0331d8ad.tar.bz2 scummvm-rg350-574bb83b9760ff7a92da2b43146d245c0331d8ad.zip  | |
MUTATIONOFJB: Add support for NEWROOM command.
| -rw-r--r-- | engines/mutationofjb/commands/newroomcommand.cpp | 83 | ||||
| -rw-r--r-- | engines/mutationofjb/commands/newroomcommand.h | 56 | ||||
| -rw-r--r-- | engines/mutationofjb/game.cpp | 42 | ||||
| -rw-r--r-- | engines/mutationofjb/game.h | 3 | ||||
| -rw-r--r-- | engines/mutationofjb/gamedata.cpp | 4 | ||||
| -rw-r--r-- | engines/mutationofjb/gamedata.h | 1 | ||||
| -rw-r--r-- | engines/mutationofjb/module.mk | 1 | ||||
| -rw-r--r-- | engines/mutationofjb/script.cpp | 15 | ||||
| -rw-r--r-- | engines/mutationofjb/script.h | 1 | 
9 files changed, 194 insertions, 12 deletions
diff --git a/engines/mutationofjb/commands/newroomcommand.cpp b/engines/mutationofjb/commands/newroomcommand.cpp new file mode 100644 index 0000000000..818ef7d5ee --- /dev/null +++ b/engines/mutationofjb/commands/newroomcommand.cpp @@ -0,0 +1,83 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mutationofjb/commands/newroomcommand.h" +#include "mutationofjb/script.h" +#include "mutationofjb/game.h" +#include "mutationofjb/gamedata.h" +#include "common/str.h" + +/* +	"NEWROOM " <sceneId> " " <x> " " <y> " " <frame> + +	NEWROOM changes the current scene. While doing that, it also executes STARTUP section for the new room. +	However, after that, the execution goes back to the old script to finish commands after NEWROOM. + +	All parameters are supposed to be 3 characters long. +	SceneId is the scene to load, x and y are the player's new position and frame is the player's new frame (orientation). +*/ + +namespace MutationOfJB { + +bool NewRoomCommandParser::parse(const Common::String &line, ScriptParseContext &, Command *&command) { +	if (line.size() < 23 || !line.hasPrefix("NEWROOM")) { +		return false; +	} + +	const uint8 sceneId = atoi(line.c_str() + 8); +	const uint16 x = atoi(line.c_str() + 12); +	const uint16 y = atoi(line.c_str() + 16); +	const uint8 frame = atoi(line.c_str() + 20); +	command = new NewRoomCommand(sceneId, x, y, frame); +	return true; +} + + +NewRoomCommand::NewRoomCommand(uint8 sceneId, uint16 x, uint16 y, uint8 frame) : _sceneId(sceneId), _x(x), _y(y), _frame(frame), _innerExecCtx(nullptr) {} + +Command::ExecuteResult NewRoomCommand::execute(ScriptExecutionContext &scriptExecCtx) { +	Game &game = scriptExecCtx.getGame(); + +	// Execute new startup section. +	ExecuteResult res; +	if (!_innerExecCtx) { +		Script *newScript = game.changeSceneDelayScript(_sceneId, game.getGameData()._partB); +		_innerExecCtx = new ScriptExecutionContext(scriptExecCtx.getGame(), newScript); +		res =_innerExecCtx->startStartupSection(); +	} else { +		res = _innerExecCtx->runActiveCommand(); +	} + +	if (res == Finished) { +		delete _innerExecCtx; +		_innerExecCtx = nullptr; +	} + +	return res; +} + +Common::String NewRoomCommand::debugString() const { +	return Common::String::format("NEWROOM %u %u %u %u", (unsigned int) _sceneId, (unsigned int) _x, (unsigned int) _y, (unsigned int) _frame); +} + +} + diff --git a/engines/mutationofjb/commands/newroomcommand.h b/engines/mutationofjb/commands/newroomcommand.h new file mode 100644 index 0000000000..f224e44299 --- /dev/null +++ b/engines/mutationofjb/commands/newroomcommand.h @@ -0,0 +1,56 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MUTATIONOFJB_NEWROOMCOMMAND_H +#define MUTATIONOFJB_NEWROOMCOMMAND_H + +#include "mutationofjb/commands/seqcommand.h" + +namespace MutationOfJB { + +class ScriptExecutionContext; + +class NewRoomCommandParser : public SeqCommandParser { +public: +	NewRoomCommandParser() {} + +	virtual bool parse(const Common::String &line, ScriptParseContext &parseCtx, Command *&command) override; +}; + +class NewRoomCommand : public SeqCommand { +public: +	NewRoomCommand(uint8 sceneId, uint16 x, uint16 y, uint8 frame); + +	virtual ExecuteResult execute(ScriptExecutionContext &scriptExecCtx) override; +	virtual Common::String debugString() const override; +private: +	uint8 _sceneId; +	uint16 _x; +	uint16 _y; +	uint8 _frame; + +	ScriptExecutionContext *_innerExecCtx; +}; + +} + +#endif diff --git a/engines/mutationofjb/game.cpp b/engines/mutationofjb/game.cpp index 6436c7ad74..c5fa7b3342 100644 --- a/engines/mutationofjb/game.cpp +++ b/engines/mutationofjb/game.cpp @@ -35,7 +35,7 @@  namespace MutationOfJB {  Game::Game(MutationOfJBEngine *vm) -: _vm(vm), _scriptExecCtx(*this) { +: _vm(vm), _delayedLocalScript(nullptr), _scriptExecCtx(*this) {  	_gameData = new GameData;  	loadGameData(false); @@ -79,23 +79,18 @@ bool Game::loadGameData(bool partB) {  	return true;  } - -void Game::changeScene(uint8 sceneId, bool partB) { +Script *Game::changeSceneLoadScript(uint8 sceneId, bool partB) {  	_gameData->_lastScene = _gameData->_currentScene;  	_gameData->_currentScene = sceneId; +	_gameData->_partB = partB;  	_room->load(_gameData->_currentScene, partB); -	if (_localScript) { -		delete _localScript; -		_localScript = nullptr; -	} -  	EncryptedFile scriptFile;  	Common::String fileName = Common::String::format("scrn%d%s.atn", sceneId, partB ? "b" : "");  	scriptFile.open(fileName);  	if (!scriptFile.isOpen()) {  		reportFileMissingError(fileName.c_str()); -		return; +		return nullptr;  	}  	// TODO Actually parse this. @@ -103,14 +98,37 @@ void Game::changeScene(uint8 sceneId, bool partB) {  	dummy = scriptFile.readLine(); // Skip first line.  	scriptFile.seek(126, SEEK_CUR); // Skip 126 bytes. -	_localScript = new Script; -	_localScript->loadFromStream(scriptFile); +	Script *localScript = new Script; +	localScript->loadFromStream(scriptFile);  	scriptFile.close(); + +	return localScript;  } +void Game::changeScene(uint8 sceneId, bool partB) { +	if (_localScript) { +		delete _localScript; +		_localScript = nullptr; +	} + +	_localScript = changeSceneLoadScript(sceneId, partB); +	if (_localScript) { +		_scriptExecCtx.startStartupSection(); +	} +} + +Script *Game::changeSceneDelayScript(uint8 sceneId, bool partB) { +	_delayedLocalScript = changeSceneLoadScript(sceneId, partB); +	return _delayedLocalScript; +}  void Game::update() { -	_scriptExecCtx.runActiveCommand(); +	Command::ExecuteResult res = _scriptExecCtx.runActiveCommand(); +	if (res == Command::Finished && _delayedLocalScript) { +		delete _localScript; +		_localScript = _delayedLocalScript; +		_delayedLocalScript = nullptr; +	}  }  } diff --git a/engines/mutationofjb/game.h b/engines/mutationofjb/game.h index b44929df45..2855704b3b 100644 --- a/engines/mutationofjb/game.h +++ b/engines/mutationofjb/game.h @@ -47,6 +47,7 @@ public:  	Script *getLocalScript() const;  	void changeScene(uint8 sceneId, bool partB); +	Script *changeSceneDelayScript(uint8 sceneId, bool partB);  	void update(); @@ -54,12 +55,14 @@ private:  	bool loadGameData(bool partB);  	void runActiveCommand();  	void startCommand(Command *cmd); +	Script *changeSceneLoadScript(uint8 sceneId, bool partB);  	MutationOfJBEngine *_vm;  	GameData *_gameData;  	Script *_globalScript;  	Script *_localScript; +	Script *_delayedLocalScript;  	Room *_room;  	ScriptExecutionContext _scriptExecCtx; diff --git a/engines/mutationofjb/gamedata.cpp b/engines/mutationofjb/gamedata.cpp index a181510371..314eb569b5 100644 --- a/engines/mutationofjb/gamedata.cpp +++ b/engines/mutationofjb/gamedata.cpp @@ -183,6 +183,10 @@ Scene *GameData::getScene(uint8 sceneId) {  	return &_scenes[sceneId - 1];  } +Scene *GameData::getCurrentScene() { +	return getScene(_currentScene); +} +  bool GameData::loadFromStream(Common::ReadStream &stream) {  	for (int i = 0; i < ARRAYSIZE(_scenes); ++i) {  		_scenes[i].loadFromStream(stream); diff --git a/engines/mutationofjb/gamedata.h b/engines/mutationofjb/gamedata.h index ca70cd7588..eb474f8478 100644 --- a/engines/mutationofjb/gamedata.h +++ b/engines/mutationofjb/gamedata.h @@ -148,6 +148,7 @@ struct GameData {  public:  	GameData();  	Scene *getScene(uint8 sceneId); +	Scene *getCurrentScene();  	bool loadFromStream(Common::ReadStream &stream); diff --git a/engines/mutationofjb/module.mk b/engines/mutationofjb/module.mk index 447f9a920c..917ab3c4c7 100644 --- a/engines/mutationofjb/module.mk +++ b/engines/mutationofjb/module.mk @@ -13,6 +13,7 @@ MODULE_OBJS := \  	commands/ifitemcommand.o \  	commands/ifpiggycommand.o \  	commands/labelcommand.o \ +	commands/newroomcommand.o \  	commands/removeallitemscommand.o \  	commands/removeitemcommand.o \  	commands/saycommand.o \ diff --git a/engines/mutationofjb/script.cpp b/engines/mutationofjb/script.cpp index 8dc5e40fe7..b9b1515414 100644 --- a/engines/mutationofjb/script.cpp +++ b/engines/mutationofjb/script.cpp @@ -41,6 +41,7 @@  #include "mutationofjb/commands/gotocommand.h"  #include "mutationofjb/commands/camefromcommand.h"  #include "mutationofjb/commands/callmacrocommand.h" +#include "mutationofjb/commands/newroomcommand.h"  #include "mutationofjb/game.h"  namespace MutationOfJB { @@ -61,6 +62,7 @@ static CommandParser **getParsers() {  		new AddItemCommandParser,  		new RemoveItemCommandParser,  		new RemoveAllItemsCommandParser, +		new NewRoomCommandParser,  		new GotoCommandParser,  		new LabelCommandParser,  		nullptr @@ -147,6 +149,19 @@ Command::ExecuteResult ScriptExecutionContext::startCommand(Command *cmd) {  	return runActiveCommand();  } +Command::ExecuteResult ScriptExecutionContext::startStartupSection() { +	Script *localScript = _localScriptOverride ? _localScriptOverride : _game.getLocalScript(); + +	if (localScript) { +		Command *const startupCmd = localScript->getStartup(_game.getGameData().getCurrentScene()->_startup); +		if (startupCmd) { +			return startCommand(startupCmd); +		} +	} + +	return Command::Finished; +} +  Command *ScriptExecutionContext::getMacro(const Common::String &name) const {  	Command *cmd = nullptr; diff --git a/engines/mutationofjb/script.h b/engines/mutationofjb/script.h index 316aab52ea..09aa9425de 100644 --- a/engines/mutationofjb/script.h +++ b/engines/mutationofjb/script.h @@ -105,6 +105,7 @@ public:  	Command::ExecuteResult runActiveCommand();  	Command::ExecuteResult startCommand(Command *cmd); +	Command::ExecuteResult startStartupSection();  	void pushReturnCommand(Command *);  	Command *popReturnCommand();  | 
