aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/xeen/interface.cpp5
-rw-r--r--engines/xeen/map.cpp9
-rw-r--r--engines/xeen/map.h3
-rw-r--r--engines/xeen/party.cpp2
-rw-r--r--engines/xeen/party.h3
-rw-r--r--engines/xeen/saves.cpp2
-rw-r--r--engines/xeen/saves.h3
-rw-r--r--engines/xeen/scripts.cpp85
-rw-r--r--engines/xeen/xeen.cpp5
-rw-r--r--engines/xeen/xeen.h1
10 files changed, 98 insertions, 20 deletions
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
@@ -67,6 +67,9 @@ private:
public:
static void syncBitFlags(Common::Serializer &s, bool *startP, bool *endP);
public:
+ bool _wonWorld;
+ bool _wonDarkSide;
+public:
SavesManager(XeenEngine *vm, Party &party, Roster &roster);
~SavesManager();
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<byte> &params) { error("TODO"); }
void Scripts::cmdChooseNumeric(Common::Array<byte> &params) { error("TODO"); }
void Scripts::cmdDisplayBottomTwoLines(Common::Array<byte> &params) { error("TODO"); }
void Scripts::cmdDisplayLarge(Common::Array<byte> &params) { error("TODO"); }
-void Scripts::cmdExchObj(Common::Array<byte> &params) { error("TODO"); }
-void Scripts::cmdFallToMap(Common::Array<byte> &params) { error("TODO"); }
-void Scripts::cmdDisplayMain(Common::Array<byte> &params) { error("TODO"); }
-void Scripts::cmdGoto(Common::Array<byte> &params) { error("TODO"); }
-
-void Scripts::cmdGotoRandom(Common::Array<byte> &params) { error("TODO"); }
-void Scripts::cmdCutsceneEndDarkside(Common::Array<byte> &params) { error("TODO"); }
-void Scripts::cmdCutsceneEdWorld(Common::Array<byte> &params) { error("TODO"); }
-void Scripts::cmdFlipWorld(Common::Array<byte> &params) { error("TODO"); }
+
+/**
+ * Exchange the positions of two objects in the maze
+ */
+void Scripts::cmdExchObj(Common::Array<byte> &params) {
+ 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<byte> &params) {
+ 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<byte> &params) {
+ 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<byte> &params) {
+ 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<byte> &params) {
+ _lineNum = params[_vm->getRandomNumber(1, params[0])] - 1;
+ _var4F = true;
+ cmdNoAction(params);
+}
+
+void Scripts::cmdCutsceneEndDarkside(Common::Array<byte> &params) {
+ 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<byte> &params) {
+ _vm->_saves->_wonWorld = true;
+ _vm->_party->_worldEnd = true;
+ doWorldEnd();
+}
+
+void Scripts::cmdFlipWorld(Common::Array<byte> &params) {
+ _vm->_map->_loadDarkSide = params[0] != 0;
+}
+
void Scripts::cmdPlayCD(Common::Array<byte> &params) { 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;