/*
* data.h
* Header file for data storage
* ____ _
* | _ \ ___ __ _| |_ __ ___ ___
* | |_) / _ \/ _` | | '_ ` _ \/ __|
* | _ < __/ (_| | | | | | | \__ \
* |_| \_\___|\__,_|_|_| |_| |_|___/
*
* Permission to use, modify and distribute is granted via the
* Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*
* Copyright (C) 2007-2009 Jason Mitchell, Randi Mitchell
* Contributions by Tim Callahan, Jonathan Hseu
* Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman
*
*/
#ifndef DATA_H_
#define DATA_H_
class cWeather;
class cSeason;
class CatRefInfo {
public:
CatRefInfo();
~CatRefInfo();
void clear();
void load(xmlNodePtr rootNode);
void loadSeasons(xmlNodePtr curNode);
void save(xmlNodePtr curNode) const;
bstring str() const;
void copyVars(const CatRefInfo* cri);
bool moveRoom(CatRef origin, CatRef target);
const cWeather* getWeather() const;
bstring getFishing() const;
int id; // 0 for unique rooms, a number for areas
bstring area; // "area" is a special area for the overland
bstring name; // display purposes only
bstring worldName; // for cmdTime
bstring yearsSince; // for printtime
bstring parent; // which catrefinfo to inherit limbo/recall from, misc by default
int yearOffset;
int limbo;
int recall;
int teleportWeight;
int teleportZone;
int trackZone;
std::map<Season,cSeason*> seasons; // the seaons hold the weather
protected:
bstring fishing;
};
class StartLoc {
public:
StartLoc();
void load(xmlNodePtr curNode);
void save(xmlNodePtr curNode) const;
bstring getName() const;
bstring getBindName() const;
bstring getRequiredName() const;
Location getBind() const;
Location getRequired() const;
CatRef getStartingGuide() const;
bool moveRoom(CatRef origin, CatRef target);
bool isDefault() const;
void setDefault();
protected:
bstring name;
bstring bindName;
bstring requiredName;
Location bind;
Location required;
CatRef startingGuide;
bool primary;
};
class PlayerTitle {
public:
PlayerTitle();
void load(xmlNodePtr rootNode);
bstring getTitle(bool sexMale) const;
protected:
bstring male;
bstring female;
};
// Describes the skill gained and who gets it
class SkillGain {
public:
SkillGain(xmlNodePtr rootNode);
~SkillGain();
int getGained();
bstring getName() const;
bool deityIsAllowed(int deity);
bool hasDeities();
protected:
void load(xmlNodePtr rootNode);
bstring skillName; // Name of the skill being gained
int gainLevel; // Gained level they start with
std::map<int, bool> deities;
};
// Class to describe what is gained at each level
class LevelGain {
public:
LevelGain(xmlNodePtr rootNode);
~LevelGain();
std::list<SkillGain*>::const_iterator getSkillBegin();
std::list<SkillGain*>::const_iterator getSkillEnd();
bstring getStatStr();
bstring getSaveStr();
int getStat();
int getSave();
int getHp();
int getMp();
bool hasSkills();
protected:
void load(xmlNodePtr rootNode); // Read in a level gain from the given node;
int stat; // The stat they get this level
int hp; // HP & MP gain
int mp;
int save; // Saving throw to go up
std::list<SkillGain*> skills; // Skills they gain at this level
public:
};
// Information about a player class
class PlayerClass {
public:
PlayerClass(xmlNodePtr rootNode);
~PlayerClass();
int getId() const;
bstring getName() const;
short getBaseHp();
short getBaseMp();
bool needsDeity();
short numProfs();
std::list<SkillGain*>::const_iterator getSkillBegin();
std::list<SkillGain*>::const_iterator getSkillEnd();
std::map<int, LevelGain*>::const_iterator getLevelBegin();
std::map<int, LevelGain*>::const_iterator getLevelEnd();
LevelGain* getLevelGain(int lvl);
bstring getTitle(int lvl, bool male, bool ignoreCustom=true) const;
bstring getUnarmedWeaponSkill() const;
std::map<int, PlayerTitle*> titles;
Dice damage;
protected:
void load(xmlNodePtr rootNode);
// Base Stats for the class
bstring name;
int id;
short baseHp;
short baseMp;
bool needDeity;
short numProf;
// Skills they start with
std::list<SkillGain*> baseSkills;
// Stuff gained on each additional level
std::map<int, LevelGain*> levels;
bstring unarmedWeaponSkill;
};
class RaceData {
protected:
int id;
bstring name;
bstring adjective;
bstring abbr;
bool infra;
bool bonus;
Size size;
int startAge;
bool playable;
bool isParentRace;
bool gendered;
int parentRace;
int stats[MAX_STAT];
int saves[MAX_SAVE];
short porphyriaResistance;
bool classes[CLASS_COUNT_MULT];
bool multiClerDeities[DEITY_COUNT];
bool clerDeities[DEITY_COUNT];
bool palDeities[DEITY_COUNT];
bool dkDeities[DEITY_COUNT];
// Skills they start with
std::list<SkillGain*> baseSkills;
public:
RaceData(xmlNodePtr rootNode);
int getId() const;
bstring getName(int tryToShorten=0) const;
bstring getAdjective() const;
bstring getAbbr() const;
int getParentRace() const;
void makeParent();
bool isParent() const;
bool isPlayable() const;
bool isGendered() const;
bool hasInfravision() const;
bool bonusStat() const;
Size getSize() const;
int getStartAge() const;
int getStatAdj(int stat) const;
int getSave(int save) const;
short getPorphyriaResistance() const;
bool allowedClass(int cls) const;
bool allowedDeity(int cls, int cls2, int dty) const;
bool allowedMultiClericDeity(int dty) const;
bool allowedClericDeity(int dty) const;
bool allowedPaladinDeity(int dty) const;
bool allowedDeathknightDeity(int dty) const;
std::list<SkillGain*>::const_iterator getSkillBegin() const;
std::list<SkillGain*>::const_iterator getSkillEnd() const;
std::map<Sex, short> baseHeight;
std::map<Sex, short> baseWeight;
std::map<Sex, Dice> varHeight;
std::map<Sex, Dice> varWeight;
std::list<bstring> effects;
};
class DeityData {
protected:
int id;
bstring name;
public:
DeityData(xmlNodePtr rootNode);
std::map<int, PlayerTitle*> titles;
int getId() const;
bstring getName() const;
bstring getTitle(int lvl, bool male, bool ignoreCustom=true) const;
};
class FishingItem {
public:
FishingItem();
void load(xmlNodePtr rootNode);
CatRef getFish() const;
bool isDayOnly() const;
bool isNightOnly() const;
short getWeight() const; // as in: probability
short getMinQuality() const;
short getMinSkill() const;
long getExp() const;
bool isMonster() const;
bool willAggro() const;
protected:
CatRef fish;
bool dayOnly;
bool nightOnly;
short weight; // as in: probability
short minQuality;
short minSkill;
long exp;
bool monster;
bool aggro;
};
class Fishing {
public:
Fishing();
void load(xmlNodePtr rootNode);
const FishingItem* getItem(short skill, short quality) const;
bool empty() const;
bstring id;
std::list<FishingItem> items;
};
#endif /*DATA_H_*/