diff --git a/lib/bonuses/BonusCustomTypes.h b/lib/bonuses/BonusCustomTypes.h index 2a2f3df48..a6a2c96e2 100644 --- a/lib/bonuses/BonusCustomTypes.h +++ b/lib/bonuses/BonusCustomTypes.h @@ -13,10 +13,10 @@ VCMI_LIB_NAMESPACE_BEGIN -class DLL_LINKAGE BonusCustomSource : public Identifier +class DLL_LINKAGE BonusCustomSource : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; static std::string encode(int32_t index); static si32 decode(const std::string & identifier); @@ -24,10 +24,10 @@ public: static const BonusCustomSource undeadMoraleDebuff; // -2 }; -class DLL_LINKAGE BonusCustomSubtype : public Identifier +class DLL_LINKAGE BonusCustomSubtype : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; static std::string encode(int32_t index); static si32 decode(const std::string & identifier); diff --git a/lib/constants/EntityIdentifiers.cpp b/lib/constants/EntityIdentifiers.cpp index 32bff064c..121c94827 100644 --- a/lib/constants/EntityIdentifiers.cpp +++ b/lib/constants/EntityIdentifiers.cpp @@ -123,15 +123,16 @@ namespace GameConstants si32 HeroClassID::decode(const std::string & identifier) { - auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeMap(), "heroClass", identifier); - if(rawId) - return rawId.value(); - else + if (identifier.empty()) return -1; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeMap(), "heroClass", identifier); + return rawId.value(); } std::string HeroClassID::encode(const si32 index) { + if (index == -1) + return ""; return VLC->heroClasses()->getByIndex(index)->getJsonKey(); } @@ -162,29 +163,50 @@ std::string CampaignScenarioID::encode(const si32 index) std::string MapObjectID::encode(int32_t index) { + if (index == -1) + return ""; return VLC->objtypeh->getObjectHandlerName(MapObjectID(index)); } si32 MapObjectID::decode(const std::string & identifier) { - auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "objects", identifier); - if(rawId) - return rawId.value(); - else + if (identifier.empty()) return -1; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "objects", identifier); + return rawId.value(); +} + +std::string BoatId::encode(int32_t index) +{ + if (index == -1) + return ""; + return VLC->objtypeh->getObjectHandlerName(MapObjectID(index)); +} + +si32 BoatId::decode(const std::string & identifier) +{ + if (identifier.empty()) + return -1; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "objects", identifier); + return rawId.value(); } si32 HeroTypeID::decode(const std::string & identifier) { - auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeMap(), "hero", identifier); - if(rawId) - return rawId.value(); - else + if (identifier.empty()) return -1; + if (identifier == "random") + return -2; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeMap(), "hero", identifier); + return rawId.value(); } std::string HeroTypeID::encode(const si32 index) { + if (index == -1) + return ""; + if (index == -2) + return "random"; return VLC->heroTypes()->getByIndex(index)->getJsonKey(); } @@ -205,15 +227,16 @@ const Artifact * ArtifactIDBase::toEntity(const Services * services) const si32 ArtifactID::decode(const std::string & identifier) { - auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "artifact", identifier); - if(rawId) - return rawId.value(); - else + if (identifier.empty()) return -1; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "artifact", identifier); + return rawId.value(); } std::string ArtifactID::encode(const si32 index) { + if (index == -1) + return ""; return VLC->artifacts()->getByIndex(index)->getJsonKey(); } @@ -224,15 +247,16 @@ std::string ArtifactID::entityType() si32 SecondarySkill::decode(const std::string& identifier) { - auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "secondarySkill", identifier); - if(rawId) - return rawId.value(); - else + if (identifier.empty()) return -1; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "secondarySkill", identifier); + return rawId.value(); } std::string SecondarySkill::encode(const si32 index) { + if (index == -1) + return ""; return VLC->skills()->getById(SecondarySkill(index))->getJsonKey(); } @@ -263,15 +287,16 @@ const Creature * CreatureIDBase::toEntity(const CreatureService * creatures) con si32 CreatureID::decode(const std::string & identifier) { - auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "creature", identifier); - if(rawId) - return rawId.value(); - else + if (identifier.empty()) return -1; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "creature", identifier); + return rawId.value(); } std::string CreatureID::encode(const si32 index) { + if (index == -1) + return ""; return VLC->creatures()->getById(CreatureID(index))->getJsonKey(); } @@ -312,11 +337,10 @@ const HeroType * HeroTypeID::toEntity(const Services * services) const si32 SpellID::decode(const std::string & identifier) { - auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "spell", identifier); - if(rawId) - return rawId.value(); - else + if (identifier.empty()) return -1; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "spell", identifier); + return rawId.value(); } std::string SpellID::encode(const si32 index) @@ -326,11 +350,10 @@ std::string SpellID::encode(const si32 index) si32 BattleField::decode(const std::string & identifier) { - auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "spell", identifier); - if(rawId) - return rawId.value(); - else + if (identifier.empty()) return -1; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), "spell", identifier); + return rawId.value(); } std::string BattleField::encode(const si32 index) @@ -399,15 +422,17 @@ std::string PrimarySkill::entityType() si32 FactionID::decode(const std::string & identifier) { + if (identifier.empty()) + return -1; + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), entityType(), identifier); - if(rawId) - return rawId.value(); - else - return FactionID::DEFAULT.getNum(); + return rawId.value(); } std::string FactionID::encode(const si32 index) { + if (index == -1) + return ""; return VLC->factions()->getByIndex(index)->getJsonKey(); } @@ -423,15 +448,17 @@ const Faction * FactionID::toEntity(const Services * service) const si32 TerrainId::decode(const std::string & identifier) { - auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), entityType(), identifier); - if(rawId) - return rawId.value(); - else + if (identifier.empty()) return static_cast(TerrainId::NONE); + + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), entityType(), identifier); + return rawId.value(); } std::string TerrainId::encode(const si32 index) { + if (index == TerrainId::NONE) + return ""; return VLC->terrainTypeHandler->getByIndex(index)->getJsonKey(); } @@ -440,6 +467,48 @@ std::string TerrainId::entityType() return "terrain"; } +si32 RoadId::decode(const std::string & identifier) +{ + if (identifier.empty()) + return RoadId::NO_ROAD.getNum(); + + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), entityType(), identifier); + return rawId.value(); +} + +std::string RoadId::encode(const si32 index) +{ + if (index == RoadId::NO_ROAD.getNum()) + return ""; + return VLC->roadTypeHandler->getByIndex(index)->getJsonKey(); +} + +std::string RoadId::entityType() +{ + return "road"; +} + +si32 RiverId::decode(const std::string & identifier) +{ + if (identifier.empty()) + return RiverId::NO_RIVER.getNum(); + + auto rawId = VLC->identifiers()->getIdentifier(ModScope::scopeGame(), entityType(), identifier); + return rawId.value(); +} + +std::string RiverId::encode(const si32 index) +{ + if (index == RiverId::NO_RIVER.getNum()) + return ""; + return VLC->riverTypeHandler->getByIndex(index)->getJsonKey(); +} + +std::string RiverId::entityType() +{ + return "road"; +} + const TerrainType * TerrainId::toEntity(const Services * service) const { return VLC->terrainTypeHandler->getByIndex(num); diff --git a/lib/constants/EntityIdentifiers.h b/lib/constants/EntityIdentifiers.h index 63b3f4373..f9c7466c8 100644 --- a/lib/constants/EntityIdentifiers.h +++ b/lib/constants/EntityIdentifiers.h @@ -43,153 +43,50 @@ class CSkill; class CGameInfoCallback; class CNonConstInfoCallback; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// Note: use template to force different type, blocking any Identifier <=> Identifier comparisons -template -class Identifier : public IdentifierBase +class ArtifactInstanceID : public StaticIdentifier { - using BaseClass = IdentifierBase; public: - constexpr Identifier() - {} - - explicit constexpr Identifier(int32_t value): - IdentifierBase(value) - {} - - constexpr bool operator == (const Identifier & b) const { return BaseClass::num == b.num; } - constexpr bool operator <= (const Identifier & b) const { return BaseClass::num <= b.num; } - constexpr bool operator >= (const Identifier & b) const { return BaseClass::num >= b.num; } - constexpr bool operator != (const Identifier & b) const { return BaseClass::num != b.num; } - constexpr bool operator < (const Identifier & b) const { return BaseClass::num < b.num; } - constexpr bool operator > (const Identifier & b) const { return BaseClass::num > b.num; } - - constexpr FinalClass & operator++() - { - ++BaseClass::num; - return static_cast(*this); - } - - constexpr FinalClass & operator--() - { - --BaseClass::num; - return static_cast(*this); - } - - constexpr FinalClass operator--(int) - { - FinalClass ret(num); - --BaseClass::num; - return ret; - } - - constexpr FinalClass operator++(int) - { - FinalClass ret(num); - ++BaseClass::num; - return ret; - } + using StaticIdentifier::StaticIdentifier; }; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -template -class IdentifierWithEnum : public BaseClass -{ - using EnumType = typename BaseClass::Type; - - static_assert(std::is_same_v, int32_t>, "Entity Identifier must use int32_t"); -public: - constexpr EnumType toEnum() const - { - return static_cast(BaseClass::num); - } - - constexpr IdentifierWithEnum(const EnumType & enumValue) - { - BaseClass::num = static_cast(enumValue); - } - - constexpr IdentifierWithEnum(int32_t _num = -1) - { - BaseClass::num = _num; - } - - constexpr bool operator == (const EnumType & b) const { return BaseClass::num == static_cast(b); } - constexpr bool operator <= (const EnumType & b) const { return BaseClass::num <= static_cast(b); } - constexpr bool operator >= (const EnumType & b) const { return BaseClass::num >= static_cast(b); } - constexpr bool operator != (const EnumType & b) const { return BaseClass::num != static_cast(b); } - constexpr bool operator < (const EnumType & b) const { return BaseClass::num < static_cast(b); } - constexpr bool operator > (const EnumType & b) const { return BaseClass::num > static_cast(b); } - - constexpr bool operator == (const IdentifierWithEnum & b) const { return BaseClass::num == b.num; } - constexpr bool operator <= (const IdentifierWithEnum & b) const { return BaseClass::num <= b.num; } - constexpr bool operator >= (const IdentifierWithEnum & b) const { return BaseClass::num >= b.num; } - constexpr bool operator != (const IdentifierWithEnum & b) const { return BaseClass::num != b.num; } - constexpr bool operator < (const IdentifierWithEnum & b) const { return BaseClass::num < b.num; } - constexpr bool operator > (const IdentifierWithEnum & b) const { return BaseClass::num > b.num; } - - constexpr FinalClass & operator++() - { - ++BaseClass::num; - return static_cast(*this); - } - - constexpr FinalClass operator++(int) - { - FinalClass ret(BaseClass::num); - ++BaseClass::num; - return ret; - } -}; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class ArtifactInstanceID : public Identifier +class QueryID : public StaticIdentifier { public: - using Identifier::Identifier; -}; - -class QueryID : public Identifier -{ -public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; DLL_LINKAGE static const QueryID NONE; DLL_LINKAGE static const QueryID CLIENT; }; -class BattleID : public Identifier +class BattleID : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; DLL_LINKAGE static const BattleID NONE; }; -class DLL_LINKAGE ObjectInstanceID : public Identifier +class DLL_LINKAGE ObjectInstanceID : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; static const ObjectInstanceID NONE; static si32 decode(const std::string & identifier); static std::string encode(const si32 index); }; -class HeroClassID : public Identifier +class HeroClassID : public EntityIdentifier { public: - using Identifier::Identifier; + using EntityIdentifier::EntityIdentifier; ///json serialization helpers DLL_LINKAGE static si32 decode(const std::string & identifier); DLL_LINKAGE static std::string encode(const si32 index); static std::string entityType(); }; -class DLL_LINKAGE HeroTypeID : public Identifier +class DLL_LINKAGE HeroTypeID : public EntityIdentifier { public: - using Identifier::Identifier; + using EntityIdentifier::EntityIdentifier; ///json serialization helpers static si32 decode(const std::string & identifier); static std::string encode(const si32 index); @@ -207,10 +104,10 @@ public: } }; -class SlotID : public Identifier +class SlotID : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; DLL_LINKAGE static const SlotID COMMANDER_SLOT_PLACEHOLDER; DLL_LINKAGE static const SlotID SUMMONED_SLOT_PLACEHOLDER; /// +class DLL_LINKAGE PlayerColor : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; enum EPlayerColor { @@ -249,18 +146,18 @@ public: static std::string entityType(); }; -class TeamID : public Identifier +class TeamID : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; DLL_LINKAGE static const TeamID NO_TEAM; }; -class TeleportChannelID : public Identifier +class TeleportChannelID : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; }; class SecondarySkillBase : public IdentifierBase @@ -302,10 +199,10 @@ public: static_assert(GameConstants::SKILL_QUANTITY == SKILL_SIZE, "Incorrect number of skills"); }; -class SecondarySkill : public IdentifierWithEnum +class DLL_LINKAGE SecondarySkill : public EntityIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using EntityIdentifierWithEnum::EntityIdentifierWithEnum; static std::string entityType(); static si32 decode(const std::string& identifier); static std::string encode(const si32 index); @@ -314,10 +211,10 @@ public: const Skill * toEntity(const Services * services) const; }; -class DLL_LINKAGE PrimarySkill : public Identifier +class DLL_LINKAGE PrimarySkill : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; static const PrimarySkill NONE; static const PrimarySkill ATTACK; @@ -335,10 +232,10 @@ public: static std::string entityType(); }; -class DLL_LINKAGE FactionID : public Identifier +class DLL_LINKAGE FactionID : public EntityIdentifier { public: - using Identifier::Identifier; + using EntityIdentifier::EntityIdentifier; static const FactionID NONE; static const FactionID DEFAULT; @@ -413,10 +310,10 @@ public: } }; -class DLL_LINKAGE BuildingID : public IdentifierWithEnum +class DLL_LINKAGE BuildingID : public StaticIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using StaticIdentifierWithEnum::StaticIdentifierWithEnum; static BuildingID HALL_LEVEL(unsigned int level) { @@ -578,10 +475,10 @@ public: }; }; -class DLL_LINKAGE MapObjectID : public IdentifierWithEnum +class DLL_LINKAGE MapObjectID : public EntityIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using EntityIdentifierWithEnum::EntityIdentifierWithEnum; static std::string encode(int32_t index); static si32 decode(const std::string & identifier); @@ -593,14 +490,16 @@ public: } }; -class MapObjectSubID : public Identifier +class MapObjectSubID : public StaticIdentifier { public: + MapObjectID primaryIdentifier; + constexpr MapObjectSubID(const IdentifierBase & value): - Identifier(value.getNum()) + StaticIdentifier(value.getNum()) {} constexpr MapObjectSubID(int32_t value = -1): - Identifier(value) + StaticIdentifier(value) {} MapObjectSubID & operator =(int32_t value) @@ -615,6 +514,9 @@ public: return *this; } + static si32 decode(const std::string & identifier); + static std::string encode(const si32 index); + // TODO: Remove constexpr operator int32_t () const { @@ -622,10 +524,13 @@ public: } }; -class DLL_LINKAGE RoadId : public Identifier +class DLL_LINKAGE RoadId : public EntityIdentifier { public: - using Identifier::Identifier; + using EntityIdentifier::EntityIdentifier; + static si32 decode(const std::string & identifier); + static std::string encode(const si32 index); + static std::string entityType(); static const RoadId NO_ROAD; static const RoadId DIRT_ROAD; @@ -635,10 +540,13 @@ public: const RoadType * toEntity(const Services * service) const; }; -class DLL_LINKAGE RiverId : public Identifier +class DLL_LINKAGE RiverId : public EntityIdentifier { public: - using Identifier::Identifier; + using EntityIdentifier::EntityIdentifier; + static si32 decode(const std::string & identifier); + static std::string encode(const si32 index); + static std::string entityType(); static const RiverId NO_RIVER; static const RiverId WATER_RIVER; @@ -658,10 +566,10 @@ public: }; }; -class EPathfindingLayer : public IdentifierWithEnum +class EPathfindingLayer : public StaticIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using StaticIdentifierWithEnum::StaticIdentifierWithEnum; }; class ArtifactPositionBase : public IdentifierBase @@ -694,10 +602,10 @@ public: DLL_LINKAGE static std::string encode(const si32 index); }; -class ArtifactPosition : public IdentifierWithEnum +class ArtifactPosition : public StaticIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using StaticIdentifierWithEnum::StaticIdentifierWithEnum; // TODO: Remove constexpr operator int32_t () const @@ -730,10 +638,10 @@ public: DLL_LINKAGE const Artifact * toEntity(const Services * service) const; }; -class ArtifactID : public IdentifierWithEnum +class ArtifactID : public EntityIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using EntityIdentifierWithEnum::EntityIdentifierWithEnum; ///json serialization helpers DLL_LINKAGE static si32 decode(const std::string & identifier); @@ -773,10 +681,10 @@ public: DLL_LINKAGE const Creature * toEntity(const CreatureService * creatures) const; }; -class DLL_LINKAGE CreatureID : public IdentifierWithEnum +class DLL_LINKAGE CreatureID : public EntityIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using EntityIdentifierWithEnum::EntityIdentifierWithEnum; ///json serialization helpers static si32 decode(const std::string & identifier); @@ -892,10 +800,10 @@ public: const spells::Spell * toEntity(const spells::Service * service) const; }; -class DLL_LINKAGE SpellID : public IdentifierWithEnum +class DLL_LINKAGE SpellID : public EntityIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using EntityIdentifierWithEnum::EntityIdentifierWithEnum; ///json serialization helpers static si32 decode(const std::string & identifier); @@ -904,10 +812,10 @@ public: }; class BattleFieldInfo; -class DLL_LINKAGE BattleField : public Identifier +class DLL_LINKAGE BattleField : public EntityIdentifier { public: - using Identifier::Identifier; + using EntityIdentifier::EntityIdentifier; static const BattleField NONE; const BattleFieldInfo * getInfo() const; @@ -916,10 +824,13 @@ public: static std::string encode(const si32 index); }; -class DLL_LINKAGE BoatId : public Identifier +class DLL_LINKAGE BoatId : public EntityIdentifier { public: - using Identifier::Identifier; + using EntityIdentifier::EntityIdentifier; + + static si32 decode(const std::string & identifier); + static std::string encode(const si32 index); static const BoatId NONE; static const BoatId NECROPOLIS; @@ -950,29 +861,29 @@ public: }; }; -class TerrainId : public IdentifierWithEnum +class DLL_LINKAGE TerrainId : public EntityIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using EntityIdentifierWithEnum::EntityIdentifierWithEnum; - DLL_LINKAGE static si32 decode(const std::string & identifier); - DLL_LINKAGE static std::string encode(const si32 index); + static si32 decode(const std::string & identifier); + static std::string encode(const si32 index); static std::string entityType(); const TerrainType * toEntity(const Services * service) const; }; class ObstacleInfo; -class Obstacle : public Identifier +class Obstacle : public EntityIdentifier { public: - using Identifier::Identifier; + using EntityIdentifier::EntityIdentifier; DLL_LINKAGE const ObstacleInfo * getInfo() const; }; -class DLL_LINKAGE SpellSchool : public Identifier +class DLL_LINKAGE SpellSchool : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; static const SpellSchool ANY; static const SpellSchool AIR; @@ -1005,10 +916,10 @@ public: }; }; -class DLL_LINKAGE GameResID : public IdentifierWithEnum +class DLL_LINKAGE GameResID : public StaticIdentifierWithEnum { public: - using IdentifierWithEnum::IdentifierWithEnum; + using StaticIdentifierWithEnum::StaticIdentifierWithEnum; static si32 decode(const std::string & identifier); static std::string encode(const si32 index); @@ -1017,7 +928,7 @@ public: static const std::array & ALL_RESOURCES(); }; -class DLL_LINKAGE BuildingTypeUniqueID : public Identifier +class DLL_LINKAGE BuildingTypeUniqueID : public StaticIdentifier { public: BuildingTypeUniqueID(FactionID faction, BuildingID building ); @@ -1028,13 +939,13 @@ public: BuildingID getBuilding() const; FactionID getFaction() const; - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; }; -class DLL_LINKAGE CampaignScenarioID : public Identifier +class DLL_LINKAGE CampaignScenarioID : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; static si32 decode(const std::string & identifier); static std::string encode(int32_t index); diff --git a/lib/constants/IdentifierBase.h b/lib/constants/IdentifierBase.h index 5ad0a8dd3..c72903ca0 100644 --- a/lib/constants/IdentifierBase.h +++ b/lib/constants/IdentifierBase.h @@ -42,11 +42,6 @@ public: } }; - template void serialize(Handler &h, const int version) - { - h & num; - } - constexpr void advance(int change) { num += change; @@ -62,3 +57,180 @@ public: return os << dt.num; } }; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Note: use template to force different type, blocking any Identifier <=> Identifier comparisons +template +class Identifier : public IdentifierBase +{ + using BaseClass = IdentifierBase; +public: + constexpr Identifier() + {} + + explicit constexpr Identifier(int32_t value): + IdentifierBase(value) + {} + + constexpr bool operator == (const Identifier & b) const { return BaseClass::num == b.num; } + constexpr bool operator <= (const Identifier & b) const { return BaseClass::num <= b.num; } + constexpr bool operator >= (const Identifier & b) const { return BaseClass::num >= b.num; } + constexpr bool operator != (const Identifier & b) const { return BaseClass::num != b.num; } + constexpr bool operator < (const Identifier & b) const { return BaseClass::num < b.num; } + constexpr bool operator > (const Identifier & b) const { return BaseClass::num > b.num; } + + constexpr FinalClass & operator++() + { + ++BaseClass::num; + return static_cast(*this); + } + + constexpr FinalClass & operator--() + { + --BaseClass::num; + return static_cast(*this); + } + + constexpr FinalClass operator--(int) + { + FinalClass ret(num); + --BaseClass::num; + return ret; + } + + constexpr FinalClass operator++(int) + { + FinalClass ret(num); + ++BaseClass::num; + return ret; + } +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +template +class IdentifierWithEnum : public BaseClass +{ + using EnumType = typename BaseClass::Type; + + static_assert(std::is_same_v, int32_t>, "Entity Identifier must use int32_t"); +public: + constexpr EnumType toEnum() const + { + return static_cast(BaseClass::num); + } + + constexpr IdentifierWithEnum(const EnumType & enumValue) + { + BaseClass::num = static_cast(enumValue); + } + + constexpr IdentifierWithEnum(int32_t _num = -1) + { + BaseClass::num = _num; + } + + constexpr bool operator == (const EnumType & b) const { return BaseClass::num == static_cast(b); } + constexpr bool operator <= (const EnumType & b) const { return BaseClass::num <= static_cast(b); } + constexpr bool operator >= (const EnumType & b) const { return BaseClass::num >= static_cast(b); } + constexpr bool operator != (const EnumType & b) const { return BaseClass::num != static_cast(b); } + constexpr bool operator < (const EnumType & b) const { return BaseClass::num < static_cast(b); } + constexpr bool operator > (const EnumType & b) const { return BaseClass::num > static_cast(b); } + + constexpr bool operator == (const IdentifierWithEnum & b) const { return BaseClass::num == b.num; } + constexpr bool operator <= (const IdentifierWithEnum & b) const { return BaseClass::num <= b.num; } + constexpr bool operator >= (const IdentifierWithEnum & b) const { return BaseClass::num >= b.num; } + constexpr bool operator != (const IdentifierWithEnum & b) const { return BaseClass::num != b.num; } + constexpr bool operator < (const IdentifierWithEnum & b) const { return BaseClass::num < b.num; } + constexpr bool operator > (const IdentifierWithEnum & b) const { return BaseClass::num > b.num; } + + constexpr FinalClass & operator++() + { + ++BaseClass::num; + return static_cast(*this); + } + + constexpr FinalClass operator++(int) + { + FinalClass ret(BaseClass::num); + ++BaseClass::num; + return ret; + } +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +template +class EntityIdentifier : public Identifier +{ +public: + using Identifier::Identifier; + + template + void serialize(Handler &h, const int version) + { + auto * finalClass = static_cast(this); + std::string value; + + if (h.saving) + value = FinalClass::encode(finalClass->num); + + h & value; + + if (!h.saving) + finalClass->num = FinalClass::decode(value); + } +}; + +template +class EntityIdentifierWithEnum : public IdentifierWithEnum +{ +public: + using IdentifierWithEnum::IdentifierWithEnum; + + template + void serialize(Handler &h, const int version) + { + auto * finalClass = static_cast(this); + std::string value; + + if (h.saving) + value = FinalClass::encode(finalClass->num); + + h & value; + + if (!h.saving) + finalClass->num = FinalClass::decode(value); + } +}; + +template +class StaticIdentifier : public Identifier +{ +public: + using Identifier::Identifier; + + template + void serialize(Handler &h, const int version) + { + auto * finalClass = static_cast(this); + h & finalClass->num; + } +}; + +template +class StaticIdentifierWithEnum : public IdentifierWithEnum +{ +public: + using IdentifierWithEnum::IdentifierWithEnum; + + template + void serialize(Handler &h, const int version) + { + auto * finalClass = static_cast(this); + h & finalClass->num; + } +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/networkPacks/ObjProperty.h b/lib/networkPacks/ObjProperty.h index 15b55afba..9d40028c4 100644 --- a/lib/networkPacks/ObjProperty.h +++ b/lib/networkPacks/ObjProperty.h @@ -53,10 +53,10 @@ enum class ObjProperty : int8_t REWARD_CLEARED }; -class NumericID : public Identifier +class NumericID : public StaticIdentifier { public: - using Identifier::Identifier; + using StaticIdentifier::StaticIdentifier; static si32 decode(const std::string & identifier) {