1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

* proper bool serialization

* refactoring towards more enums/typedefs
This commit is contained in:
mateuszb 2013-02-02 19:28:39 +00:00
parent 96ec6e71a4
commit ba3075317f
12 changed files with 96 additions and 53 deletions

View File

@ -374,7 +374,7 @@ BattleInfo * BattleInfo::setupBattle( int3 tile, int terrain, int battlefieldTyp
else
{
curB->town = NULL;
curB->siege = 0;
curB->siege = CGTownInstance::NONE;
curB->terrainType = terrain;
}
@ -566,13 +566,13 @@ BattleInfo * BattleInfo::setupBattle( int3 tile, int terrain, int battlefieldTyp
}
if (curB->siege == 2 || curB->siege == 3)
if (curB->siege == CGTownInstance::CITADEL || curB->siege == CGTownInstance::CASTLE)
{
// keep tower
CStack * stack = curB->generateNewStack(CStackBasicDescriptor(149, 1), false, 255, -2);
stacks.push_back(stack);
if (curB->siege == 3)
if (curB->siege == CGTownInstance::CASTLE)
{
// lower tower + upper tower
CStack * stack = curB->generateNewStack(CStackBasicDescriptor(149, 1), false, 255, -4);

View File

@ -47,7 +47,7 @@ struct DLL_LINKAGE BattleInfo : public CBonusSystemNode, public CBattleInfoCallb
{
ui8 sides[2]; //sides[0] - attacker, sides[1] - defender
si32 round, activeStack, selectedStack;
ui8 siege; // = 0 ordinary battle = 1 a siege with a Fort = 2 a siege with a Citadel = 3 a siege with a Castle
CGTownInstance::EFortLevel siege;
const CGTownInstance * town; //used during town siege - id of attacked town; -1 if not town defence
int3 tile; //for background and bonuses
CGHeroInstance* heroes[2];
@ -60,7 +60,7 @@ struct DLL_LINKAGE BattleInfo : public CBonusSystemNode, public CBattleInfoCallb
SiegeInfo si;
si32 battlefieldType; //like !!BA:B
ui8 terrainType; //used for some stack nativity checks (not the bonus limiters though that have their own copy)
int terrainType; //used for some stack nativity checks (not the bonus limiters though that have their own copy)
ui8 tacticsSide; //which side is requested to play tactics phase
ui8 tacticDistance; //how many hexes we can go forward (1 = only hexes adjacent to margin line)

View File

@ -405,7 +405,7 @@ bool CBattleInfoEssentials::battleHasHero(ui8 side) const
ui8 CBattleInfoEssentials::battleGetWallState(int partOfWall) const
{
RETURN_IF_NOT_BATTLE(0);
if(getBattle()->siege == 0)
if(getBattle()->siege == CGTownInstance::NONE)
return 0;
assert(partOfWall >= 0 && partOfWall < EWallParts::PARTS_COUNT);

View File

@ -1020,7 +1020,7 @@ void CCommanderInstance::init()
type = NULL;
idRand = -1;
_armyObj = NULL;
setNodeType (Bonus::COMMANDER);
setNodeType (CBonusSystemNode::COMMANDER);
secondarySkills.resize (ECommander::SPELL_POWER + 1);
}

View File

@ -131,7 +131,7 @@ void CPlayersVisited::setPropertyDer( ui8 what, ui32 val )
players.insert((ui8)val);
}
bool CPlayersVisited::wasVisited( ui8 player ) const
bool CPlayersVisited::wasVisited( TPlayerColor player ) const
{
return vstd::contains(players,player);
}
@ -3552,7 +3552,7 @@ void CGVisitableOPW::newTurn() const
cb->setHoverName(id,&ms);
}
}
bool CGVisitableOPW::wasVisited(ui8 player) const
bool CGVisitableOPW::wasVisited(TPlayerColor player) const
{
return visited; //TODO: other players should see object as unvisited
}
@ -6268,7 +6268,7 @@ void CGKeys::setPropertyDer (ui8 what, ui32 val) //101-108 - enable key for play
playerKeyMap.find(what-101)->second.insert((ui8)val);
}
bool CGKeys::wasMyColorVisited (int player) const
bool CGKeys::wasMyColorVisited (TPlayerColor player) const
{
if (vstd::contains(playerKeyMap[player], subID)) //creates set if it's not there
return true;
@ -6291,7 +6291,7 @@ const std::string CGKeys::getName() const
return name;
}
bool CGKeymasterTent::wasVisited (ui8 player) const
bool CGKeymasterTent::wasVisited (TPlayerColor player) const
{
return wasMyColorVisited (player);
}

View File

@ -55,7 +55,7 @@ public:
MISSION_ART = 5, MISSION_ARMY = 6, MISSION_RESOURCES = 7, MISSION_HERO = 8, MISSION_PLAYER = 9, MISSION_KEYMASTER = 10};
enum Eprogress {NOT_ACTIVE, IN_PROGRESS, COMPLETE};
si32 qid; //unique quets id for serialization / identification
si32 qid; //unique quest id for serialization / identification
Emission missionType;
Eprogress progress;
@ -172,8 +172,8 @@ public:
CGDefInfo * defInfo;
ui8 animPhaseShift;
ui8 tempOwner;
ui8 blockVisit; //if non-zero then blocks the tile but is visitable from neighbouring tile
TPlayerColor tempOwner;
bool blockVisit; //if non-zero then blocks the tile but is visitable from neighbouring tile
virtual ui8 getPassableness() const; //bitmap - if the bit is set the corresponding player can pass through the visitable tiles of object, even if it's blockvis; if not set - default properties from definfo are used
virtual int3 getSightCenter() const; //"center" tile from which the sight distance is calculated
@ -234,9 +234,9 @@ public:
class DLL_LINKAGE CPlayersVisited: public CGObjectInstance
{
public:
std::set<ui8> players; //players that visited this object
std::set<TPlayerColor> players; //players that visited this object
bool wasVisited(ui8 player) const;
bool wasVisited(TPlayerColor player) const;
void setPropertyDer(ui8 what, ui32 val) override;
template <typename Handler> void serialize(Handler &h, const int version)
@ -305,7 +305,7 @@ public:
std::vector<std::pair<ui8,ui8> > secSkills; //first - ID of skill, second - level of skill (1 - basic, 2 - adv., 3 - expert); if hero has ability (-1, -1) it meansthat it should have default secondary abilities
ui32 movement; //remaining movement points
ui8 sex;
ui8 inTownGarrison; // if hero is in town garrison
bool inTownGarrison; // if hero is in town garrison
ConstTransitivePtr<CGTownInstance> visitedTown; //set if hero is visiting town or in the town garrison
ConstTransitivePtr<CCommanderInstance> commander;
const CGBoat *boat; //set to CGBoat when sailing
@ -319,7 +319,7 @@ public:
struct DLL_LINKAGE Patrol
{
Patrol(){patrolling=false;patrolRadious=-1;};
ui8 patrolling;
bool patrolling;
ui32 patrolRadious;
template <typename Handler> void serialize(Handler &h, const int version)
{
@ -329,7 +329,7 @@ public:
struct DLL_LINKAGE HeroSpecial : CBonusSystemNode
{
ui8 growsWithLevel;
bool growsWithLevel;
HeroSpecial(){growsWithLevel = false;};
@ -714,10 +714,10 @@ private:
class DLL_LINKAGE CGEvent : public CGPandoraBox //event objects
{
public:
ui8 removeAfterVisit; //true if event is removed after occurring
bool removeAfterVisit; //true if event is removed after occurring
ui8 availableFor; //players whom this event is available for
ui8 computerActivate; //true if computre player can activate this event
ui8 humanActivate; //true if human player can activate this event
bool computerActivate; //true if computer player can activate this event
bool humanActivate; //true if human player can activate this event
template <typename Handler> void serialize(Handler &h, const int version)
{
@ -738,8 +738,8 @@ public:
std::string message; //message printed for attacking hero
std::vector<ui32> resources; //[res_id], resources given to hero that has won with monsters
TArtifactID gainedArtifact; //ID of artifact gained to hero, -1 if none
ui8 neverFlees; //if true, the troops will never flee
ui8 notGrowingTeam; //if true, number of units won't grow
bool neverFlees; //if true, the troops will never flee
bool notGrowingTeam; //if true, number of units won't grow
ui64 temppower; //used to handle fractional stack growth for tiny stacks
@ -891,7 +891,7 @@ public:
class DLL_LINKAGE CGGarrison : public CArmedInstance
{
public:
ui8 removableUnits;
bool removableUnits;
ui8 getPassableness() const;
void onHeroVisit(const CGHeroInstance * h) const override;
@ -1002,7 +1002,7 @@ class DLL_LINKAGE CGVisitableOPW : public CGObjectInstance //objects visitable O
public:
ui8 visited; //true if object has been visited this week
bool wasVisited(ui8 player) const;
bool wasVisited(TPlayerColor player) const;
void onHeroVisit(const CGHeroInstance * h) const override;
void newTurn() const override;
@ -1046,7 +1046,7 @@ public:
};
class DLL_LINKAGE CGMagicSpring : public CGVisitableOPW
{///unfortunatelly, this one is quite different than others
{///unfortunately, this one is quite different than others
public:
void onHeroVisit(const CGHeroInstance * h) const override;
const std::string & getHoverText() const override;
@ -1098,11 +1098,11 @@ public:
class DLL_LINKAGE CGKeys : public CGObjectInstance //Base class for Keymaster and guards
{
public:
static std::map <ui8, std::set <ui8> > playerKeyMap; //[players][keysowned]
static std::map <TPlayerColor, std::set <ui8> > playerKeyMap; //[players][keysowned]
//SubID 0 - lightblue, 1 - green, 2 - red, 3 - darkblue, 4 - brown, 5 - purple, 6 - white, 7 - black
const std::string getName() const; //depending on color
bool wasMyColorVisited (int player) const;
bool wasMyColorVisited (TPlayerColor player) const;
const std::string & getHoverText() const override;
@ -1117,7 +1117,7 @@ protected:
class DLL_LINKAGE CGKeymasterTent : public CGKeys
{
public:
bool wasVisited (ui8 player) const;
bool wasVisited (TPlayerColor player) const;
void onHeroVisit(const CGHeroInstance * h) const override;
template <typename Handler> void serialize(Handler &h, const int version)

View File

@ -530,7 +530,7 @@ void CTownHandler::load(const JsonNode &source)
if (alignment == -1)
faction.alignment = EAlignment::NEUTRAL;
else
faction.alignment = alignment;
faction.alignment = static_cast<EAlignment::EAlignment>(alignment);
if (!node.second["town"].isNull())
{

View File

@ -174,7 +174,7 @@ public:
TFaction factionID;
ui8 nativeTerrain;
ui8 alignment; // uses EAlignment enum
EAlignment::EAlignment alignment;
TCreature commander;

View File

@ -34,7 +34,7 @@
#include "CObjectHandler.h" //for CArmedInstance
#include "Mapping/CCampaignHandler.h" //for CCampaignState
const ui32 version = 734;
const ui32 version = 735;
const TSlot COMMANDER_SLOT_PLACEHOLDER = -2;
class CConnection;
@ -72,6 +72,7 @@ namespace boost
enum SerializationLvl
{
Wrong=0,
Boolean,
Primitive,
Array,
Pointer,
@ -118,6 +119,23 @@ public:
extern DLL_LINKAGE CTypeList typeList;
template<typename Ser>
struct SaveBoolean
{
static void invoke(Ser &s, const bool &data)
{
s.saveBoolean(data);
}
};
template<typename Ser>
struct LoadBoolean
{
static void invoke(Ser &s, bool &data)
{
s.loadBoolean(data);
}
};
template<typename Ser,typename T>
struct SavePrimitive
{
@ -222,6 +240,10 @@ struct SerializationLevel
{
typedef mpl::integral_c_tag tag;
typedef
typename mpl::eval_if<
boost::is_same<T, bool>,
mpl::int_<Boolean>,
//else
typename mpl::eval_if<
boost::is_fundamental<T>,
mpl::int_<Primitive>,
@ -252,6 +274,7 @@ struct SerializationLevel
>
>
>
>
>::type type;
static const int value = SerializationLevel::type::value;
};
@ -406,7 +429,7 @@ struct SaveIfStackInstance<Ser, CStackInstance *>
assert(data->armyObj);
TSlot slot = -1;
if(data->getNodeType() == Bonus::COMMANDER)
if(data->getNodeType() == CBonusSystemNode::COMMANDER)
slot = COMMANDER_SLOT_PLACEHOLDER;
else
slot = data->armyObj->findStack(data);
@ -582,6 +605,9 @@ public:
{
typedef
//if
typename mpl::eval_if< mpl::equal_to<SerializationLevel<T>,mpl::int_<Boolean> >,
mpl::identity<SaveBoolean<Serializer> >,
//else if
typename mpl::eval_if< mpl::equal_to<SerializationLevel<T>,mpl::int_<Primitive> >,
mpl::identity<SavePrimitive<Serializer,T> >,
//else if
@ -602,6 +628,7 @@ public:
>
>
>
>
>::type typex;
typex::invoke(* this->This(), data);
}
@ -689,6 +716,11 @@ public:
si32 writ = static_cast<si32>(data);
*this << writ;
}
void saveBoolean(const bool & data)
{
ui8 writ = static_cast<ui8>(data);
*this << writ;
}
};
@ -778,6 +810,9 @@ public:
{
typedef
//if
typename mpl::eval_if< mpl::equal_to<SerializationLevel<T>,mpl::int_<Boolean> >,
mpl::identity<LoadBoolean<Serializer> >,
//else if
typename mpl::eval_if< mpl::equal_to<SerializationLevel<T>,mpl::int_<Primitive> >,
mpl::identity<LoadPrimitive<Serializer,T> >,
//else if
@ -798,6 +833,7 @@ public:
>
>
>
>
>::type typex;
typex::invoke(* this->This(), data);
}
@ -1049,6 +1085,12 @@ public:
*this >> read;
data = static_cast<E>(read);
}
void loadBoolean(bool &data)
{
ui8 read;
*this >> read;
data = static_cast<bool>(read);
}
};
class DLL_LINKAGE CSaveFile

View File

@ -970,7 +970,7 @@ void CBonusSystemNode::exportBonuses()
exportBonus(b);
}
ui8 CBonusSystemNode::getNodeType() const
CBonusSystemNode::ENodeTypes CBonusSystemNode::getNodeType() const
{
return nodeType;
}
@ -995,7 +995,7 @@ const TNodesVector& CBonusSystemNode::getChildrenNodes() const
return children;
}
void CBonusSystemNode::setNodeType(ui8 type)
void CBonusSystemNode::setNodeType(CBonusSystemNode::ENodeTypes type)
{
nodeType = type;
}
@ -1345,7 +1345,7 @@ int CCreatureTypeLimiter::limit(const BonusLimitationContext &context) const
//drop bonus if it's not our creature and (we dont check upgrades or its not our upgrade)
}
CCreatureTypeLimiter::CCreatureTypeLimiter(const CCreature &Creature, ui8 IncludeUpgrades /*= true*/)
CCreatureTypeLimiter::CCreatureTypeLimiter(const CCreature &Creature, bool IncludeUpgrades /*= true*/)
:creature(&Creature), includeUpgrades(IncludeUpgrades)
{
}
@ -1411,7 +1411,7 @@ CPropagatorNodeType::CPropagatorNodeType()
}
CPropagatorNodeType::CPropagatorNodeType(ui8 NodeType)
CPropagatorNodeType::CPropagatorNodeType(int NodeType)
: nodeType(NodeType)
{
}

View File

@ -467,10 +467,10 @@ public:
class DLL_LINKAGE CPropagatorNodeType : public IPropagator
{
ui8 nodeType;
int nodeType; //CBonusSystemNode::ENodeTypes
public:
CPropagatorNodeType();
CPropagatorNodeType(ui8 NodeType);
CPropagatorNodeType(int NodeType);
bool shouldBeAttached(CBonusSystemNode *dest);
//CBonusSystemNode *getDestNode(CBonusSystemNode *source, CBonusSystemNode *redParent, CBonusSystemNode *redChild) OVERRIDE;
@ -547,6 +547,12 @@ public:
class DLL_LINKAGE CBonusSystemNode : public IBonusBearer
{
public:
enum ENodeTypes
{
UNKNOWN, STACK_INSTANCE, STACK_BATTLE, specialty, ARTIFACT, CREATURE, ARTIFACT_INSTANCE, HERO, PLAYER, TEAM,
TOWN_AND_VISITOR, BATTLE, COMMANDER
};
private:
BonusList bonuses; //wielded bonuses (local or up-propagated here)
BonusList exportedBonuses; //bonuses coming from this node (wielded or propagated away)
@ -554,7 +560,7 @@ private:
TNodesVector parents; //parents -> we inherit bonuses from them, we may attach our bonuses to them
TNodesVector children;
ui8 nodeType;
ENodeTypes nodeType;
std::string description;
static const bool cachingEnabled;
@ -622,8 +628,8 @@ public:
BonusList &getBonusList();
const BonusList &getBonusList() const;
BonusList &getExportedBonusList();
ui8 getNodeType() const;
void setNodeType(ui8 type);
CBonusSystemNode::ENodeTypes getNodeType() const;
void setNodeType(CBonusSystemNode::ENodeTypes type);
const TNodesVector &getParentNodes() const;
const TNodesVector &getChildrenNodes() const;
const std::string &getDescription() const;
@ -639,11 +645,6 @@ public:
BONUS_TREE_DESERIALIZATION_FIX
//h & parents & children;
}
enum ENodeTypes
{
UNKNOWN, STACK_INSTANCE, STACK_BATTLE, specialty, ARTIFACT, CREATURE, ARTIFACT_INSTANCE, HERO, PLAYER, TEAM,
TOWN_AND_VISITOR, BATTLE
};
};
namespace NBonus
@ -761,10 +762,10 @@ class DLL_LINKAGE CCreatureTypeLimiter : public ILimiter //affect only stacks of
{
public:
const CCreature *creature;
ui8 includeUpgrades;
bool includeUpgrades;
CCreatureTypeLimiter();
CCreatureTypeLimiter(const CCreature &Creature, ui8 IncludeUpgrades = true);
CCreatureTypeLimiter(const CCreature &Creature, bool IncludeUpgrades = true);
void setCreature (TCreature id);
int limit(const BonusLimitationContext &context) const OVERRIDE;
@ -781,7 +782,7 @@ class DLL_LINKAGE HasAnotherBonusLimiter : public ILimiter //applies only to nod
public:
TBonusType type;
TBonusSubtype subtype;
ui8 isSubtypeRelevant; //check for subtype only if this is true
bool isSubtypeRelevant; //check for subtype only if this is true
HasAnotherBonusLimiter(TBonusType bonus = Bonus::NONE);
HasAnotherBonusLimiter(TBonusType bonus, TBonusSubtype _subtype);
@ -798,7 +799,7 @@ public:
class DLL_LINKAGE CreatureNativeTerrainLimiter : public ILimiter //applies only to creatures that are on their native terrain
{
public:
si8 terrainType;
int terrainType;
CreatureNativeTerrainLimiter();
CreatureNativeTerrainLimiter(int TerrainType);

View File

@ -1420,7 +1420,7 @@ DLL_LINKAGE void ObstaclesRemoved::applyGs( CGameState *gs )
DLL_LINKAGE void CatapultAttack::applyGs( CGameState *gs )
{
if(gs->curB && gs->curB->siege != 0) //if there is a battle and it's a siege
if(gs->curB && gs->curB->siege != CGTownInstance::NONE) //if there is a battle and it's a siege
{
BOOST_FOREACH(const auto &it,attackedParts)
{