mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-24 18:56:33 +00:00
317 lines
7.0 KiB
C++
317 lines
7.0 KiB
C++
/* 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_PARTY_H
|
|
#define XEEN_PARTY_H
|
|
|
|
#include "common/scummsys.h"
|
|
#include "common/array.h"
|
|
#include "common/rect.h"
|
|
#include "common/serializer.h"
|
|
#include "xeen/character.h"
|
|
#include "xeen/combat.h"
|
|
#include "xeen/dialogs/dialogs_message.h"
|
|
|
|
namespace Xeen {
|
|
|
|
enum Direction {
|
|
DIR_NORTH = 0, DIR_EAST = 1, DIR_SOUTH = 2, DIR_WEST = 3, DIR_ALL = 4
|
|
};
|
|
|
|
enum Difficulty { ADVENTURER = 0, WARRIOR = 1 };
|
|
|
|
enum ConsumableType {
|
|
CONS_GOLD = 0, CONS_GEMS = 1, CONS_FOOD = 2, CONS_CONDITION = 3
|
|
};
|
|
|
|
enum PartyBank {
|
|
WHERE_PARTY = 0, WHERE_BANK = 1
|
|
};
|
|
|
|
#define TOTAL_CHARACTERS 30
|
|
#define XEEN_TOTAL_CHARACTERS 24
|
|
#define MAX_ACTIVE_PARTY 6
|
|
#define MAX_PARTY_COUNT 8
|
|
#define TOTAL_STATS 7
|
|
#define TOTAL_QUEST_ITEMS 85
|
|
#define TOTAL_QUEST_ITEMS_SWORDS 51
|
|
#define TOTAL_QUEST_FLAGS 56
|
|
#define MAX_TREASURE_ITEMS 10
|
|
|
|
class Roster: public Common::Array<Character> {
|
|
public:
|
|
SpriteResource _charFaces[TOTAL_CHARACTERS];
|
|
public:
|
|
Roster();
|
|
|
|
void synchronize(Common::Serializer &s);
|
|
};
|
|
|
|
class Treasure {
|
|
public:
|
|
XeenItem _misc[MAX_TREASURE_ITEMS];
|
|
XeenItem _accessories[MAX_TREASURE_ITEMS];
|
|
XeenItem _armor[MAX_TREASURE_ITEMS];
|
|
XeenItem _weapons[MAX_TREASURE_ITEMS];
|
|
XeenItem *_categories[4];
|
|
bool _hasItems;
|
|
int _gems, _gold;
|
|
public:
|
|
Treasure();
|
|
|
|
/**
|
|
* Returns a particular category's array
|
|
*/
|
|
XeenItem *operator[](int category) { return _categories[category]; }
|
|
|
|
/**
|
|
* Clears the treasure list
|
|
*/
|
|
void clear();
|
|
|
|
/**
|
|
* Completely reset the treasure data
|
|
*/
|
|
void reset();
|
|
};
|
|
|
|
/**
|
|
* Each side of Xeen supports 4 blacksmith inventories of up to 9 items each
|
|
*/
|
|
typedef XeenItem BlacksmithItems[2][4][INV_ITEMS_TOTAL];
|
|
|
|
class BlacksmithWares {
|
|
private:
|
|
/**
|
|
* Returns the slot containing the wares for the blacksmith of the currently active map
|
|
*/
|
|
uint getSlotIndex() const;
|
|
|
|
public:
|
|
BlacksmithItems _weapons;
|
|
BlacksmithItems _armor;
|
|
BlacksmithItems _accessories;
|
|
BlacksmithItems _misc;
|
|
public:
|
|
/**
|
|
* Constructor
|
|
*/
|
|
BlacksmithWares() { clear(); }
|
|
|
|
/**
|
|
* Clear all current blacksmith wares
|
|
*/
|
|
void clear();
|
|
|
|
/**
|
|
* Generates a fresh set of blacksmith inventories
|
|
*/
|
|
void regenerate();
|
|
|
|
/**
|
|
* Gets the items for a particular item category
|
|
*/
|
|
BlacksmithItems &operator[](ItemCategory category);
|
|
|
|
/**
|
|
* Loads a passed temporary character with the item set the given blacksmith has available,
|
|
* so the player can "view" the wares as if it were a standard character's inventory
|
|
*/
|
|
void blackData2CharData(Character &c);
|
|
|
|
/**
|
|
* Saves the inventory from the passed temporary character back into the blacksmith storage,
|
|
* so changes in blacksmith inventories remain persistent
|
|
*/
|
|
void charData2BlackData(Character &c);
|
|
|
|
/**
|
|
* Synchronizes data for the blacksmith wares
|
|
*/
|
|
void synchronize(Common::Serializer &s, int ccNum);
|
|
};
|
|
|
|
class Party {
|
|
friend class Character;
|
|
friend class InventoryItems;
|
|
private:
|
|
static XeenEngine *_vm;
|
|
Character _itemsCharacter;
|
|
|
|
/**
|
|
* Give a treasure item to the given character's inventory
|
|
*/
|
|
void giveTreasureToCharacter(Character &c, ItemCategory category, int itemIndex);
|
|
|
|
/**
|
|
* Enter an amount of how much
|
|
*/
|
|
int howMuch();
|
|
|
|
/**
|
|
* Subtracts an amount from the party time
|
|
*/
|
|
void subPartyTime(int time);
|
|
|
|
void resetYearlyBits();
|
|
|
|
/**
|
|
* Applies interest to any gold and gems in the player's bank account
|
|
*/
|
|
void giveBankInterest();
|
|
public:
|
|
// Dynamic data that's saved
|
|
Direction _mazeDirection;
|
|
Common::Point _mazePosition;
|
|
int _mazeId;
|
|
int _priorMazeId;
|
|
int _levitateCount;
|
|
bool _automapOn;
|
|
bool _wizardEyeActive;
|
|
bool _clairvoyanceActive;
|
|
bool _walkOnWaterActive;
|
|
int _blessed;
|
|
int _powerShield;
|
|
int _holyBonus;
|
|
int _heroism;
|
|
Difficulty _difficulty;
|
|
BlacksmithWares _blacksmithWares;
|
|
bool _cloudsCompleted;
|
|
bool _darkSideCompleted;
|
|
bool _worldCompleted;
|
|
int _ctr24; // Unused counter
|
|
int _day;
|
|
uint _year;
|
|
int _minutes;
|
|
uint _food;
|
|
int _lightCount;
|
|
int _torchCount;
|
|
int _fireResistence;
|
|
int _electricityResistence;
|
|
int _coldResistence;
|
|
int _poisonResistence;
|
|
int _deathCount;
|
|
int _winCount;
|
|
int _lossCount;
|
|
uint _gold;
|
|
uint _gems;
|
|
uint _bankGold;
|
|
uint _bankGems;
|
|
int _totalTime;
|
|
bool _rested;
|
|
bool _gameFlags[2][256];
|
|
bool _worldFlags[128];
|
|
bool _questFlags[60];
|
|
int _questItems[TOTAL_QUEST_ITEMS];
|
|
bool _characterFlags[30][24];
|
|
public:
|
|
// Other party related runtime data
|
|
Roster _roster;
|
|
CharacterArray _activeParty;
|
|
bool _newDay;
|
|
bool _isNight;
|
|
bool _stepped;
|
|
Common::Point _fallPosition;
|
|
int _fallMaze;
|
|
int _fallDamage;
|
|
bool _dead;
|
|
Treasure _treasure;
|
|
Treasure _savedTreasure;
|
|
public:
|
|
Party(XeenEngine *vm);
|
|
|
|
/**
|
|
* Synchronizes data for the party
|
|
*/
|
|
void synchronize(Common::Serializer &s);
|
|
|
|
void loadActiveParty();
|
|
|
|
bool checkSkill(Skill skillId);
|
|
|
|
bool isInParty(int charId);
|
|
|
|
/**
|
|
* Copy the currently active party characters' data back to the roster
|
|
*/
|
|
void copyPartyToRoster();
|
|
|
|
/**
|
|
* Adds time to the party's playtime, taking into account the effect of any
|
|
* stat modifier changes
|
|
*/
|
|
void changeTime(int numMinutes);
|
|
|
|
void addTime(int numMinutes);
|
|
|
|
void resetTemps();
|
|
|
|
void handleLight();
|
|
|
|
int subtract(ConsumableType consumableId, uint amount, PartyBank whereId, MessageWaitType wait = WT_FREEZE_WAIT);
|
|
|
|
void notEnough(ConsumableType consumableId, PartyBank whereId, bool mode, MessageWaitType wait);
|
|
|
|
void checkPartyDead();
|
|
|
|
/**
|
|
* Move party position to the run destination on the current map
|
|
*/
|
|
void moveToRunLocation();
|
|
|
|
/**
|
|
* Give treasure to the party
|
|
*/
|
|
void giveTreasure();
|
|
|
|
/**
|
|
* Returns true if all the packs for all the characters are full
|
|
*/
|
|
bool arePacksFull() const;
|
|
|
|
bool canShoot() const;
|
|
|
|
/**
|
|
* Gives and/or takes amounts from various character and/or party properties
|
|
*/
|
|
bool giveTake(int takeMode, uint takeVal, int giveMode, uint giveVal, int charIdx);
|
|
|
|
/**
|
|
* Gives up to three different item/amounts to various character and/or party properties
|
|
*/
|
|
bool giveExt(int mode1, uint val1, int mode2, uint val2, int mode3, uint val3, int charId);
|
|
|
|
/**
|
|
* Resets the inventory that Blacksmiths sell
|
|
*/
|
|
void resetBlacksmithWares();
|
|
|
|
/**
|
|
* Returns the current total score
|
|
*/
|
|
uint getScore();
|
|
};
|
|
|
|
} // End of namespace Xeen
|
|
|
|
#endif /* XEEN_PARTY_H */
|