2010-07-29 17:00:34 +00: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
*
*/
2017-07-13 11:26:03 +03:00
# pragma once
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
# include <vcmi/Artifact.h>
# include <vcmi/ArtifactService.h>
2023-05-01 20:29:53 +03:00
# include "bonuses/Bonus.h"
2023-04-30 17:35:15 +03:00
# include "bonuses/CBonusSystemNode.h"
2017-07-13 11:26:03 +03:00
# include "GameConstants.h"
# include "IHandlerBase.h"
2013-03-02 16:55:51 +00:00
2022-07-26 16:07:42 +03:00
VCMI_LIB_NAMESPACE_BEGIN
2013-03-02 16:55:51 +00:00
class CArtHandler ;
2010-12-26 14:34:11 +00:00
class CGHeroInstance ;
2012-04-14 02:20:22 +00:00
class CArtifactSet ;
2012-07-16 16:18:02 +00:00
class CArtifactInstance ;
2014-03-17 19:51:07 +00:00
class CRandomGenerator ;
2016-02-13 19:43:05 +03:00
class CMap ;
2016-11-13 13:38:42 +03:00
class JsonSerializeFormat ;
2010-07-29 17:00:34 +00:00
2012-12-10 13:55:54 +00:00
# define ART_BEARER_LIST \
ART_BEARER ( HERO ) \
ART_BEARER ( CREATURE ) \
ART_BEARER ( COMMANDER )
2012-04-14 02:20:22 +00:00
namespace ArtBearer
{
2013-02-07 17:34:50 +00:00
enum ArtBearer
2012-04-14 02:20:22 +00:00
{
2012-12-10 13:55:54 +00:00
# define ART_BEARER(x) x,
ART_BEARER_LIST
# undef ART_BEARER
2011-12-13 21:23:17 +00:00
} ;
}
2023-06-29 18:34:07 +03:00
class DLL_LINKAGE CCombinedArtifact
{
protected :
CCombinedArtifact ( ) = default ;
2023-07-03 19:15:40 +03:00
std : : vector < CArtifact * > constituents ; // Artifacts IDs a combined artifact consists of, or nullptr.
std : : vector < CArtifact * > partOf ; // Reverse map of constituents - combined arts that include this art
public :
2023-06-29 18:34:07 +03:00
bool isCombined ( ) const ;
2023-07-03 19:15:40 +03:00
const std : : vector < CArtifact * > & getConstituents ( ) const ;
const std : : vector < CArtifact * > & getPartOf ( ) const ;
2023-06-29 18:34:07 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & constituents ;
h & partOf ;
}
} ;
class DLL_LINKAGE CScrollArtifact
{
protected :
CScrollArtifact ( ) = default ;
public :
bool isScroll ( ) const ;
} ;
class DLL_LINKAGE CGrowingArtifact
{
protected :
CGrowingArtifact ( ) = default ;
2023-07-03 19:15:40 +03:00
2023-06-29 18:34:07 +03:00
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
2023-07-03 19:15:40 +03:00
public :
2023-06-29 18:34:07 +03:00
bool isGrowing ( ) const ;
2023-07-03 19:15:40 +03:00
std : : vector < std : : pair < ui16 , Bonus > > & getBonusesPerLevel ( ) ;
const std : : vector < std : : pair < ui16 , Bonus > > & getBonusesPerLevel ( ) const ;
std : : vector < std : : pair < ui16 , Bonus > > & getThresholdBonuses ( ) ;
const std : : vector < std : : pair < ui16 , Bonus > > & getThresholdBonuses ( ) const ;
2023-06-29 18:34:07 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & bonusesPerLevel ;
h & thresholdBonuses ;
}
} ;
// Container for artifacts. Not for instances.
class DLL_LINKAGE CArtifact
: public Artifact , public CBonusSystemNode , public CCombinedArtifact , public CScrollArtifact , public CGrowingArtifact
2010-07-29 17:00:34 +00:00
{
2023-01-02 15:58:56 +02:00
ArtifactID id ;
2023-07-03 23:11:56 +03:00
std : : string image ;
std : : string large ; // big image for custom artifacts, used in drag & drop
std : : string advMapDef ; // used for adventure map object
2023-01-02 15:58:56 +02:00
std : : string modScope ;
std : : string identifier ;
2023-07-03 23:11:56 +03:00
int32_t iconIndex ;
uint32_t price ;
CreatureID warMachine ;
// Bearer Type => ids of slots where artifact can be placed
std : : map < ArtBearer : : ArtBearer , std : : vector < ArtifactPosition > > possibleSlots ;
2023-01-02 15:58:56 +02:00
2010-07-29 17:00:34 +00:00
public :
enum EartClass { ART_SPECIAL = 1 , ART_TREASURE = 2 , ART_MINOR = 4 , ART_MAJOR = 8 , ART_RELIC = 16 } ; //artifact classes
2016-01-24 02:27:14 +03:00
2023-03-14 00:26:44 +03:00
EartClass aClass = ART_SPECIAL ;
2023-07-17 17:21:28 +02:00
bool onlyOnWaterMap ;
2012-12-10 13:55:54 +00:00
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
int32_t getIndex ( ) const override ;
int32_t getIconIndex ( ) const override ;
2023-01-18 23:56:01 +02:00
std : : string getJsonKey ( ) const override ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
void registerIcons ( const IconRegistar & cb ) const override ;
ArtifactID getId ( ) const override ;
2023-04-05 03:26:29 +03:00
virtual const IBonusBearer * getBonusBearer ( ) const override ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
2023-01-02 15:58:56 +02:00
std : : string getDescriptionTranslated ( ) const override ;
std : : string getEventTranslated ( ) const override ;
std : : string getNameTranslated ( ) const override ;
std : : string getDescriptionTextID ( ) const override ;
std : : string getEventTextID ( ) const override ;
std : : string getNameTextID ( ) const override ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
uint32_t getPrice ( ) const override ;
CreatureID getWarMachine ( ) const override ;
bool isBig ( ) const override ;
bool isTradable ( ) const override ;
2011-03-12 21:55:31 +00:00
2010-07-29 17:00:34 +00:00
int getArtClassSerial ( ) const ; //0 - treasure, 1 - minor, 2 - major, 3 - relic, 4 - spell scroll, 5 - other
2013-03-12 14:56:23 +00:00
std : : string nodeName ( ) const override ;
2016-09-19 23:36:35 +02:00
void addNewBonus ( const std : : shared_ptr < Bonus > & b ) override ;
2023-07-03 23:11:56 +03:00
const std : : map < ArtBearer : : ArtBearer , std : : vector < ArtifactPosition > > & getPossibleSlots ( ) const ;
2010-07-29 17:00:34 +00:00
2023-03-21 12:13:53 +02:00
virtual bool canBePutAt ( const CArtifactSet * artSet , ArtifactPosition slot = ArtifactPosition : : FIRST_AVAILABLE ,
bool assumeDestRemoved = false ) const ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
void updateFrom ( const JsonNode & data ) ;
2023-07-03 23:11:56 +03:00
// Is used for testing purposes only
void setImage ( int32_t iconIndex , std : : string image , std : : string large ) ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
2023-06-29 18:34:07 +03:00
template < typename Handler > void serialize ( Handler & h , const int version )
2010-07-29 17:00:34 +00:00
{
2011-01-18 18:56:14 +00:00
h & static_cast < CBonusSystemNode & > ( * this ) ;
2023-06-29 18:34:07 +03:00
h & static_cast < CCombinedArtifact & > ( * this ) ;
h & static_cast < CGrowingArtifact & > ( * this ) ;
2017-07-31 16:35:42 +03:00
h & image ;
h & large ;
h & advMapDef ;
h & iconIndex ;
h & price ;
h & possibleSlots ;
h & aClass ;
h & id ;
2023-01-02 15:58:56 +02:00
h & modScope ;
2022-06-20 17:39:50 +03:00
h & identifier ;
h & warMachine ;
2023-07-17 17:21:28 +02:00
h & onlyOnWaterMap ;
2010-07-29 17:00:34 +00:00
}
CArtifact ( ) ;
~ CArtifact ( ) ;
2013-03-02 16:55:51 +00:00
friend class CArtHandler ;
2010-07-29 17:00:34 +00:00
} ;
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
class DLL_LINKAGE CArtHandler : public CHandlerBase < ArtifactID , Artifact , CArtifact , ArtifactService >
2010-07-29 17:00:34 +00:00
{
public :
2013-02-12 22:24:48 +00:00
std : : vector < CArtifact * > treasures , minors , majors , relics ; //tmp vectors!!! do not touch if you don't know what you are doing!!!
2010-07-29 17:00:34 +00:00
std : : vector < CArtifact * > allowedArtifacts ;
2013-02-10 23:24:57 +00:00
std : : set < ArtifactID > growingArtifacts ;
2010-07-29 17:00:34 +00:00
2013-03-02 16:55:51 +00:00
void addBonuses ( CArtifact * art , const JsonNode & bonusList ) ;
2013-02-18 22:37:22 +00:00
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
void fillList ( std : : vector < CArtifact * > & listToBeFilled , CArtifact : : EartClass artifactClass ) ; //fills given empty list with allowed artifacts of given class. No side effects
2013-02-18 22:37:22 +00:00
2023-03-14 00:26:44 +03:00
static CArtifact : : EartClass stringToClass ( const std : : string & className ) ; //TODO: rework EartClass to make this a constructor
2014-06-22 13:39:40 +03:00
2014-03-17 19:51:07 +00:00
/// Gets a artifact ID randomly and removes the selected artifact from this handler.
ArtifactID pickRandomArtifact ( CRandomGenerator & rand , int flags ) ;
2014-06-22 13:39:40 +03:00
ArtifactID pickRandomArtifact ( CRandomGenerator & rand , std : : function < bool ( ArtifactID ) > accepts ) ;
ArtifactID pickRandomArtifact ( CRandomGenerator & rand , int flags , std : : function < bool ( ArtifactID ) > accepts ) ;
2023-03-14 00:26:44 +03:00
bool legalArtifact ( const ArtifactID & id ) ;
2013-02-04 21:58:42 +00:00
void initAllowedArtifactsList ( const std : : vector < bool > & allowed ) ; //allowed[art_id] -> 0 if not allowed, 1 if allowed
2023-03-14 00:26:44 +03:00
static void makeItCreatureArt ( CArtifact * a , bool onlyCreature = true ) ;
static void makeItCommanderArt ( CArtifact * a , bool onlyCommander = true ) ;
2013-04-21 12:49:26 +00:00
2010-07-29 17:00:34 +00:00
~ CArtHandler ( ) ;
2023-03-15 21:34:29 +02:00
std : : vector < JsonNode > loadLegacyData ( ) override ;
2013-04-21 12:49:26 +00:00
void loadObject ( std : : string scope , std : : string name , const JsonNode & data ) override ;
void loadObject ( std : : string scope , std : : string name , const JsonNode & data , size_t index ) override ;
2013-07-21 14:19:29 +00:00
void afterLoadFinalization ( ) override ;
2013-04-21 12:49:26 +00:00
std : : vector < bool > getDefaultAllowed ( ) const override ;
2013-01-06 19:30:12 +00:00
2010-07-29 17:00:34 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
h & objects ;
2017-07-31 16:35:42 +03:00
h & allowedArtifacts ;
h & treasures ;
h & minors ;
h & majors ;
h & relics ;
h & growingArtifacts ;
2010-07-29 17:00:34 +00:00
}
2014-03-17 19:51:07 +00:00
Entities redesign and a few ERM features
* Made most Handlers derived from CHandlerBase and moved service API there.
* Declared existing Entity APIs.
* Added basic script context caching
* Started Lua script module
* Started Lua spell effect API
* Started script state persistence
* Started battle info callback binding
* CommitPackage removed
* Extracted spells::Caster to own header; Expanded Spell API.
* implemented !!MC:S, !!FU:E, !!FU:P, !!MA, !!VR:H, !!VR:C
* !!BU:C, !!BU:E, !!BU:G, !!BU:M implemented
* Allow use of "MC:S@varName@" to declare normal variable (technically v-variable with string key)
* Re-enabled VERM macros.
* !?GM0 added
* !?TM implemented
* Added !!MF:N
* Started !?OB, !!BM, !!HE, !!OW, !!UN
* Added basic support of w-variables
* Added support for ERM indirect variables
* Made !?FU regular trigger
* !!re (ERA loop receiver) implemented
* Fixed ERM receivers with zero args.
2018-03-17 17:58:30 +03:00
protected :
const std : : vector < std : : string > & getTypeNames ( ) const override ;
CArtifact * loadFromJson ( const std : : string & scope , const JsonNode & json , const std : : string & identifier , size_t index ) override ;
2014-03-17 19:51:07 +00:00
private :
2023-03-14 00:26:44 +03:00
void addSlot ( CArtifact * art , const std : : string & slotID ) const ;
void loadSlots ( CArtifact * art , const JsonNode & node ) const ;
void loadClass ( CArtifact * art , const JsonNode & node ) const ;
void loadType ( CArtifact * art , const JsonNode & node ) const ;
2014-03-17 19:51:07 +00:00
void loadComponents ( CArtifact * art , const JsonNode & node ) ;
2023-03-14 00:26:44 +03:00
void erasePickedArt ( const ArtifactID & id ) ;
2010-07-29 17:00:34 +00:00
} ;
2011-12-13 21:23:17 +00:00
struct DLL_LINKAGE ArtSlotInfo
2011-06-24 17:43:02 +00:00
{
ConstTransitivePtr < CArtifactInstance > artifact ;
ui8 locked ; //if locked, then artifact points to the combined artifact
2016-01-22 12:53:01 +03:00
ArtSlotInfo ( ) : locked ( false ) { }
2022-11-06 23:54:50 +02:00
const CArtifactInstance * getArt ( ) const ;
2016-01-22 12:53:01 +03:00
2022-11-06 23:54:50 +02:00
template < typename Handler > void serialize ( Handler & h , const int version )
2011-06-24 17:43:02 +00:00
{
2017-07-31 16:35:42 +03:00
h & artifact ;
h & locked ;
2011-06-24 17:43:02 +00:00
}
} ;
2012-04-14 02:20:22 +00:00
class DLL_LINKAGE CArtifactSet
2014-03-17 19:51:07 +00:00
{
public :
2023-07-24 19:09:17 +03:00
using ArtPlacementMap = std : : map < CArtifactInstance * , ArtifactPosition > ;
2014-03-17 19:51:07 +00:00
std : : vector < ArtSlotInfo > artifactsInBackpack ; //hero's artifacts from bag
std : : map < ArtifactPosition , 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
2022-12-29 20:39:01 +02:00
std : : vector < ArtSlotInfo > artifactsTransitionPos ; // Used as transition position for dragAndDrop artifact exchange
2014-03-17 19:51:07 +00:00
2023-07-24 19:09:17 +03:00
void setNewArtSlot ( const ArtifactPosition & slot , ConstTransitivePtr < CArtifactInstance > art , bool locked ) ;
2023-03-14 00:26:44 +03:00
void eraseArtSlot ( const ArtifactPosition & slot ) ;
2011-06-24 17:43:02 +00:00
2023-03-14 00:26:44 +03:00
const ArtSlotInfo * getSlot ( const ArtifactPosition & pos ) const ;
const CArtifactInstance * getArt ( const ArtifactPosition & pos , bool excludeLocked = true ) const ; //nullptr - no artifact
CArtifactInstance * getArt ( const ArtifactPosition & pos , bool excludeLocked = true ) ; //nullptr - no artifact
2016-01-22 12:53:01 +03:00
/// 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)
2023-03-14 00:26:44 +03:00
ArtifactPosition getArtPos ( const ArtifactID & aid , bool onlyWorn = true , bool allowLocked = true ) const ;
2013-02-12 19:49:40 +00:00
ArtifactPosition getArtPos ( const CArtifactInstance * art ) const ;
2023-03-14 00:26:44 +03:00
std : : vector < ArtifactPosition > getAllArtPositions ( const ArtifactID & aid , bool onlyWorn , bool allowLocked , bool getAll ) const ;
std : : vector < ArtifactPosition > getBackpackArtPositions ( const ArtifactID & aid ) const ;
const CArtifactInstance * getArtByInstanceId ( const ArtifactInstanceID & artInstId ) const ;
2023-04-23 14:48:04 +03:00
const ArtifactPosition getSlotByInstance ( const CArtifactInstance * artInst ) const ;
2016-01-22 12:53:01 +03:00
/// Search for constituents of assemblies in backpack which do not have an ArtifactPosition
2023-03-14 00:26:44 +03:00
const CArtifactInstance * getHiddenArt ( const ArtifactID & aid ) const ;
2023-06-18 15:21:35 +03:00
const CArtifactInstance * getAssemblyByConstituent ( const ArtifactID & aid ) const ;
2016-01-22 12:53:01 +03:00
/// Checks if hero possess artifact of given id (either in backack or worn)
2023-03-14 00:26:44 +03:00
bool hasArt ( const ArtifactID & aid , bool onlyWorn = false , bool searchBackpackAssemblies = false , bool allowLocked = true ) const ;
bool hasArtBackpack ( const ArtifactID & aid ) const ;
bool isPositionFree ( const ArtifactPosition & pos , bool onlyLockCheck = false ) const ;
unsigned getArtPosCount ( const ArtifactID & aid , bool onlyWorn = true , bool searchBackpackAssemblies = true , bool allowLocked = true ) const ;
2011-06-24 17:43:02 +00:00
2013-02-07 17:34:50 +00:00
virtual ArtBearer : : ArtBearer bearerType ( ) const = 0 ;
2023-07-24 19:09:17 +03:00
virtual ArtPlacementMap putArtifact ( ArtifactPosition slot , CArtifactInstance * art ) ;
2023-05-23 20:24:55 +03:00
virtual void removeArtifact ( ArtifactPosition slot ) ;
2016-11-13 13:38:42 +03:00
virtual ~ CArtifactSet ( ) ;
2011-06-24 17:43:02 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2017-07-31 16:35:42 +03:00
h & artifactsInBackpack ;
h & artifactsWorn ;
2011-06-24 17:43:02 +00:00
}
2013-01-21 18:27:00 +00:00
2012-04-14 02:20:22 +00:00
void artDeserializationFix ( CBonusSystemNode * node ) ;
2016-01-24 02:27:14 +03:00
2016-11-13 13:38:42 +03:00
void serializeJsonArtifacts ( JsonSerializeFormat & handler , const std : : string & fieldName , CMap * map ) ;
2016-01-24 02:27:14 +03:00
protected :
2023-06-18 15:21:35 +03:00
std : : pair < const CArtifactInstance * , const CArtifactInstance * > searchForConstituent ( const ArtifactID & aid ) const ;
2016-01-24 15:39:41 +03:00
2016-11-13 13:38:42 +03:00
private :
void serializeJsonHero ( JsonSerializeFormat & handler , CMap * map ) ;
void serializeJsonCreature ( JsonSerializeFormat & handler , CMap * map ) ;
void serializeJsonCommander ( JsonSerializeFormat & handler , CMap * map ) ;
void serializeJsonSlot ( JsonSerializeFormat & handler , const ArtifactPosition & slot , CMap * map ) ; //normal slots
2011-08-13 10:54:23 +00:00
} ;
2022-07-26 16:07:42 +03:00
2022-11-06 23:29:22 +02:00
// Used to try on artifacts before the claimed changes have been applied
class DLL_LINKAGE CArtifactFittingSet : public CArtifactSet
{
public :
CArtifactFittingSet ( ArtBearer : : ArtBearer Bearer ) ;
ArtBearer : : ArtBearer bearerType ( ) const override ;
protected :
ArtBearer : : ArtBearer Bearer ;
} ;
2022-07-26 16:07:42 +03:00
VCMI_LIB_NAMESPACE_END