From 971a70a2b3cea2ab6d0d77b130c8300ad5f05ca7 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 1 Jan 2015 19:15:08 -1000 Subject: XEEN: Implemented party and condition classes --- engines/xeen/items.cpp | 39 +++++++ engines/xeen/items.h | 45 ++++++++ engines/xeen/module.mk | 2 + engines/xeen/saves.cpp | 292 +++++++++++++++++++++++++++++++++++++++++++++++++ engines/xeen/saves.h | 190 ++++++++++++++++++++++++++++++++ engines/xeen/xeen.cpp | 23 +++- engines/xeen/xeen.h | 6 + 7 files changed, 596 insertions(+), 1 deletion(-) create mode 100644 engines/xeen/items.cpp create mode 100644 engines/xeen/items.h create mode 100644 engines/xeen/saves.cpp create mode 100644 engines/xeen/saves.h 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 _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 -- cgit v1.2.3