From c08e54fde105637082ee7eb79eeacd1cb4137d57 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 23 Jan 2015 21:12:35 -0500 Subject: XEEN: Implement further script opcodes --- engines/xeen/interface.cpp | 5 +-- engines/xeen/map.cpp | 9 ++--- engines/xeen/map.h | 3 +- engines/xeen/party.cpp | 2 ++ engines/xeen/party.h | 3 ++ engines/xeen/saves.cpp | 2 ++ engines/xeen/saves.h | 3 ++ engines/xeen/scripts.cpp | 85 +++++++++++++++++++++++++++++++++++++++++----- engines/xeen/xeen.cpp | 5 ++- engines/xeen/xeen.h | 1 - 10 files changed, 98 insertions(+), 20 deletions(-) (limited to 'engines') diff --git a/engines/xeen/interface.cpp b/engines/xeen/interface.cpp index 7487d63788..307027bacc 100644 --- a/engines/xeen/interface.cpp +++ b/engines/xeen/interface.cpp @@ -79,8 +79,9 @@ void Interface::setup() { } void Interface::manageCharacters(bool soundPlayed) { - Screen &screen = *_vm->_screen; EventsManager &events = *_vm->_events; + Map &map = *_vm->_map; + Screen &screen = *_vm->_screen; bool flag = false; start: @@ -106,7 +107,7 @@ start: // Build up a list of characters on the same Xeen side being loaded for (int i = 0; i < XEEN_TOTAL_CHARACTERS; ++i) { PlayerStruct &player = _vm->_roster[i]; - if (player._name.empty() || player._xeenSide != _vm->_loadDarkSide) + if (player._name.empty() || player._xeenSide != (map._loadDarkSide ? 1 : 0)) continue; xeenSideChars.push_back(i); diff --git a/engines/xeen/map.cpp b/engines/xeen/map.cpp index 7801a050bb..ca22b38d93 100644 --- a/engines/xeen/map.cpp +++ b/engines/xeen/map.cpp @@ -857,7 +857,8 @@ void AnimationInfo::load(const Common::String &name) { /*------------------------------------------------------------------------*/ Map::Map(XeenEngine *vm) : _vm(vm), _mobData(vm) { - _townPortalSide = 0; + _townPortalSide = false; + _loadDarkSide = false; _sideObjects = 0; _sideMonsters = 0; _sidePictures = 0; @@ -896,13 +897,13 @@ void Map::load(int mapId) { _sideMonsters = 1; _sidePictures = 1; if (mapId >= 113 && mapId <= 127) { - _townPortalSide = 0; + _townPortalSide = false; } else { - _townPortalSide = _vm->_loadDarkSide; + _townPortalSide = _loadDarkSide; } if (_vm->getGameID() == GType_WorldOfXeen) { - if (_vm->_loadDarkSide) { + if (_loadDarkSide) { _animationInfo.load("clouds.dat"); _monsterData.load("xeen.mon"); _wallPicSprites.load("xeenpic.dat"); diff --git a/engines/xeen/map.h b/engines/xeen/map.h index 51f426d566..273a4b4a9d 100644 --- a/engines/xeen/map.h +++ b/engines/xeen/map.h @@ -345,7 +345,7 @@ private: MazeData _mazeData[9]; Common::String _mazeName; SpriteResource _wallPicSprites; - int _townPortalSide; + bool _townPortalSide; int _sidePictures; int _sideObjects; int _sideMonsters; @@ -374,6 +374,7 @@ public: int _currentTile; int _currentSurfaceId; bool _currentSteppedOn; + bool _loadDarkSide; public: Map(XeenEngine *vm); diff --git a/engines/xeen/party.cpp b/engines/xeen/party.cpp index b33318fcdf..8d59e686fd 100644 --- a/engines/xeen/party.cpp +++ b/engines/xeen/party.cpp @@ -272,6 +272,8 @@ Party::Party(XeenEngine *vm): _vm(vm) { _stepped = false; _damageType = DT_PHYSICAL; _falling = false; + _fallMaze = 0; + _fallDamage = 0; } void Party::synchronize(Common::Serializer &s) { diff --git a/engines/xeen/party.h b/engines/xeen/party.h index a00b18910d..3962ba45c0 100644 --- a/engines/xeen/party.h +++ b/engines/xeen/party.h @@ -221,6 +221,9 @@ public: bool _isNight; bool _stepped; int _falling; + Common::Point _fallPosition; + int _fallMaze; + int _fallDamage; DamageType _damageType; public: Party(XeenEngine *vm); diff --git a/engines/xeen/saves.cpp b/engines/xeen/saves.cpp index da791cdd77..85ab60bc12 100644 --- a/engines/xeen/saves.cpp +++ b/engines/xeen/saves.cpp @@ -49,6 +49,8 @@ SavesManager::SavesManager(XeenEngine *vm, Party &party, Roster &roster) : BaseCCArchive(), _vm(vm), _party(party), _roster(roster) { SearchMan.add("saves", this, 0, false); _data = nullptr; + _wonWorld = false; + _wonDarkSide = false; } SavesManager::~SavesManager() { diff --git a/engines/xeen/saves.h b/engines/xeen/saves.h index 7dea941f8d..5d35518348 100644 --- a/engines/xeen/saves.h +++ b/engines/xeen/saves.h @@ -66,6 +66,9 @@ private: void load(Common::SeekableReadStream *stream); public: static void syncBitFlags(Common::Serializer &s, bool *startP, bool *endP); +public: + bool _wonWorld; + bool _wonDarkSide; public: SavesManager(XeenEngine *vm, Party &party, Roster &roster); diff --git a/engines/xeen/scripts.cpp b/engines/xeen/scripts.cpp index afc86ab433..bbba4b9630 100644 --- a/engines/xeen/scripts.cpp +++ b/engines/xeen/scripts.cpp @@ -486,15 +486,82 @@ void Scripts::cmdNoAction2(Common::Array ¶ms) { error("TODO"); } void Scripts::cmdChooseNumeric(Common::Array ¶ms) { error("TODO"); } void Scripts::cmdDisplayBottomTwoLines(Common::Array ¶ms) { error("TODO"); } void Scripts::cmdDisplayLarge(Common::Array ¶ms) { error("TODO"); } -void Scripts::cmdExchObj(Common::Array ¶ms) { error("TODO"); } -void Scripts::cmdFallToMap(Common::Array ¶ms) { error("TODO"); } -void Scripts::cmdDisplayMain(Common::Array ¶ms) { error("TODO"); } -void Scripts::cmdGoto(Common::Array ¶ms) { error("TODO"); } - -void Scripts::cmdGotoRandom(Common::Array ¶ms) { error("TODO"); } -void Scripts::cmdCutsceneEndDarkside(Common::Array ¶ms) { error("TODO"); } -void Scripts::cmdCutsceneEdWorld(Common::Array ¶ms) { error("TODO"); } -void Scripts::cmdFlipWorld(Common::Array ¶ms) { error("TODO"); } + +/** + * Exchange the positions of two objects in the maze + */ +void Scripts::cmdExchObj(Common::Array ¶ms) { + MazeObject &obj1 = _vm->_map->_mobData._objects[params[0]]; + MazeObject &obj2 = _vm->_map->_mobData._objects[params[1]]; + + Common::Point pt = obj1._position; + obj1._position = obj2._position; + obj2._position = pt; + + _var4F = true; + cmdNoAction(params); +} + +void Scripts::cmdFallToMap(Common::Array ¶ms) { + Party &party = *_vm->_party; + party._fallMaze = params[0]; + party._fallPosition = Common::Point(params[1], params[2]); + party._fallDamage = params[3]; + + _var4F = true; + _lineNum = -1; +} + +void Scripts::cmdDisplayMain(Common::Array ¶ms) { + error("TODO"); +} + +/** + * Jumps to a given line number if the surface at relative cell position 1 matches + * a specified surface. + * @remarks This opcode is apparently never actually used + */ +void Scripts::cmdGoto(Common::Array ¶ms) { + Map &map = *_vm->_map; + map.getCell(1); + if (params[0] == map._currentSurfaceId) + _lineNum = params[1] - 1; + + _var4F = true; + cmdNoAction(params); +} + +/** + * Pick a random value from the parameter list and jump to that line number + */ +void Scripts::cmdGotoRandom(Common::Array ¶ms) { + _lineNum = params[_vm->getRandomNumber(1, params[0])] - 1; + _var4F = true; + cmdNoAction(params); +} + +void Scripts::cmdCutsceneEndDarkside(Common::Array ¶ms) { + Party &party = *_vm->_party; + _vm->_saves->_wonDarkSide = true; + party._questItems[53] = 1; + party._darkSideEnd = true; + party._mazeId = 29; + party._mazeDirection = DIR_NORTH; + party._mazePosition = Common::Point(25, 21); + + doEndGame2(); +} + +void Scripts::cmdCutsceneEdWorld(Common::Array ¶ms) { + _vm->_saves->_wonWorld = true; + _vm->_party->_worldEnd = true; + doWorldEnd(); +} + +void Scripts::cmdFlipWorld(Common::Array ¶ms) { + _vm->_map->_loadDarkSide = params[0] != 0; +} + void Scripts::cmdPlayCD(Common::Array ¶ms) { error("TODO"); } void Scripts::doEndGame() { diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp index 99adbb3a41..8489f86ed5 100644 --- a/engines/xeen/xeen.cpp +++ b/engines/xeen/xeen.cpp @@ -48,7 +48,6 @@ XeenEngine::XeenEngine(OSystem *syst, const XeenGameDescription *gameDesc) _scripts = nullptr; _sound = nullptr; _eventData = nullptr; - _loadDarkSide = 1; _dangerSenseAllowed = false; _noDirectionSense = false; _moveMonsters = false; @@ -287,8 +286,8 @@ void XeenEngine::play() { _screen->loadPalette("mm4.pal"); _interface->loadPartyIcons(); - if (getGameID() != GType_WorldOfXeen && !_loadDarkSide) { - _loadDarkSide = true; + if (getGameID() != GType_WorldOfXeen && !_map->_loadDarkSide) { + _map->_loadDarkSide = true; _party->_mazeId = 29; _party->_mazeDirection = DIR_NORTH; _party->_mazePosition.x = 25; diff --git a/engines/xeen/xeen.h b/engines/xeen/xeen.h index 1065adf9db..b60908ddfe 100644 --- a/engines/xeen/xeen.h +++ b/engines/xeen/xeen.h @@ -145,7 +145,6 @@ public: GameEvent _gameEvent; Common::SeekableReadStream *_eventData; Roster _roster; - int _loadDarkSide; bool _dangerSenseAllowed; bool _noDirectionSense; bool _moveMonsters; -- cgit v1.2.3