/* * structs.h * Main data structure and type definitions * ____ _ * | _ \ ___ __ _| |_ __ ___ ___ * | |_) / _ \/ _` | | '_ ` _ \/ __| * | _ < __/ (_| | | | | | | \__ \ * |_| \_\___|\__,_|_|_| |_| |_|___/ * * 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 MSTRUCT_H #define MSTRUCT_H class Object; class Creature; class Player; class Monster; class Exit; class BaseRoom; class Room; class Faction; class Socket; class MapMarker; class EffectInfo; class AlchemyEffect; enum AlcoholState { ALCOHOL_SOBER = 0, ALCOHOL_TIPSY = 1, ALCOHOL_DRUNK = 2, ALCOHOL_INEBRIATED = 3 }; enum Sex { SEX_NONE = 0, SEX_FEMALE = 1, SEX_MALE = 2 }; enum Coin { MIN_COINS = 0, COPPER = 0, SILVER = 1, GOLD = 2, PLATINUM = 3, ALANTHIUM = 4, MAX_COINS = 4 }; enum EffectParentType { EFFECT_NO_PARENT, EFFECT_CREATURE, EFFECT_ROOM, EFFECT_EXIT }; // this class holds effect information and makes effects portable // across multiple objects class Effects { public: void load(xmlNodePtr rootNode, Creature* cParent=0, BaseRoom* rParent=0, Exit* xParent=0); void save(xmlNodePtr rootNode, const char* name) const; EffectInfo* getEffect(const bstring& effect) const; bool addEffect(const bstring& effect, void* applier, ApplyFrom aFrom, bool show, Creature* cParent=0, BaseRoom* rParent=0, Exit* xParent=0, const Creature* onwer=0); bool addEffect(EffectInfo* newEffect, bool show, Creature* parent=0, BaseRoom* rParent=0, Exit* xParent=0); bool addEffect(const bstring& effect, long duration, int strength, bool show, Creature* cParent=0, BaseRoom* rParent=0, Exit* xParent=0, const Creature* onwer=0); bool removeEffect(const bstring& effect, bool show, bool remPerm, Creature* cParent=0, BaseRoom* rParent=0, Exit* xParent=0); bool removeEffect(EffectInfo* toDel, bool show, Creature* cParent=0, BaseRoom* rParent=0, Exit* xParent=0); bool removeOppositeEffect(const EffectInfo *effect, Creature* cParent=0, BaseRoom* rParent=0, Exit* xParent=0); void removeAll(); void removeOwner(const Creature* owner); void copy(const Effects* source, Creature* cParent=0); bool hasPoison() const; bool removePoison(); bool hasDisease() const; bool removeDisease(); bool removeCurse(); bstring getEffectsString(const Creature* viewer); bstring getEffectsList() const; void pulse(time_t t, BaseRoom* rParent=0, Exit* xParent=0); static EffectParentType getParentType(Creature* cParent=0, BaseRoom* rParent=0, Exit *xParent=0); std::list<EffectInfo*> list; }; class Money { public: Money(); void load(xmlNodePtr curNode); void save(const char* name, xmlNodePtr curNode) const; bool isZero() const; void zero(); bool operator==(const Money& mn) const; bool operator!=(const Money& mn) const; unsigned long operator[](Coin c) const; unsigned long get(Coin c) const; void set(unsigned long n, Coin c); void add(unsigned long n, Coin c); void sub(unsigned long n, Coin c); void set(Money mn); void add(Money mn); void sub(Money mn); bstring str() const; static bstring coinNames(Coin c); protected: unsigned long m[MAX_COINS+1]; }; class Dice { public: Dice(); Dice(unsigned short n, unsigned short s, short p); bool operator==(const Dice& d) const; bool operator!=(const Dice& d) const; void clear(); void load(xmlNodePtr curNode); void save(xmlNodePtr curNode, const char* name) const; int roll() const; int average() const; int low() const; int high() const; bstring str() const; unsigned short getNumber() const; unsigned short getSides() const; short getPlus() const; void setNumber(unsigned short n); void setSides(unsigned short s); void setPlus(short p); protected: unsigned short number; unsigned short sides; short plus; }; class MudFlag { public: MudFlag(); int id; bstring name; bstring desc; }; class CatRef { public: CatRef(); void setDefault(const Creature* target); void clear(); xmlNodePtr save(xmlNodePtr curNode, const char* childName, bool saveNonZero, int pos=0) const; void load(xmlNodePtr curNode); CatRef& operator=(const CatRef& cr); bool operator==(const CatRef& cr) const; bool operator!=(const CatRef& cr) const; bstring rstr() const; bstring str(bstring current = "", char color = '\0') const; void setArea(bstring c); bool isArea(bstring c) const; bstring area; short id; }; class Carry { public: Carry(); xmlNodePtr save(xmlNodePtr curNode, const char* childName, bool saveNonZero, int pos=0) const; void load(xmlNodePtr curNode); bstring str(bstring current = "", char color = '\0') const; Carry& operator=(const Carry& cry); bool operator==(const Carry& cry) const; bool operator!=(const Carry& cry) const; CatRef info; int numTrade; }; class Range { public: Range(); void load(xmlNodePtr curNode); xmlNodePtr save(xmlNodePtr curNode, const char* childName, int pos=0) const; Range& operator=(const Range& r); bool operator==(const Range& r) const; bool operator!=(const Range& r) const; bool belongs(CatRef cr) const; bstring str() const; bool isArea(bstring c) const; CatRef low; short high; }; // Object list tags typedef struct obj_tag { public: obj_tag() { next_tag = 0; obj = 0; }; struct obj_tag *next_tag; struct Object *obj; } otag; // Creature list tags typedef struct crt_tag { public: crt_tag() { next_tag = 0; crt = 0; }; struct crt_tag *next_tag; Creature* crt; } ctag; // Room list tags typedef struct rom_tag { public: rom_tag() { next_tag = 0; rom = 0; }; struct rom_tag *next_tag; Room* rom; } rtag; // Exit list tags typedef struct ext_tag { public: ext_tag() { next_tag = 0; ext = 0; }; struct ext_tag *next_tag; Exit* ext; } xtag; // Enemy list tags typedef struct enm_tag { public: enm_tag() { next_tag = 0; enemy[0] = 0; damage = 0; owner[0] = 0; }; struct enm_tag *next_tag; char enemy[80]; int damage; char owner[80]; } etag; typedef struct vstat { public: vstat() { num[0] = num[1] = num[2] = num[3] = num[4] = 0; hp = mp = pp = pp = 0; level = cls = cls2 = race = 0; }; int num[5]; int hp; int mp; int pp; int rp; char level; char cls; char cls2; char race; } vstat; // Talk list tags typedef struct tlk_tag { public: tlk_tag() { next_tag = 0; key = 0; response = 0; type = 0; action = 0; target = 0; on_cmd = 0; if_cmd = 0; test_for = 0; do_act = 0; success = 0; if_goto_cmd = 0; not_goto_cmd = 0; goto_cmd = 0; arg1 = arg2 = 0; }; struct tlk_tag *next_tag; char *key; char *response; char type; char *action; char *target; char on_cmd; // action functions char if_cmd; // if # command succesful char test_for; // test for condition in Room char do_act; // do action char success; // command was succesful char if_goto_cmd; // used to jump to new cmd point char not_goto_cmd; // jump to cmd if not success char goto_cmd; // unconditional goto cmd int arg1; int arg2; } ttag; typedef struct tic { public: tic() {amountCur = amountMax = amountTmp = 0; interval = intervalMax = intervalTmp = 0; }; char amountCur; char amountMax; char amountTmp; long interval; long intervalMax; long intervalTmp; } tic; typedef struct spellTimer { public: spellTimer() { interval = ltime = misc = misc2 = castLevel = 0; }; long interval; long ltime; short misc; short misc2; char castLevel; } spellTimer; // Daily-use operation struct typedef struct daily { public: daily() { max = cur = ltime = 0; }; short max; short cur; long ltime; } daily; // Timed operation struct typedef struct lasttime { public: lasttime() { interval = ltime = misc = 0; }; long interval; long ltime; short misc; } lasttime; typedef struct crlasttime { public: crlasttime() { interval = ltime = 0; }; long interval; long ltime; CatRef cr; } crlasttime; typedef struct lockout { public: lockout() { address[0] = password[0] = userid[0] = 0; }; char address[80]; char password[20]; char userid[9]; } lockout; // we need this forward declaration so command list pointers can // be stored inside the cmd class class cmdReturn; #define CMD_NOT_FOUND -1 #define CMD_NOT_UNIQUE -2 #define CMD_NOT_AUTH -3 #define MAX_TOKEN_SIZE 50 class Command; typedef struct cmd { public: cmd() { ret = num = 0; memset(fullstr, 0, sizeof(fullstr)); memset(str, 0, sizeof(str)); memset(val, 0, sizeof(val)); myCommand=0; }; int num; char fullstr[256]; char str[COMMANDMAX][MAX_TOKEN_SIZE]; long val[COMMANDMAX]; int ret; Command *myCommand; } cmd; typedef struct osp_t { int splno; Realm realm; int mp; Dice damage; char bonus_type; bool drain; } osp_t; typedef struct osong_t { int songno; Dice damage; } osong_t; typedef struct saves { public: saves() { chance = gained = misc = 0; }; short chance; // Percent chance to save. short gained; short misc; } saves; class AreaRoom; class BaseRoom; class Anchor { public: Anchor(); Anchor(bstring a, const Player* player); ~Anchor(); void reset(); Anchor& operator=(const Anchor& a); void load(xmlNodePtr curNode); void save(xmlNodePtr curNode) const; void bind(const Player* player); void bind(const Room* uRoom); void bind(const AreaRoom* aRoom); void setRoom(CatRef r); bool is(const BaseRoom* room) const; bool is(const Player* player) const; bool is(const Room* uRoom) const; bool is(const AreaRoom* aRoom) const; bstring getAlias() const; bstring getRoomName() const; CatRef getRoom() const; const MapMarker* getMapMarker() const; protected: bstring alias; bstring roomName; CatRef room; MapMarker *mapmarker; }; // These are special defines to reuse creature structure while still // making the code readable. // moved here to accomodate global use throughout mordor // General queue tag data struct typedef struct queue_tag { public: queue_tag() { next = prev = 0; }; bstring str; struct queue_tag *next; struct queue_tag *prev; } qtag; // Sparse pointer array for rooms typedef struct rsparse { public: rsparse() { rom = 0; q_rom = 0; }; Room *rom; qtag *q_rom; } rsparse; // Sparse pointer array for creatures typedef struct msparse { public: msparse() { mob = 0; q_mob = 0; }; Monster *mob; qtag *q_mob; } msparse; // Sparse pointer array for objects typedef struct osparse { public: osparse() {obj = 0; q_obj = 0; }; Object *obj; qtag *q_obj; } osparse; typedef struct tagPlayer { Player* ply; Socket* sock; // iobuf *io; // extra *extr; } plystruct; typedef struct { short hpstart; short mpstart; short hp; short mp; short ndice; short sdice; short pdice; } class_stats_struct; typedef struct { short poison; // Poison, disease, noxious clouds, etc... short death; // Deadly traps, massive damage, energy drain attacks, massive tramples, disintegrate spells, fatally wounds from touch, etc.. short breath; // Exploding monsters, firey dragon breath, exploding traps... short mental; // Charm spells, hold-person spells, confusion spells, teleport traps, mp drain traps... short spells; // Offensive spell damage, stun spells, dispel-magic traps/spells, other adverse spell effects.. } saves_struct; typedef struct { short hp; short mp; short armor; short thaco; short ndice; short sdice; short pdice; short str; short dex; short con; short intel; short pie; long realms; } creatureStats; typedef struct quest { public: quest() { num = exp = 0; name = 0; }; int num; int exp; char *name; } quest, *questPtr; // Base class for Command, Spell, Song, etc class MudMethod { public: virtual ~MudMethod() {}; bstring name; bstring desc; int priority; bstring getName(); bstring getDesc(); }; class Spell: public MudMethod { public: ~Spell() {}; }; class Song: public MudMethod { public: ~Song() {}; }; class Command: public MudMethod { public: ~Command() {}; bool (*auth)(const Creature *); virtual int execute(Creature* player, cmd* cmnd) = 0; }; // these are supplemental to the cmd class class CrtCommand: public Command { public: CrtCommand(bstring pCmdStr, int pPriority, int (*pFn)(Creature* player, cmd* cmnd), bool (*pAuth)(const Creature *), bstring pDesc): fn(pFn) { name = pCmdStr; priority = pPriority; auth = pAuth; desc = pDesc; }; ~CrtCommand() {}; int (*fn)(Creature* player, cmd* cmnd); int execute(Creature* player, cmd* cmnd); }; class PlyCommand: public Command { public: PlyCommand(bstring pCmdStr, int pPriority, int (*pFn)(Player* player, cmd* cmnd), bool (*pAuth)(const Creature *), bstring pDesc): fn(pFn) { name = pCmdStr; priority = pPriority; auth = pAuth; desc = pDesc; }; ~PlyCommand() {}; int (*fn)(Player* player, cmd* cmnd); int execute(Creature* player, cmd* cmnd); }; typedef int (*PFNCOMPARE)(const void *, const void *); #endif