Skip to content

Commit

Permalink
XEEN: Implement further script opcodes
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Jan 24, 2015
1 parent 749372e commit c08e54f
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 20 deletions.
5 changes: 3 additions & 2 deletions engines/xeen/interface.cpp
Expand Up @@ -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:
Expand All @@ -106,7 +107,7 @@ void Interface::manageCharacters(bool soundPlayed) {
// 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);
Expand Down
9 changes: 5 additions & 4 deletions engines/xeen/map.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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");
Expand Down
3 changes: 2 additions & 1 deletion engines/xeen/map.h
Expand Up @@ -345,7 +345,7 @@ class Map {
MazeData _mazeData[9];
Common::String _mazeName;
SpriteResource _wallPicSprites;
int _townPortalSide;
bool _townPortalSide;
int _sidePictures;
int _sideObjects;
int _sideMonsters;
Expand Down Expand Up @@ -374,6 +374,7 @@ class Map {
int _currentTile;
int _currentSurfaceId;
bool _currentSteppedOn;
bool _loadDarkSide;
public:
Map(XeenEngine *vm);

Expand Down
2 changes: 2 additions & 0 deletions engines/xeen/party.cpp
Expand Up @@ -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) {
Expand Down
3 changes: 3 additions & 0 deletions engines/xeen/party.h
Expand Up @@ -221,6 +221,9 @@ class Party {
bool _isNight;
bool _stepped;
int _falling;
Common::Point _fallPosition;
int _fallMaze;
int _fallDamage;
DamageType _damageType;
public:
Party(XeenEngine *vm);
Expand Down
2 changes: 2 additions & 0 deletions engines/xeen/saves.cpp
Expand Up @@ -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() {
Expand Down
3 changes: 3 additions & 0 deletions engines/xeen/saves.h
Expand Up @@ -66,6 +66,9 @@ class SavesManager: public BaseCCArchive {
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);

Expand Down
85 changes: 76 additions & 9 deletions engines/xeen/scripts.cpp
Expand Up @@ -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() {
Expand Down
5 changes: 2 additions & 3 deletions engines/xeen/xeen.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
1 change: 0 additions & 1 deletion engines/xeen/xeen.h
Expand Up @@ -145,7 +145,6 @@ class XeenEngine : public Engine {
GameEvent _gameEvent;
Common::SeekableReadStream *_eventData;
Roster _roster;
int _loadDarkSide;
bool _dangerSenseAllowed;
bool _noDirectionSense;
bool _moveMonsters;
Expand Down

0 comments on commit c08e54f

Please sign in to comment.