#ifndef __CARTHANDLER_H__ #define __CARTHANDLER_H__ #include "../global.h" #include "../lib/HeroBonus.h" #include #include #include "../lib/ConstTransitivePtr.h" /* * CArtHandler.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ class CDefHandler; class CArtifact; class DLL_EXPORT CArtifact : public CBonusSystemNode //container for artifacts { protected: std::string name, description; //set if custom public: enum EartClass {ART_SPECIAL=1, ART_TREASURE=2, ART_MINOR=4, ART_MAJOR=8, ART_RELIC=16}; //artifact classes const std::string &Name() const; //getter const std::string &Description() const; //getter bool isBig () const; bool isModable () const; bool fitsAt (const std::map &artifWorn, ui16 slot) const; bool canBeAssembledTo (const std::map &artifWorn, ui32 artifactID) const; void addBonusesTo (BonusList *otherBonuses) const; void removeBonusesFrom (BonusList *otherBonuses) const; virtual void SetProperty (int mod){}; virtual void Init(){}; int getArtClassSerial() const; //0 - treasure, 1 - minor, 2 - major, 3 - relic, 4 - spell scroll, 5 - other std::string nodeName() const OVERRIDE; ui32 price; std::vector possibleSlots; //ids of slots where artifact can be placed std::vector * constituents; // Artifacts IDs a combined artifact consists of, or NULL. std::vector * constituentOf; // Reverse map of constituents. EartClass aClass; si32 id; template void serialize(Handler &h, const int version) { h & static_cast(*this);; h & name & description & price & possibleSlots & constituents & constituentOf & aClass & id; } CArtifact(); ~CArtifact(); //override //void getParents(TCNodes &out, const CBonusSystemNode *root = NULL) const; }; class DLL_EXPORT CArtifactInstance : public CBonusSystemNode { public: ConstTransitivePtr art; si32 id; //id of the instance CArtifactInstance(); CArtifactInstance(CArtifact *Art); void init(); std::string nodeName() const OVERRIDE; void setType(CArtifact *Art); template void serialize(Handler &h, const int version) { h & static_cast(*this); h & art & id; } static CArtifactInstance *createScroll(const CSpell *s); }; class DLL_EXPORT IModableArt : public CArtifact //artifact which can have different properties, such as scroll or banner { //used only for dynamic cast :P public: si32 ID; //used for smart serialization template void serialize(Handler &h, const int version) { h & static_cast(*this); h & ID; } }; class DLL_EXPORT CScroll : public IModableArt // Spell Scroll { public: CScroll(){spellid=0;}; CScroll(spelltype sid){spellid = sid;}; spelltype spellid; void Init(); void SetProperty (int mod){spellid = mod;}; template void serialize(Handler &h, const int version) { h & static_cast(*this); h & spellid; } }; class DLL_EXPORT CCustomizableArt : public IModableArt // Warlord's Banner with multiple options { public: ui8 mode; CCustomizableArt(){mode=0;}; void Init(){}; void SetProperty (int mod){}; template void serialize(Handler &h, const int version) { h & static_cast(*this); h & mode; } }; class DLL_EXPORT CCommanderArt : public IModableArt // Growing with time { public: ui32 level; CCommanderArt(){level = 0;}; void Init(){}; void SetProperty (int mod){level = mod;}; void Upgrade(){level++;}; template void serialize(Handler &h, const int version) { h & static_cast(*this); h & level; } }; class DLL_EXPORT CArtHandler //handles artifacts { void giveArtBonus(int aid, Bonus::BonusType type, int val, int subtype = -1, int valType = Bonus::BASE_NUMBER, ILimiter * limiter = NULL); public: std::vector treasures, minors, majors, relics; std::vector< ConstTransitivePtr > artifacts; std::vector allowedArtifacts; std::set bigArtifacts; // Artifacts that cannot be moved to backpack, e.g. war machines. std::map modableArtifacts; //1-scroll, 2-banner, 3-commander art with progressive bonus void loadArtifacts(bool onlyTxt); void sortArts(); void addBonuses(); void clear(); void clearHlpLists(); ui16 getRandomArt (int flags); ui16 getArtSync (ui32 rand, int flags); void getAllowedArts(std::vector > &out, std::vector *arts, int flag); void getAllowed(std::vector > &out, int flags); void erasePickedArt (si32 id); bool isBigArtifact (ui32 artID) const {return bigArtifacts.find(artID) != bigArtifacts.end();} void equipArtifact (std::map &artifWorn, ui16 slotID, const CArtifact* art) const; void unequipArtifact (std::map &artifWorn, ui16 slotID) const; void initAllowedArtifactsList(const std::vector &allowed); //allowed[art_id] -> 0 if not allowed, 1 if allowed static int convertMachineID(int id, bool creToArt); CArtHandler(); ~CArtHandler(); template void serialize(Handler &h, const int version) { h & artifacts & allowedArtifacts & treasures & minors & majors & relics; //if(!h.saving) sortArts(); } }; #endif // __CARTHANDLER_H__