2011-12-13 21:23:17 +00:00
# pragma once
2010-04-02 02:23:22 +00:00
2010-05-02 18:20:26 +00:00
# include "HeroBonus.h"
2011-12-13 21:23:17 +00:00
# include "GameConstants.h"
2012-01-30 16:07:52 +00:00
# include "CArtHandler.h"
2010-04-02 02:23:22 +00:00
2012-12-19 14:54:10 +00:00
/*
* CCreatureSet . 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
*
*/
2016-01-15 20:24:17 +03:00
class JsonNode ;
2010-04-02 02:23:22 +00:00
class CCreature ;
class CGHeroInstance ;
2010-05-02 18:20:26 +00:00
class CArmedInstance ;
2012-01-30 16:07:52 +00:00
class CCreatureArtifactSet ;
2016-02-22 02:37:19 +03:00
class JsonSerializeFormat ;
2010-04-02 02:23:22 +00:00
2011-12-13 21:23:17 +00:00
class DLL_LINKAGE CStackBasicDescriptor
2010-11-22 00:34:46 +00:00
{
public :
const CCreature * type ;
TQuantity count ;
2010-05-02 18:20:26 +00:00
2010-11-22 00:34:46 +00:00
CStackBasicDescriptor ( ) ;
2013-02-10 23:24:57 +00:00
CStackBasicDescriptor ( CreatureID id , TQuantity Count ) ;
2010-12-05 23:10:02 +00:00
CStackBasicDescriptor ( const CCreature * c , TQuantity Count ) ;
2010-11-22 00:34:46 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & type & count ;
}
2016-01-15 20:24:17 +03:00
void writeJson ( JsonNode & json ) const ;
void readJson ( const JsonNode & json ) ;
2010-11-22 00:34:46 +00:00
} ;
2012-04-14 02:20:22 +00:00
class DLL_LINKAGE CStackInstance : public CBonusSystemNode , public CStackBasicDescriptor , public CArtifactSet
2010-04-02 02:23:22 +00:00
{
2012-04-22 17:38:36 +00:00
protected :
2010-11-27 01:46:19 +00:00
const CArmedInstance * _armyObj ; //stack must be part of some army, army must be part of some object
2010-04-02 02:23:22 +00:00
public :
2014-02-09 12:10:02 +00:00
// hlp variable used during loading map, when object (hero or town) have creatures that must have same alignment.
// idRand < 0 -> normal, non-random creature
// idRand / 2 -> level
// idRand % 2 -> upgrade number
int idRand ;
2010-05-02 18:20:26 +00:00
2010-11-27 01:46:19 +00:00
const CArmedInstance * const & armyObj ; //stack must be part of some army, army must be part of some object
2012-09-23 18:01:04 +00:00
TExpType experience ; //commander needs same amount of exp as hero
2010-04-02 02:23:22 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2010-05-02 18:20:26 +00:00
h & static_cast < CBonusSystemNode & > ( * this ) ;
2010-11-22 00:34:46 +00:00
h & static_cast < CStackBasicDescriptor & > ( * this ) ;
2012-04-14 02:20:22 +00:00
h & static_cast < CArtifactSet & > ( * this ) ;
2010-11-27 01:46:19 +00:00
h & _armyObj & experience ;
2011-02-22 09:47:25 +00:00
BONUS_TREE_DESERIALIZATION_FIX
2010-04-02 02:23:22 +00:00
}
2016-01-15 20:24:17 +03:00
void writeJson ( JsonNode & json ) const ;
void readJson ( const JsonNode & json ) ;
2010-05-02 18:20:26 +00:00
//overrides CBonusSystemNode
2013-06-17 15:45:55 +00:00
std : : string bonusToString ( const Bonus * bonus , bool description ) const override ; // how would bonus description look for this particular type of node
std : : string bonusToGraphics ( const Bonus * bonus ) const ; //file name of graphics from StackSkills , in future possibly others
2010-05-02 18:20:26 +00:00
2012-04-04 17:41:55 +00:00
virtual ui64 getPower ( ) const ;
2010-04-02 02:23:22 +00:00
int getQuantityID ( ) const ;
2010-07-31 00:26:34 +00:00
std : : string getQuantityTXT ( bool capitalized = true ) const ;
2012-04-04 17:41:55 +00:00
virtual int getExpRank ( ) const ;
2013-03-30 20:09:50 +00:00
virtual int getLevel ( ) const ; //different for regular stack and commander
2015-10-12 16:47:10 +03:00
si32 magicResistance ( ) const override ;
2013-02-10 23:24:57 +00:00
CreatureID getCreatureID ( ) const ; //-1 if not available
2011-10-22 07:05:57 +00:00
std : : string getName ( ) const ; //plural or singular
2012-04-22 17:38:36 +00:00
virtual void init ( ) ;
2010-04-02 02:23:22 +00:00
CStackInstance ( ) ;
2013-02-10 23:24:57 +00:00
CStackInstance ( CreatureID id , TQuantity count ) ;
2010-04-02 02:23:22 +00:00
CStackInstance ( const CCreature * cre , TQuantity count ) ;
2010-12-05 23:10:02 +00:00
~ CStackInstance ( ) ;
2013-02-10 23:24:57 +00:00
void setType ( CreatureID creID ) ;
2010-11-27 01:46:19 +00:00
void setType ( const CCreature * c ) ;
2010-11-22 00:34:46 +00:00
void setArmyObj ( const CArmedInstance * ArmyObj ) ;
2012-09-23 18:01:04 +00:00
virtual void giveStackExp ( TExpType exp ) ;
2010-11-27 01:46:19 +00:00
bool valid ( bool allowUnrandomized ) const ;
2013-06-26 11:18:27 +00:00
ArtBearer : : ArtBearer bearerType ( ) const override ; //from CArtifactSet
virtual std : : string nodeName ( ) const override ; //from CBonusSystemnode
2011-02-04 14:58:14 +00:00
void deserializationFix ( ) ;
2010-04-02 02:23:22 +00:00
} ;
2012-04-04 17:41:55 +00:00
class DLL_LINKAGE CCommanderInstance : public CStackInstance
{
2012-04-22 17:38:36 +00:00
public :
2012-04-04 17:41:55 +00:00
//TODO: what if Commander is not a part of creature set?
//commander class is determined by its base creature
ui8 alive ;
2012-05-18 14:02:27 +00:00
ui8 level ; //required only to count callbacks
2012-04-04 17:41:55 +00:00
std : : string name ; // each Commander has different name
2012-05-18 14:02:27 +00:00
std : : vector < ui8 > secondarySkills ; //ID -> level
2012-05-18 19:44:15 +00:00
std : : set < ui8 > specialSKills ;
2012-04-04 17:41:55 +00:00
//std::vector <CArtifactInstance *> arts;
2013-06-26 11:18:27 +00:00
void init ( ) override ;
2012-04-22 17:38:36 +00:00
CCommanderInstance ( ) ;
2013-02-10 23:24:57 +00:00
CCommanderInstance ( CreatureID id ) ;
2012-04-22 17:38:36 +00:00
~ CCommanderInstance ( ) ;
2012-05-01 08:52:22 +00:00
void setAlive ( bool alive ) ;
2015-10-12 16:47:10 +03:00
void giveStackExp ( TExpType exp ) override ;
2012-05-07 12:54:22 +00:00
void levelUp ( ) ;
2012-04-04 17:41:55 +00:00
2013-04-20 11:34:01 +00:00
bool gainsLevel ( ) const ; //true if commander has lower level than should upon his experience
2015-10-12 16:47:10 +03:00
ui64 getPower ( ) const override { return 0 ; } ;
int getExpRank ( ) const override ;
2016-01-15 20:24:17 +03:00
int getLevel ( ) const override ;
2013-06-26 11:18:27 +00:00
ArtBearer : : ArtBearer bearerType ( ) const override ; //from CArtifactSet
2012-04-04 17:41:55 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & static_cast < CStackInstance & > ( * this ) ;
2012-05-18 19:44:15 +00:00
h & alive & level & name & secondarySkills & specialSKills ;
2012-04-04 17:41:55 +00:00
}
} ;
2011-12-13 21:23:17 +00:00
DLL_LINKAGE std : : ostream & operator < < ( std : : ostream & str , const CStackInstance & sth ) ;
2010-04-02 02:23:22 +00:00
2013-02-16 14:03:47 +00:00
typedef std : : map < SlotID , CStackInstance * > TSlots ;
typedef std : : map < SlotID , CStackBasicDescriptor > TSimpleSlots ;
2010-04-02 02:23:22 +00:00
2011-01-28 02:11:58 +00:00
class IArmyDescriptor
{
public :
virtual void clear ( ) = 0 ;
2013-02-16 14:03:47 +00:00
virtual bool setCreature ( SlotID slot , CreatureID cre , TQuantity count ) = 0 ;
2011-01-28 02:11:58 +00:00
} ;
//simplified version of CCreatureSet
2011-12-13 21:23:17 +00:00
class DLL_LINKAGE CSimpleArmy : public IArmyDescriptor
2011-01-28 02:11:58 +00:00
{
public :
TSimpleSlots army ;
2013-06-26 11:18:27 +00:00
void clear ( ) override ;
bool setCreature ( SlotID slot , CreatureID cre , TQuantity count ) override ;
2011-01-28 02:11:58 +00:00
operator bool ( ) const ;
2010-05-02 18:20:26 +00:00
2011-01-28 02:11:58 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
h & army ;
}
} ;
2010-05-02 18:20:26 +00:00
2011-12-13 21:23:17 +00:00
class DLL_LINKAGE CCreatureSet : public IArmyDescriptor //seven combined creatures
2010-04-02 02:23:22 +00:00
{
2012-09-15 19:16:16 +00:00
CCreatureSet ( const CCreatureSet & ) ;
2010-12-05 23:10:02 +00:00
CCreatureSet & operator = ( const CCreatureSet & ) ;
2010-04-02 02:23:22 +00:00
public :
2011-01-21 02:36:30 +00:00
TSlots stacks ; //slots[slot_id]->> pair(creature_id,creature_quantity)
2010-04-02 02:23:22 +00:00
ui8 formation ; //false - wide, true - tight
2010-11-27 01:46:19 +00:00
CCreatureSet ( ) ;
virtual ~ CCreatureSet ( ) ;
2011-02-04 14:58:14 +00:00
virtual void armyChanged ( ) ;
2010-11-27 01:46:19 +00:00
2013-02-16 14:03:47 +00:00
const CStackInstance & operator [ ] ( SlotID slot ) const ;
2010-04-02 02:23:22 +00:00
2011-01-21 02:36:30 +00:00
const TSlots & Slots ( ) const { return stacks ; }
2010-04-02 02:23:22 +00:00
2013-02-16 14:03:47 +00:00
void addToSlot ( SlotID slot , CreatureID cre , TQuantity count , bool allowMerging = true ) ; //Adds stack to slot. Slot must be empty or with same type creature
void addToSlot ( SlotID slot , CStackInstance * stack , bool allowMerging = true ) ; //Adds stack to slot. Slot must be empty or with same type creature
2013-04-21 16:38:31 +00:00
void clear ( ) override ;
2010-05-02 18:20:26 +00:00
void setFormation ( bool tight ) ;
2010-11-27 01:46:19 +00:00
CArmedInstance * castToArmyObj ( ) ;
//basic operations
2013-02-16 14:03:47 +00:00
void putStack ( SlotID slot , CStackInstance * stack ) ; //adds new stack to the army, slot must be empty
void setStackCount ( SlotID slot , TQuantity count ) ; //stack must exist!
CStackInstance * detachStack ( SlotID slot ) ; //removes stack from army but doesn't destroy it (so it can be moved somewhere else or safely deleted)
void setStackType ( SlotID slot , const CCreature * type ) ;
2012-09-23 18:01:04 +00:00
void giveStackExp ( TExpType exp ) ;
2013-02-16 14:03:47 +00:00
void setStackExp ( SlotID slot , TExpType exp ) ;
2010-11-27 01:46:19 +00:00
2012-09-15 19:16:16 +00:00
//derivative
2013-02-16 14:03:47 +00:00
void eraseStack ( SlotID slot ) ; //slot must be occupied
void joinStack ( SlotID slot , CStackInstance * stack ) ; //adds new stack to the existing stack of the same type
void changeStackCount ( SlotID slot , TQuantity toAdd ) ; //stack must exist!
2013-04-21 16:38:31 +00:00
bool setCreature ( SlotID slot , CreatureID type , TQuantity quantity ) override ; //replaces creature in stack; slots 0 to 6, if quantity=0 erases stack
2011-01-28 02:11:58 +00:00
void setToArmy ( CSimpleArmy & src ) ; //erases all our army and moves stacks from src to us; src MUST NOT be an armed object! WARNING: use it wisely. Or better do not use at all.
2012-09-15 19:16:16 +00:00
2013-02-16 14:03:47 +00:00
const CStackInstance & getStack ( SlotID slot ) const ; //stack must exist
2013-06-26 11:18:27 +00:00
const CStackInstance * getStackPtr ( SlotID slot ) const ; //if stack doesn't exist, returns nullptr
2013-02-16 14:03:47 +00:00
const CCreature * getCreature ( SlotID slot ) const ; //workaround of map issue;
int getStackCount ( SlotID slot ) const ;
TExpType getStackExperience ( SlotID slot ) const ;
SlotID findStack ( const CStackInstance * stack ) const ; //-1 if none
SlotID getSlotFor ( CreatureID creature , ui32 slotsAmount = GameConstants : : ARMY_SIZE ) const ; //returns -1 if no slot available
SlotID getSlotFor ( const CCreature * c , ui32 slotsAmount = GameConstants : : ARMY_SIZE ) const ; //returns -1 if no slot available
SlotID getFreeSlot ( ui32 slotsAmount = GameConstants : : ARMY_SIZE ) const ;
bool mergableStacks ( std : : pair < SlotID , SlotID > & out , SlotID preferable = SlotID ( ) ) const ; //looks for two same stacks, returns slot positions;
2010-04-02 02:23:22 +00:00
bool validTypes ( bool allowUnrandomized = false ) const ; //checks if all types of creatures are set properly
2013-02-16 14:03:47 +00:00
bool slotEmpty ( SlotID slot ) const ;
2010-05-02 18:20:26 +00:00
int stacksCount ( ) const ;
virtual bool needsLastStack ( ) const ; //true if last stack cannot be taken
2011-06-21 09:31:08 +00:00
ui64 getArmyStrength ( ) const ; //sum of AI values of creatures
2013-02-16 14:03:47 +00:00
ui64 getPower ( SlotID slot ) const ; //value of specific stack
2015-12-24 21:03:51 +03:00
std : : string getRoughAmount ( SlotID slot , int mode = 0 ) const ; //rough size of specific stack
std : : string getArmyDescription ( ) const ;
2013-02-16 14:03:47 +00:00
bool hasStackAtSlot ( SlotID slot ) const ;
2012-09-15 19:16:16 +00:00
2010-05-02 18:20:26 +00:00
bool contains ( const CStackInstance * stack ) const ;
2010-12-12 23:44:16 +00:00
bool canBeMergedWith ( const CCreatureSet & cs , bool allowMergingStacks = true ) const ;
2010-11-22 00:34:46 +00:00
2010-04-02 02:23:22 +00:00
template < typename Handler > void serialize ( Handler & h , const int version )
{
2011-01-21 02:36:30 +00:00
h & stacks & formation ;
2010-04-02 02:23:22 +00:00
}
2016-01-15 20:24:17 +03:00
2016-02-22 02:37:19 +03:00
void serializeJson ( JsonSerializeFormat & handler , const std : : string & fieldName ) ;
2016-01-15 20:24:17 +03:00
2010-04-02 02:23:22 +00:00
operator bool ( ) const
{
2013-11-03 12:51:25 +00:00
return ! stacks . empty ( ) ;
2010-04-02 02:23:22 +00:00
}
void sweep ( ) ;
} ;