aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/xeen/items.cpp39
-rw-r--r--engines/xeen/items.h45
-rw-r--r--engines/xeen/module.mk2
-rw-r--r--engines/xeen/saves.cpp292
-rw-r--r--engines/xeen/saves.h190
-rw-r--r--engines/xeen/xeen.cpp23
-rw-r--r--engines/xeen/xeen.h6
7 files changed, 596 insertions, 1 deletions
diff --git a/engines/xeen/items.cpp b/engines/xeen/items.cpp
new file mode 100644
index 0000000000..e22e8656d7
--- /dev/null
+++ b/engines/xeen/items.cpp
@@ -0,0 +1,39 @@
+/* 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 "xeen/items.h"
+
+namespace Xeen {
+
+XeenItem::XeenItem() {
+ _material = _name = _bonusFlags = 0;
+ _equipped = false;
+}
+
+void XeenItem::synchronize(Common::Serializer &s) {
+ s.syncAsByte(_material);
+ s.syncAsByte(_name);
+ s.syncAsByte(_bonusFlags);
+ s.syncAsByte(_equipped);
+}
+
+} // End of namespace Xeen
diff --git a/engines/xeen/items.h b/engines/xeen/items.h
new file mode 100644
index 0000000000..eba2354da5
--- /dev/null
+++ b/engines/xeen/items.h
@@ -0,0 +1,45 @@
+/* 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 XEEN_ITEMS_H
+#define XEEN_ITEMS_H
+
+#include "common/scummsys.h"
+#include "common/serializer.h"
+
+namespace Xeen {
+
+class XeenItem {
+public:
+ int _material;
+ int _name;
+ int _bonusFlags;
+ bool _equipped;
+public:
+ XeenItem();
+
+ void synchronize(Common::Serializer &s);
+};
+
+} // End of namespace Xeen
+
+#endif /* XEEN_ITEMS_H */
diff --git a/engines/xeen/module.mk b/engines/xeen/module.mk
index cdd8e549d4..2f5a092ca9 100644
--- a/engines/xeen/module.mk
+++ b/engines/xeen/module.mk
@@ -11,8 +11,10 @@ MODULE_OBJS := \
events.o \
files.o \
font.o \
+ items.o \
resdata.o \
resources.o \
+ saves.o \
screen.o \
sound.o \
sprites.o \
diff --git a/engines/xeen/saves.cpp b/engines/xeen/saves.cpp
new file mode 100644
index 0000000000..af74b58037
--- /dev/null
+++ b/engines/xeen/saves.cpp
@@ -0,0 +1,292 @@
+/* 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 "common/scummsys.h"
+#include "common/algorithm.h"
+#include "xeen/saves.h"
+
+namespace Xeen {
+
+AttributePair::AttributePair() {
+ _temporary = _permanent = 0;
+}
+
+void AttributePair::synchronize(Common::Serializer &s) {
+ s.syncAsByte(_permanent);
+ s.syncAsByte(_temporary);
+}
+
+/*------------------------------------------------------------------------*/
+
+Roster::Roster() {
+ _partyCount = 0;
+ _realPartyCount = 0;
+ Common::fill(&_partyMembers[0], &_partyMembers[8], 0);
+ _mazeDirection = DIR_NORTH;
+ _mazeId = _priorMazeId = 0;
+ _levitateActive = false;
+ _automapOn = false;
+ _wizardEyeActive = false;
+ _clairvoyanceActive = false;
+ _walkOnWaterActive = false;
+ _blessedActive = false;
+ _powerShieldActive = false;
+ _holyBonusActive = false;
+ _heroismActive = false;
+ _difficulty = ADVENTURER;
+ _cloudsEnd = false;
+ _darkSideEnd = false;
+ _worldEnd = false;
+ hour_maybe = 0;
+ _day = 0;
+ _year = 0;
+ _minutes = 0;
+ _food = 0;
+ _lightCount = 0;
+ _torchCount = 0;
+ _fireResistence = 0;
+ _electricityResistence = 0;
+ _coldResistence = 0;
+ _poisonResistence = 0;
+ _deathCount = 0;
+ _winCount = 0;
+ _lossCount = 0;
+ _gold = 0;
+ _gems = 0;
+ _bankGold = 0;
+ _bankGems = 0;
+ _totalTime = 0;
+ _rested = false;
+ Common::fill(&_gameFlags[0], &_gameFlags[256], false);
+ Common::fill(&_autoNotes[0], &_autoNotes[128], false);
+ Common::fill(&_quests[0], &_quests[64], false);
+ Common::fill(&_questItems[0], &_questItems[65], 0);
+ Common::fill(&_characterFlags[0][0], &_characterFlags[30][24], false);
+}
+
+void Roster::synchronize(Common::Serializer &s) {
+ byte dummy[30];
+ Common::fill(&dummy[0], &dummy[30], 0);
+
+ s.syncAsByte(_partyCount);
+ s.syncAsByte(_realPartyCount);
+ for (int i = 0; i < 8; ++i)
+ s.syncAsByte(_partyMembers[i]);
+ s.syncAsByte(_mazeDirection);
+ s.syncAsByte(_mazePosition.x);
+ s.syncAsByte(_mazePosition.y);
+ s.syncAsByte(_mazeId);
+
+ // Game configuration flags not used in this implementation
+ s.syncBytes(dummy, 3);
+
+ s.syncAsByte(_priorMazeId);
+ s.syncAsByte(_levitateActive);
+ s.syncAsByte(_automapOn);
+ s.syncAsByte(_wizardEyeActive);
+ s.syncAsByte(_clairvoyanceActive);
+ s.syncAsByte(_walkOnWaterActive);
+ s.syncAsByte(_blessedActive);
+ s.syncAsByte(_powerShieldActive);
+ s.syncAsByte(_holyBonusActive);
+ s.syncAsByte(_heroismActive);
+ s.syncAsByte(_difficulty);
+
+ for (int i = 0; ITEMS_COUNT; ++i)
+ _blacksmithWeapons[i].synchronize(s);
+ for (int i = 0; ITEMS_COUNT; ++i)
+ _blacksmithArmor[i].synchronize(s);
+ for (int i = 0; ITEMS_COUNT; ++i)
+ _blacksmithAccessories[i].synchronize(s);
+ for (int i = 0; ITEMS_COUNT; ++i)
+ _blacksmithMisc[i].synchronize(s);
+
+ s.syncAsUint16LE(_cloudsEnd);
+ s.syncAsUint16LE(_darkSideEnd);
+ s.syncAsUint16LE(_worldEnd);
+ s.syncAsUint16LE(hour_maybe);
+ s.syncAsUint16LE(_day);
+ s.syncAsUint16LE(_year);
+ s.syncAsUint16LE(_minutes);
+ s.syncAsUint16LE(_food);
+ s.syncAsUint16LE(_lightCount);
+ s.syncAsUint16LE(_torchCount);
+ s.syncAsUint16LE(_fireResistence);
+ s.syncAsUint16LE(_electricityResistence);
+ s.syncAsUint16LE(_coldResistence);
+ s.syncAsUint16LE(_poisonResistence);
+ s.syncAsUint16LE(_deathCount);
+ s.syncAsUint16LE(_winCount);
+ s.syncAsUint16LE(_lossCount);
+ s.syncAsUint32LE(_gold);
+ s.syncAsUint32LE(_gems);
+ s.syncAsUint32LE(_bankGold);
+ s.syncAsUint32LE(_bankGems);
+ s.syncAsUint32LE(_totalTime);
+ s.syncAsByte(_rested);
+ SavesManager::syncBitFlags(s, &_gameFlags[0], &_gameFlags[512]);
+ SavesManager::syncBitFlags(s, &_autoNotes[0], &_autoNotes[128]);
+ SavesManager::syncBitFlags(s, &_quests[0], &_quests[64]);
+
+ for (int i = 0; i < 85; ++i)
+ s.syncAsByte(_questItems[i]);
+
+ for (int i = 0; ITEMS_COUNT; ++i)
+ _blacksmithWeapons2[i].synchronize(s);
+ for (int i = 0; ITEMS_COUNT; ++i)
+ _blacksmithArmor2[i].synchronize(s);
+ for (int i = 0; ITEMS_COUNT; ++i)
+ _blacksmithAccessories2[i].synchronize(s);
+ for (int i = 0; ITEMS_COUNT; ++i)
+ _blacksmithMisc2[i].synchronize(s);
+
+ SavesManager::syncBitFlags(s, &_characterFlags[0][0], &_characterFlags[30][24]);
+ s.syncBytes(&dummy[0], 30);
+}
+
+/*------------------------------------------------------------------------*/
+
+PlayerStruct::PlayerStruct() {
+ _sex = MALE;
+ _race = HUMAN;
+ _xeenSide = 0;
+ _class = KNIGHT;
+ _ACTemp = 0;
+ _dbDay = 0;
+ _tempAge = 0;
+ Common::fill(&_skills[0], &_skills[18], 0);
+ Common::fill(&_awards[0], &_awards[64], false);
+ Common::fill(&_spells[9], &_spells[40], false);
+ _lloydMap = 0;
+ _hasSpells = false;
+ _currentSpell = 0;
+ _quickOption = 0;
+ _lloydSide = 0;
+ Common::fill(&_conditions[0], &_conditions[16], 0);
+ _townUnknown = 0;
+ _unknown2 = 0;
+ _currentHp = 0;
+ _currentSp = 0;
+ _ybDay = 0;
+ _experience = 0;
+ _currentAdventuringSpell = 0;
+ _currentCombatSpell = 0;
+}
+
+void PlayerStruct::synchronize(Common::Serializer &s) {
+ char name[16];
+ Common::fill(&name[0], &name[16], '\0');
+ strncpy(name, _name.c_str(), 16);
+ s.syncBytes((byte *)name, 16);
+
+ if (s.isLoading())
+ _name = Common::String(name);
+
+ s.syncAsByte(_sex);
+ s.syncAsByte(_race);
+ s.syncAsByte(_xeenSide);
+ s.syncAsByte(_class);
+
+ _might.synchronize(s);
+ _intellect.synchronize(s);
+ _personality.synchronize(s);
+ _endurance.synchronize(s);
+ _speed.synchronize(s);
+ _accuracy.synchronize(s);
+ _luck.synchronize(s);
+ s.syncAsByte(_ACTemp);
+ _level.synchronize(s);
+ s.syncAsByte(_dbDay);
+ s.syncAsByte(_tempAge);
+
+ for (int i = 0; i < 18; ++i)
+ s.syncAsByte(_skills[i]);
+ SavesManager::syncBitFlags(s, &_awards[0], &_awards[64]);
+ SavesManager::syncBitFlags(s, &_spells[0], &_spells[40]);
+
+ s.syncAsByte(_lloydMap);
+ s.syncAsByte(_lloydPosition.x);
+ s.syncAsByte(_lloydPosition.y);
+ s.syncAsByte(_hasSpells);
+ s.syncAsByte(_currentSpell);
+ s.syncAsByte(_quickOption);
+
+ for (int i = 0; i < 9; ++i)
+ _weapons[i].synchronize(s);
+ for (int i = 0; i < 9; ++i)
+ _armor[i].synchronize(s);
+ for (int i = 0; i < 9; ++i)
+ _accessories[i].synchronize(s);
+ for (int i = 0; i < 9; ++i)
+ _misc[i].synchronize(s);
+
+ s.syncAsByte(_lloydSide);
+ _fireResistence.synchronize(s);
+ _coldResistence.synchronize(s);
+ _electricityResistence.synchronize(s);
+ _poisonResistence.synchronize(s);
+ _energyResistence.synchronize(s);
+ _magicResistence.synchronize(s);
+
+ for (int i = 0; i < 16; ++i)
+ s.syncAsByte(_conditions[i]);
+
+ s.syncAsUint16LE(_townUnknown);
+ s.syncAsByte(_unknown2);
+ s.syncAsUint16LE(_currentHp);
+ s.syncAsUint16LE(_currentSp);
+ s.syncAsUint16LE(_ybDay);
+ s.syncAsUint32LE(_experience);
+ s.syncAsByte(_currentAdventuringSpell);
+ s.syncAsByte(_currentCombatSpell);
+}
+
+/*------------------------------------------------------------------------*/
+
+/**
+ * Synchronizes a boolean array as a bitfield set
+ */
+void SavesManager::syncBitFlags(Common::Serializer &s, bool *startP, bool *endP) {
+ byte data = 0;
+
+ int bitCounter = 0;
+ for (bool *p = startP; p <= endP; ++p, ++bitCounter) {
+ if (bitCounter != 0 && (bitCounter % 8) == 0) {
+ s.syncAsByte(data);
+ if (p == endP)
+ break;
+
+ if (s.isSaving())
+ data = 0;
+ }
+
+ if (s.isLoading())
+ *p = (data >> bitCounter) != 0;
+ else if (*p)
+ data |= 1 << bitCounter;
+ }
+}
+
+/*------------------------------------------------------------------------*/
+
+
+} // End of namespace Xeen
diff --git a/engines/xeen/saves.h b/engines/xeen/saves.h
new file mode 100644
index 0000000000..ef12efde7a
--- /dev/null
+++ b/engines/xeen/saves.h
@@ -0,0 +1,190 @@
+/* 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 XEEN_SAVES_H
+#define XEEN_SAVES_H
+
+#include "common/scummsys.h"
+#include "common/rect.h"
+#include "common/savefile.h"
+#include "xeen/items.h"
+
+namespace Xeen {
+
+enum Direction { DIR_NORTH = 0, DIR_EAST = 1, DIR_SOUTH = 2, DIR_WEST = 3 };
+
+enum Difficulty { ADVENTURER = 0, WARRIOR = 1 };
+
+enum Sex { MALE = 0, FEMALE = 1, YES_PLEASE = 2 };
+
+enum Race { HUMAN = 0, ELF = 1, DWARF = 2, GNOME = 3, HALF_ORC = 4 };
+
+enum CharacterClass { KNIGHT = 0, PALADIN = 1, ARCHER = 2, CLERIC = 3,
+ SORCERER = 4, ROBBER = 5, NINJA = 6, BARBARIAN = 7, DRUID = 8, RANGER = 9
+};
+
+enum Skill { THIEVERY = 0, ARMS_MASTER = 1, ASTROLOGER = 2, BODYBUILDER = 3,
+ CARTOGRAPHER = 4, CRUSADER = 5, DIRECTION_SENSE = 6, LINGUIST = 7,
+ MERCHANT = 8, MOUNTAINEER = 9, NAVIGATOR = 10, PATHFINDER = 11,
+ PRAYER_MASTER = 12, PRESTIDIGITATION = 13, SWIMMING = 14, TRACKING = 15,
+ SPOT_DOORS = 16, DANGER_SENSE = 17
+};
+
+enum Condition { CURSED = 0, HEART_BROKEN = 1, WEAK = 2, POISONED = 3,
+ DISEASED = 4, INSANE = 5, IN_LOVE = 6, DRUNK = 7, SLEEP = 8,
+ DEPRESSED = 9, CONFUSED = 10, PARALYZED = 11
+};
+
+#define ITEMS_COUNT 36
+
+class Roster {
+public:
+ int _partyCount;
+ int _realPartyCount;
+ int _partyMembers[8];
+ Direction _mazeDirection;
+ Common::Point _mazePosition;
+ int _mazeId;
+ int _priorMazeId;
+ bool _levitateActive;
+ bool _automapOn;
+ bool _wizardEyeActive;
+ bool _clairvoyanceActive;
+ bool _walkOnWaterActive;
+ bool _blessedActive;
+ bool _powerShieldActive;
+ bool _holyBonusActive;
+ bool _heroismActive;
+ Difficulty _difficulty;
+ XeenItem _blacksmithWeapons[ITEMS_COUNT];
+ XeenItem _blacksmithArmor[ITEMS_COUNT];
+ XeenItem _blacksmithAccessories[ITEMS_COUNT];
+ XeenItem _blacksmithMisc[ITEMS_COUNT];
+ bool _cloudsEnd;
+ bool _darkSideEnd;
+ bool _worldEnd;
+ int hour_maybe;
+ int _day;
+ int _year;
+ int _minutes;
+ int _food;
+ int _lightCount;
+ int _torchCount;
+ int _fireResistence;
+ int _electricityResistence;
+ int _coldResistence;
+ int _poisonResistence;
+ int _deathCount;
+ int _winCount;
+ int _lossCount;
+ int _gold;
+ int _gems;
+ int _bankGold;
+ int _bankGems;
+ int _totalTime;
+ bool _rested;
+ bool _gameFlags[256];
+ bool _autoNotes[128];
+ bool _quests[64];
+ int _questItems[85];
+ XeenItem _blacksmithWeapons2[ITEMS_COUNT];
+ XeenItem _blacksmithArmor2[ITEMS_COUNT];
+ XeenItem _blacksmithAccessories2[ITEMS_COUNT];
+ XeenItem _blacksmithMisc2[ITEMS_COUNT];
+ bool _characterFlags[30][24];
+public:
+ Roster();
+
+ void synchronize(Common::Serializer &s);
+};
+
+class AttributePair {
+public:
+ int _permanent;
+ int _temporary;
+public:
+ AttributePair();
+ void synchronize(Common::Serializer &s);
+};
+
+class PlayerStruct {
+public:
+ Common::String _name;
+ Sex _sex;
+ Race _race;
+ int _xeenSide;
+ CharacterClass _class;
+ AttributePair _might;
+ AttributePair _intellect;
+ AttributePair _personality;
+ AttributePair _endurance;
+ AttributePair _speed;
+ AttributePair _accuracy;
+ AttributePair _luck;
+ int _ACTemp;
+ AttributePair _level;
+ int _dbDay;
+ int _tempAge;
+ int _skills[18];
+ bool _awards[64];
+ bool _spells[40];
+ int _lloydMap;
+ Common::Point _lloydPosition;
+ bool _hasSpells;
+ int _currentSpell;
+ int _quickOption;
+ XeenItem _weapons[9];
+ XeenItem _armor[9];
+ XeenItem _accessories[9];
+ XeenItem _misc[9];
+ int _lloydSide;
+ AttributePair _fireResistence;
+ AttributePair _coldResistence;
+ AttributePair _electricityResistence;
+ AttributePair _poisonResistence;
+ AttributePair _energyResistence;
+ AttributePair _magicResistence;
+ int _conditions[16];
+ int _townUnknown;
+ int _unknown2;
+ int _currentHp;
+ int _currentSp;
+ int _ybDay;
+ uint32 _experience;
+ int _currentAdventuringSpell;
+ int _currentCombatSpell;
+public:
+ PlayerStruct();
+ void synchronize(Common::Serializer &s);
+};
+
+class SavesManager {
+public:
+ Roster _roster;
+ Common::Array<PlayerStruct> _conditions;
+public:
+ static void syncBitFlags(Common::Serializer &s, bool *startP, bool *endP);
+};
+
+} // End of namespace Xeen
+
+#endif /* XEEN_SAVES_H */
diff --git a/engines/xeen/xeen.cpp b/engines/xeen/xeen.cpp
index b61d6a6cc2..35b4188c06 100644
--- a/engines/xeen/xeen.cpp
+++ b/engines/xeen/xeen.cpp
@@ -82,6 +82,14 @@ void XeenEngine::initialize() {
Common::Error XeenEngine::run() {
initialize();
+ showIntro();
+ if (shouldQuit())
+ return Common::kNoError;
+
+ showMainMenu();
+ if (shouldQuit())
+ return Common::kNoError;
+
playGame();
return Common::kNoError;
@@ -220,8 +228,21 @@ void XeenEngine::writeSavegameHeader(Common::OutSaveFile *out, XeenSavegameHeade
// out->writeUint32LE(_events->getFrameCounter());
}
+void XeenEngine::showIntro() {
+
+}
+
+void XeenEngine::showMainMenu() {
+ //OptionsMenu::show(this);
+}
+
void XeenEngine::playGame() {
- OptionsMenu::show(this);
+
+}
+
+void XeenEngine::drawUI() {
+ SpriteResource sprites1("global.icn"), borderSprites("border.icn");
+
}
} // End of namespace Xeen
diff --git a/engines/xeen/xeen.h b/engines/xeen/xeen.h
index 1b99a85a4b..2049888a9b 100644
--- a/engines/xeen/xeen.h
+++ b/engines/xeen/xeen.h
@@ -88,6 +88,12 @@ private:
const XeenGameDescription *_gameDescription;
Common::RandomSource _randomSource;
int _loadSaveSlot;
+
+ void showIntro();
+
+ void showMainMenu();
+
+ void drawUI();
protected:
/**
* Play the game