2011-12-14 00:23:17 +03:00
# pragma once
2010-12-17 20:47:07 +02:00
2011-12-14 00:23:17 +03:00
# include "../lib/HeroBonus.h"
2010-12-17 20:47:07 +02:00
# include "../lib/ConstTransitivePtr.h"
2010-07-29 20:00:34 +03:00
/*
* 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 ;
2010-11-10 02:06:25 +02:00
class CArtifact ;
2010-12-26 16:34:11 +02:00
class CGHeroInstance ;
2012-01-30 19:07:52 +03:00
class CStackInstance ;
//class CCreatureArtifactSet;
2010-12-26 16:34:11 +02:00
struct ArtifactLocation ;
2010-07-29 20:00:34 +03:00
2011-12-14 00:23:17 +03:00
namespace ArtifactPosition
{
enum ArtifactPosition
{
PRE_FIRST = - 1 ,
HEAD , SHOULDERS , NECK , RIGHT_HAND , LEFT_HAND , TORSO , RIGHT_RING , LEFT_RING , FEET , MISC1 , MISC2 , MISC3 , MISC4 ,
MACH1 , MACH2 , MACH3 , MACH4 , SPELLBOOK , MISC5 ,
AFTER_LAST
} ;
}
class DLL_LINKAGE CArtifact : public CBonusSystemNode //container for artifacts
2010-07-29 20:00:34 +03:00
{
2010-11-10 02:06:25 +02:00
protected :
2010-07-29 20:00:34 +03:00
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 ;
2011-03-12 23:55:31 +02:00
2010-07-29 20:00:34 +03:00
int getArtClassSerial ( ) const ; //0 - treasure, 1 - minor, 2 - major, 3 - relic, 4 - spell scroll, 5 - other
2010-12-17 20:47:07 +02:00
std : : string nodeName ( ) const OVERRIDE ;
2010-07-29 20:00:34 +03:00
ui32 price ;
std : : vector < ui16 > possibleSlots ; //ids of slots where artifact can be placed
std : : vector < ui32 > * constituents ; // Artifacts IDs a combined artifact consists of, or NULL.
std : : vector < ui32 > * constituentOf ; // Reverse map of constituents.
EartClass aClass ;
si32 id ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
2011-01-18 20:56:14 +02:00
h & static_cast < CBonusSystemNode & > ( * this ) ;
2010-07-29 20:00:34 +03:00
h & name & description & price & possibleSlots & constituents & constituentOf & aClass & id ;
}
CArtifact ( ) ;
~ CArtifact ( ) ;
2010-07-26 18:37:58 +03:00
//override
2010-11-13 22:26:15 +02:00
//void getParents(TCNodes &out, const CBonusSystemNode *root = NULL) const;
2010-07-29 20:00:34 +03:00
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CArtifactInstance : public CBonusSystemNode
2010-12-17 20:47:07 +02:00
{
2011-01-18 20:56:14 +02:00
protected :
2010-12-25 03:43:40 +02:00
void init ( ) ;
2011-01-18 20:56:14 +02:00
CArtifactInstance ( CArtifact * Art ) ;
2010-12-17 20:47:07 +02:00
public :
2011-01-18 20:56:14 +02:00
CArtifactInstance ( ) ;
2010-12-26 16:34:11 +02:00
ConstTransitivePtr < CArtifact > artType ;
2010-12-17 20:47:07 +02:00
si32 id ; //id of the instance
2011-01-18 20:56:14 +02:00
//CArtifactInstance(int aid);
2010-12-17 20:47:07 +02:00
2012-01-30 19:07:52 +03:00
virtual std : : string nodeName ( ) const OVERRIDE ;
2011-02-04 16:58:14 +02:00
void deserializationFix ( ) ;
2010-12-17 20:47:07 +02:00
void setType ( CArtifact * Art ) ;
2010-12-26 16:34:11 +02:00
int firstAvailableSlot ( const CGHeroInstance * h ) const ;
int firstBackpackSlot ( const CGHeroInstance * h ) const ;
2011-09-24 04:15:36 +03:00
int getGivenSpellID ( ) const ; //to be used with scrolls (and similar arts), -1 if none
2010-12-29 23:04:22 +02:00
virtual bool canBePutAt ( const ArtifactLocation & al , bool assumeDestRemoved = false ) const ;
virtual bool canBeDisassembled ( ) const ;
2011-01-22 05:43:20 +02:00
virtual void putAt ( CGHeroInstance * h , ui16 slot ) ;
virtual void removeFrom ( CGHeroInstance * h , ui16 slot ) ;
2012-01-30 19:07:52 +03:00
virtual void putAt ( CStackInstance * s , ui16 slot ) ;
virtual void removeFrom ( CStackInstance * s , ui16 slot ) ;
2011-07-03 04:03:46 +03:00
virtual bool isPart ( const CArtifactInstance * supposedPart ) const ; //checks if this a part of this artifact: artifact instance is a part of itself, additionally truth is returned for consituents of combined arts
2010-12-26 16:34:11 +02:00
2011-01-22 05:43:20 +02:00
std : : vector < const CArtifact * > assemblyPossibilities ( const CGHeroInstance * h ) const ;
2011-01-15 19:58:08 +02:00
void move ( ArtifactLocation & src , ArtifactLocation & dst ) ;
2010-12-26 16:34:11 +02:00
2010-12-17 20:47:07 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & static_cast < CBonusSystemNode & > ( * this ) ;
2010-12-26 16:34:11 +02:00
h & artType & id ;
2011-02-22 11:47:25 +02:00
BONUS_TREE_DESERIALIZATION_FIX
2010-12-17 20:47:07 +02:00
}
static CArtifactInstance * createScroll ( const CSpell * s ) ;
2011-01-18 20:56:14 +02:00
static CArtifactInstance * createNewArtifactInstance ( CArtifact * Art ) ;
static CArtifactInstance * createNewArtifactInstance ( int aid ) ;
2010-12-17 20:47:07 +02:00
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CCombinedArtifactInstance : public CArtifactInstance
2010-12-25 03:43:40 +02:00
{
2011-01-18 20:56:14 +02:00
CCombinedArtifactInstance ( CArtifact * Art ) ;
2010-12-25 03:43:40 +02:00
public :
2011-01-18 20:56:14 +02:00
struct ConstituentInfo
{
ConstTransitivePtr < CArtifactInstance > art ;
si16 slot ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & art & slot ;
}
2011-07-03 04:03:46 +03:00
bool operator = = ( const ConstituentInfo & rhs ) const ;
2011-01-18 20:56:14 +02:00
ConstituentInfo ( CArtifactInstance * art = NULL , ui16 slot = - 1 ) ;
} ;
std : : vector < ConstituentInfo > constituentsInfo ;
2010-12-29 23:04:22 +02:00
bool canBePutAt ( const ArtifactLocation & al , bool assumeDestRemoved = false ) const OVERRIDE ;
bool canBeDisassembled ( ) const OVERRIDE ;
2011-01-22 05:43:20 +02:00
void putAt ( CGHeroInstance * h , ui16 slot ) OVERRIDE ;
void removeFrom ( CGHeroInstance * h , ui16 slot ) OVERRIDE ;
2011-07-03 04:03:46 +03:00
bool isPart ( const CArtifactInstance * supposedPart ) const OVERRIDE ;
2011-01-18 20:56:14 +02:00
void createConstituents ( ) ;
2011-01-22 05:43:20 +02:00
void addAsConstituent ( CArtifactInstance * art , int slot ) ;
CArtifactInstance * figureMainConstituent ( ui16 slot ) ; //main constituent is replcaed with us (combined art), not lock
CCombinedArtifactInstance ( ) ;
2011-01-18 20:56:14 +02:00
2011-02-04 16:58:14 +02:00
void deserializationFix ( ) ;
2011-01-18 20:56:14 +02:00
friend class CArtifactInstance ;
2011-05-04 05:38:58 +03:00
friend struct AssembledArtifact ;
2011-01-18 20:56:14 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & static_cast < CArtifactInstance & > ( * this ) ;
h & constituentsInfo ;
2011-02-22 11:47:25 +02:00
BONUS_TREE_DESERIALIZATION_FIX
2011-01-18 20:56:14 +02:00
}
2010-12-25 03:43:40 +02:00
} ;
2012-01-30 19:07:52 +03:00
class DLL_LINKAGE CCreatureArtifactInstance : public CArtifactInstance
{
CCreatureArtifactInstance ( CArtifact * Art ) ;
public :
bool canBePutAt ( const ArtifactLocation & al , bool assumeDestRemoved = false ) const OVERRIDE ;
void putAt ( CStackInstance * s , ui16 slot ) OVERRIDE ;
void removeFrom ( CStackInstance * s , ui16 slot ) OVERRIDE ;
bool isPart ( const CArtifactInstance * supposedPart ) const OVERRIDE ;
std : : string nodeName ( ) const OVERRIDE ;
CCreatureArtifactInstance ( ) ;
//void deserializationFix(); ..inherit from CArtifactInstance
friend class CArtifactInstance ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & static_cast < CArtifactInstance & > ( * this ) ;
2012-02-10 13:32:21 +03:00
//BONUS_TREE_DESERIALIZATION_FIX
2012-01-30 19:07:52 +03:00
}
} ;
2011-12-14 00:23:17 +03:00
// class DLL_LINKAGE IModableArt : public CArtifact //artifact which can have different properties, such as scroll or banner
2011-01-28 04:11:58 +02:00
// { //used only for dynamic cast :P
// public:
// si32 ID; //used for smart serialization
//
// template <typename Handler> void serialize(Handler &h, const int version)
// {
// h & static_cast<CArtifact&>(*this);
// h & ID;
// }
// };
//
2011-12-14 00:23:17 +03:00
// class DLL_LINKAGE CScroll : public IModableArt // Spell Scroll
2011-01-28 04:11:58 +02:00
// {
// public:
// CScroll(){spellid=0;};
// CScroll(spelltype sid){spellid = sid;};
// spelltype spellid;
// void Init();
// void SetProperty (int mod){spellid = mod;};
// template <typename Handler> void serialize(Handler &h, const int version)
// {
// h & static_cast<IModableArt&>(*this);
// h & spellid;
// }
// };
//
2011-12-14 00:23:17 +03:00
// class DLL_LINKAGE CCustomizableArt : public IModableArt // Warlord's Banner with multiple options
2011-01-28 04:11:58 +02:00
// {
// public:
// ui8 mode;
// CCustomizableArt(){mode=0;};
// void Init(){};
// void SetProperty (int mod){};
// template <typename Handler> void serialize(Handler &h, const int version)
// {
// h & static_cast<IModableArt&>(*this);
// h & mode;
// }
// };
//
2011-12-14 00:23:17 +03:00
// class DLL_LINKAGE CCommanderArt : public IModableArt // Growing with time
2011-01-28 04:11:58 +02:00
// {
// public:
// ui32 level;
// CCommanderArt(){level = 0;};
// void Init(){};
// void SetProperty (int mod){level = mod;};
// void Upgrade(){level++;};
// template <typename Handler> void serialize(Handler &h, const int version)
// {
// h & static_cast<IModableArt&>(*this);
// h & level;
// }
// };
2010-10-01 19:54:12 +03:00
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CArtHandler //handles artifacts
2010-07-29 20:00:34 +03:00
{
2010-08-06 13:46:40 +03:00
void giveArtBonus ( int aid , Bonus : : BonusType type , int val , int subtype = - 1 , int valType = Bonus : : BASE_NUMBER , ILimiter * limiter = NULL ) ;
2011-08-26 23:32:05 +03:00
void giveArtBonus ( int aid , Bonus : : BonusType type , int val , int subtype , IPropagator * propagator ) ;
2010-07-29 20:00:34 +03:00
public :
std : : vector < CArtifact * > treasures , minors , majors , relics ;
2010-12-17 20:47:07 +02:00
std : : vector < ConstTransitivePtr < CArtifact > > artifacts ;
2010-07-29 20:00:34 +03:00
std : : vector < CArtifact * > allowedArtifacts ;
std : : set < ui32 > bigArtifacts ; // Artifacts that cannot be moved to backpack, e.g. war machines.
2012-01-30 19:07:52 +03:00
std : : set < ui32 > creatureArtifacts ; // can be held by Stacks
2010-07-29 20:00:34 +03:00
void loadArtifacts ( bool onlyTxt ) ;
void sortArts ( ) ;
void addBonuses ( ) ;
void clear ( ) ;
void clearHlpLists ( ) ;
ui16 getRandomArt ( int flags ) ;
ui16 getArtSync ( ui32 rand , int flags ) ;
2010-12-17 20:47:07 +02:00
void getAllowedArts ( std : : vector < ConstTransitivePtr < CArtifact > > & out , std : : vector < CArtifact * > * arts , int flag ) ;
void getAllowed ( std : : vector < ConstTransitivePtr < CArtifact > > & out , int flags ) ;
2010-07-29 20:00:34 +03:00
void erasePickedArt ( si32 id ) ;
2010-12-19 00:11:28 +02:00
bool isBigArtifact ( ui32 artID ) const { return bigArtifacts . find ( artID ) ! = bigArtifacts . end ( ) ; }
2011-01-28 04:11:58 +02:00
// void equipArtifact (std::map<ui16, const CArtifact*> &artifWorn, ui16 slotID, const CArtifact* art) const;
// void unequipArtifact (std::map<ui16, const CArtifact*> &artifWorn, ui16 slotID) const;
2010-08-18 12:50:25 +03:00
void initAllowedArtifactsList ( const std : : vector < ui8 > & allowed ) ; //allowed[art_id] -> 0 if not allowed, 1 if allowed
2010-07-29 20:00:34 +03:00
static int convertMachineID ( int id , bool creToArt ) ;
CArtHandler ( ) ;
~ CArtHandler ( ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & artifacts & allowedArtifacts & treasures & minors & majors & relics ;
2012-01-30 19:07:52 +03:00
h & creatureArtifacts ;
2010-07-29 20:00:34 +03:00
//if(!h.saving) sortArts();
}
} ;
2011-12-14 00:23:17 +03:00
struct DLL_LINKAGE ArtSlotInfo
2011-06-24 20:43:02 +03:00
{
ConstTransitivePtr < CArtifactInstance > artifact ;
ui8 locked ; //if locked, then artifact points to the combined artifact
ArtSlotInfo ( )
{
locked = false ;
}
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & artifact & locked ;
}
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE IArtifactSetBase
2011-08-13 13:54:23 +03:00
{ ///artifacts container
public :
2011-09-05 09:37:24 +03:00
virtual void setNewArtSlot ( ui16 slot , CArtifactInstance * art , bool locked ) ;
virtual const CArtifactInstance * getArt ( ui16 pos , bool excludeLocked = true ) const ;
2011-08-13 13:54:23 +03:00
virtual CArtifactInstance * getArt ( ui16 pos , bool excludeLocked = true ) ; //NULL - no artifact
2011-09-05 09:37:24 +03:00
virtual bool hasArt ( ui32 aid , bool onlyWorn = false ) const ;
virtual bool isPositionFree ( ui16 pos , bool onlyLockCheck = false ) const ;
2011-08-13 13:54:23 +03:00
virtual ArtSlotInfo & retreiveNewArtSlot ( ui16 slot ) = 0 ;
virtual void eraseArtSlot ( ui16 slot ) = 0 ;
2011-09-05 09:37:24 +03:00
virtual const ArtSlotInfo * getSlot ( ui16 pos ) const = 0 ;
2011-08-13 13:54:23 +03:00
virtual si32 getArtPos ( int aid , bool onlyWorn = true ) const = 0 ; //looks for equipped artifact with given ID and returns its slot ID or -1 if none(if more than one such artifact lower ID is returned)
virtual si32 getArtPos ( const CArtifactInstance * art ) const = 0 ;
virtual const CArtifactInstance * getArtByInstanceId ( int artInstId ) const = 0 ;
virtual si32 getArtTypeId ( ui16 pos ) const = 0 ;
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CArtifactSet : public IArtifactSetBase
2011-08-13 13:54:23 +03:00
{ ///hero artifacts
2011-06-24 20:43:02 +03:00
public :
std : : vector < ArtSlotInfo > artifactsInBackpack ; //hero's artifacts from bag
bmap < ui16 , ArtSlotInfo > artifactsWorn ; //map<position,artifact_id>; positions: 0 - head; 1 - shoulders; 2 - neck; 3 - right hand; 4 - left hand; 5 - torso; 6 - right ring; 7 - left ring; 8 - feet; 9 - misc1; 10 - misc2; 11 - misc3; 12 - misc4; 13 - mach1; 14 - mach2; 15 - mach3; 16 - mach4; 17 - spellbook; 18 - misc5
ArtSlotInfo & retreiveNewArtSlot ( ui16 slot ) ;
void eraseArtSlot ( ui16 slot ) ;
const ArtSlotInfo * getSlot ( ui16 pos ) const ;
2011-09-05 09:37:24 +03:00
si32 getArtPos ( int aid , bool onlyWorn = true ) const ;
2011-06-24 20:43:02 +03:00
si32 getArtPos ( const CArtifactInstance * art ) const ;
const CArtifactInstance * getArtByInstanceId ( int artInstId ) const ;
si32 getArtTypeId ( ui16 pos ) const ;
virtual ~ CArtifactSet ( ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & artifactsInBackpack & artifactsWorn ;
}
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CCreatureArtifactSet : public IArtifactSetBase
2011-08-13 13:54:23 +03:00
{ ///creature artifacts
public :
2012-01-30 19:07:52 +03:00
std : : vector < ArtSlotInfo > artifactsInBackpack ; //artifacts carried by creature - 4 max (according to WoG)
2012-02-10 13:32:21 +03:00
ArtSlotInfo activeArtifact ; //position 0 - GameConstants::CREATURE_ART
2011-08-13 13:54:23 +03:00
ArtSlotInfo & retreiveNewArtSlot ( ui16 slot ) ;
void eraseArtSlot ( ui16 slot ) ;
const ArtSlotInfo * getSlot ( ui16 pos ) const ;
si32 getArtPos ( int aid , bool onlyWorn = true ) const ;
si32 getArtPos ( const CArtifactInstance * art ) const ;
const CArtifactInstance * getArtByInstanceId ( int artInstId ) const ;
si32 getArtTypeId ( ui16 pos ) const ;
virtual ~ CCreatureArtifactSet ( ) { } ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & artifactsInBackpack & activeArtifact ;
}
} ;