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"
2012-12-10 16:55:54 +03:00
# include "JsonNode.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 ;
struct ArtifactLocation ;
2012-04-14 05:20:22 +03:00
class CArtifactSet ;
2012-07-16 19:18:02 +03:00
class CArtifactInstance ;
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 ,
2012-04-14 05:20:22 +03:00
AFTER_LAST ,
//cres
2012-05-20 11:39:19 +03:00
CREATURE_SLOT = 0 ,
2012-05-25 18:10:38 +03:00
COMMANDER1 = 0 , COMMANDER2 , COMMANDER3 , COMMANDER4 , COMMANDER5 , COMMANDER6 , COMMANDER_AFTER_LAST
2012-04-14 05:20:22 +03:00
} ;
}
2012-09-25 17:40:39 +03:00
namespace ArtifactID
2012-08-26 12:07:48 +03:00
{
2012-09-25 17:40:39 +03:00
enum ArtifactID
2012-08-26 12:07:48 +03:00
{
2012-09-25 17:40:39 +03:00
SPELLBOOK = 0 ,
SPELL_SCROLL = 1 ,
GRAIL = 2 ,
CATAPULT = 3 ,
BALLISTA = 4 ,
AMMO_CART = 5 ,
FIRST_AID_TENT = 6 ,
CENTAUR_AXE = 7 ,
BLACKSHARD_OF_THE_DEAD_KNIGHT = 8 ,
CORNUCOPIA = 140
2012-08-26 12:07:48 +03:00
} ;
}
2012-12-10 16:55:54 +03:00
# define ART_BEARER_LIST \
ART_BEARER ( HERO ) \
ART_BEARER ( CREATURE ) \
ART_BEARER ( COMMANDER )
2012-04-14 05:20:22 +03:00
namespace ArtBearer
{
enum
{
2012-12-10 16:55:54 +03:00
# define ART_BEARER(x) x,
ART_BEARER_LIST
# undef ART_BEARER
2011-12-14 00:23:17 +03:00
} ;
}
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
2012-12-06 22:03:47 +03:00
std : : string eventText ; //short story displayed upon picking
2010-07-29 20:00:34 +03:00
public :
enum EartClass { ART_SPECIAL = 1 , ART_TREASURE = 2 , ART_MINOR = 4 , ART_MAJOR = 8 , ART_RELIC = 16 } ; //artifact classes
2012-12-10 16:55:54 +03:00
std : : string image ;
2012-12-13 17:27:33 +03:00
std : : string large ; // big image for cutom artifacts, used in drag & drop
2012-12-16 14:35:14 +03:00
std : : string advMapDef ; //used for adventure map object
2012-12-13 17:27:33 +03:00
si32 iconIndex ; //TODO: handle automatically
2012-12-10 16:55:54 +03:00
2010-07-29 20:00:34 +03:00
const std : : string & Name ( ) const ; //getter
const std : : string & Description ( ) const ; //getter
2012-12-06 22:03:47 +03:00
const std : : string & EventText ( ) const ;
2010-07-29 20:00:34 +03:00
bool isBig ( ) const ;
2012-12-06 22:03:47 +03:00
void setName ( std : : string desc ) ;
2012-04-17 11:46:09 +03:00
void setDescription ( std : : string desc ) ;
2012-12-06 22:03:47 +03:00
void setEventText ( std : : string desc ) ;
2012-12-25 22:04:15 +03:00
void addConstituent ( ui32 component ) ;
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 ;
2012-12-13 17:27:33 +03:00
void addNewBonus ( Bonus * b ) OVERRIDE ;
2010-07-29 20:00:34 +03:00
2012-07-16 19:18:02 +03:00
virtual void levelUpArtifact ( CArtifactInstance * art ) { } ;
2010-07-29 20:00:34 +03:00
ui32 price ;
2012-04-14 05:20:22 +03:00
bmap < ui8 , std : : vector < ui16 > > possibleSlots ; //Bearer Type => ids of slots where artifact can be placed
2010-07-29 20:00:34 +03:00
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 ) ;
2012-12-16 14:35:14 +03:00
h & name & description & eventText & image & large & advMapDef & iconIndex &
2012-12-13 17:27:33 +03:00
price & possibleSlots & constituents & constituentOf & aClass & id ;
2010-07-29 20:00:34 +03:00
}
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
} ;
2012-07-16 19:18:02 +03:00
class DLL_LINKAGE CGrowingArtifact : public CArtifact //for example commander artifacts getting bonuses after battle
{
public :
std : : vector < std : : pair < ui16 , Bonus > > bonusesPerLevel ; //bonus given each n levels
std : : vector < std : : pair < ui16 , Bonus > > thresholdBonuses ; //after certain level they will be added once
void levelUpArtifact ( CArtifactInstance * art ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & static_cast < CArtifact & > ( * this ) ;
h & bonusesPerLevel & thresholdBonuses ;
}
} ;
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 ;
2012-09-25 17:40:39 +03:00
TArtifactInstanceID id ;
2010-12-17 20:47:07 +02:00
2011-01-18 20:56:14 +02:00
//CArtifactInstance(int aid);
2010-12-17 20:47:07 +02:00
2012-04-14 05:20:22 +03:00
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 ) ;
2012-04-14 05:20:22 +03:00
int firstAvailableSlot ( const CArtifactSet * h ) const ;
int firstBackpackSlot ( const CArtifactSet * 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
2012-04-14 05:20:22 +03:00
virtual bool canBePutAt ( const CArtifactSet * artSet , int slot , bool assumeDestRemoved = false ) const ;
2012-04-14 19:28:36 +03:00
bool canBePutAt ( const ArtifactLocation al , bool assumeDestRemoved = false ) const ; //forwards to the above one
2010-12-29 23:04:22 +02:00
virtual bool canBeDisassembled ( ) const ;
2012-04-14 19:28:36 +03:00
virtual void putAt ( ArtifactLocation al ) ;
virtual void removeFrom ( ArtifactLocation al ) ;
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
2012-04-14 05:20:22 +03:00
std : : vector < const CArtifact * > assemblyPossibilities ( const CArtifactSet * h ) const ;
2012-04-14 19:28:36 +03: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 ;
2012-04-14 05:20:22 +03:00
bool canBePutAt ( const CArtifactSet * artSet , int slot , bool assumeDestRemoved = false ) const OVERRIDE ;
2010-12-29 23:04:22 +02:00
bool canBeDisassembled ( ) const OVERRIDE ;
2012-04-14 19:28:36 +03:00
void putAt ( ArtifactLocation al ) OVERRIDE ;
void removeFrom ( ArtifactLocation al ) 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 ) ;
2012-04-14 19:28:36 +03:00
CArtifactInstance * figureMainConstituent ( const ArtifactLocation al ) ; //main constituent is replcaed with us (combined art), not lock
2011-01-22 05:43:20 +02:00
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
} ;
2011-12-14 00:23:17 +03:00
class DLL_LINKAGE CArtHandler //handles artifacts
2010-07-29 20:00:34 +03:00
{
2012-11-02 23:08:37 +03:00
void giveArtBonus ( TArtifactID aid , Bonus : : BonusType type , int val , int subtype = - 1 , int valType = Bonus : : BASE_NUMBER , shared_ptr < ILimiter > limiter = shared_ptr < ILimiter > ( ) , int additionalinfo = 0 ) ;
2012-09-23 21:01:04 +03:00
void giveArtBonus ( TArtifactID aid , Bonus : : BonusType type , int val , int subtype , shared_ptr < IPropagator > propagator , int additionalinfo = 0 ) ;
void giveArtBonus ( TArtifactID aid , Bonus * bonus ) ;
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-07-16 19:18:02 +03:00
std : : set < ui32 > growingArtifacts ;
2010-07-29 20:00:34 +03:00
void loadArtifacts ( bool onlyTxt ) ;
2012-12-10 16:55:54 +03:00
/// load all artifacts from json structure
void load ( const JsonNode & node ) ;
/// load one artifact from json config
CArtifact * loadArtifact ( const JsonNode & node ) ;
2012-12-27 14:00:28 +03:00
///read (optional) components of combined artifact
void readComponents ( const JsonNode & node , CArtifact * art ) ;
2012-12-10 16:55:54 +03:00
2010-07-29 20:00:34 +03:00
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 ) ;
2012-09-25 17:40:39 +03:00
void erasePickedArt ( TArtifactInstanceID id ) ;
2012-09-23 21:01:04 +03:00
bool isBigArtifact ( TArtifactID artID ) const { return bigArtifacts . find ( artID ) ! = bigArtifacts . end ( ) ; }
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 ) ;
2012-12-27 14:00:28 +03:00
void makeItCreatureArt ( CArtifact * a , bool onlyCreature = true ) ;
2012-09-25 17:40:39 +03:00
void makeItCreatureArt ( TArtifactInstanceID aid , bool onlyCreature = true ) ;
2012-12-27 14:00:28 +03:00
void makeItCommanderArt ( CArtifact * a , bool onlyCommander = true ) ;
2012-09-25 17:40:39 +03:00
void makeItCommanderArt ( TArtifactInstanceID aid , bool onlyCommander = true ) ;
2010-07-29 20:00:34 +03:00
CArtHandler ( ) ;
~ CArtHandler ( ) ;
2013-01-06 22:30:12 +03:00
/**
* Gets a list of default allowed artifacts .
*
* @ return a list of allowed artifacts , the index is the artifact id and the value either 0 for not allowed or 1 for allowed
*/
std : : vector < ui8 > getDefaultAllowedArtifacts ( ) const ;
2010-07-29 20:00:34 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2012-07-16 19:18:02 +03:00
h & artifacts & allowedArtifacts & treasures & minors & majors & relics
& growingArtifacts ;
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 ;
}
} ;
2012-04-14 05:20:22 +03:00
class DLL_LINKAGE CArtifactSet
{
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 ) ;
2012-04-14 05:20:22 +03:00
void setNewArtSlot ( ui16 slot , CArtifactInstance * art , bool locked ) ;
2011-06-24 20:43:02 +03:00
void eraseArtSlot ( ui16 slot ) ;
const ArtSlotInfo * getSlot ( ui16 pos ) const ;
2012-04-14 05:20:22 +03:00
const CArtifactInstance * getArt ( ui16 pos , bool excludeLocked = true ) const ; //NULL - no artifact
CArtifactInstance * getArt ( ui16 pos , bool excludeLocked = true ) ; //NULL - no artifact
si32 getArtPos ( int aid , bool onlyWorn = true ) const ; //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)
2011-06-24 20:43:02 +03:00
si32 getArtPos ( const CArtifactInstance * art ) const ;
2012-09-25 17:40:39 +03:00
const CArtifactInstance * getArtByInstanceId ( TArtifactInstanceID artInstId ) const ;
2012-04-14 05:20:22 +03:00
bool hasArt ( ui32 aid , bool onlyWorn = false ) const ; //checks if hero possess artifact of given id (either in backack or worn)
bool isPositionFree ( ui16 pos , bool onlyLockCheck = false ) const ;
2011-06-24 20:43:02 +03:00
si32 getArtTypeId ( ui16 pos ) const ;
2012-04-14 05:20:22 +03:00
virtual ui8 bearerType ( ) const = 0 ;
2011-06-24 20:43:02 +03:00
virtual ~ CArtifactSet ( ) ;
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & artifactsInBackpack & artifactsWorn ;
}
2012-04-14 05:20:22 +03:00
void artDeserializationFix ( CBonusSystemNode * node ) ;
2011-08-13 13:54:23 +03:00
} ;