diff --git a/client/Client.h b/client/Client.h index 3f7e1b1d2..8df78bd0f 100644 --- a/client/Client.h +++ b/client/Client.h @@ -186,7 +186,7 @@ public: void giveCreatures(const CArmedInstance * objid, const CGHeroInstance * h, const CCreatureSet &creatures, bool remove) override {}; void takeCreatures(ObjectInstanceID objid, const std::vector &creatures) override {}; - bool changeStackType(const StackLocation &sl, CCreature *c) override {return false;}; + bool changeStackType(const StackLocation &sl, const CCreature *c) override {return false;}; bool changeStackCount(const StackLocation &sl, TQuantity count, bool absoluteValue = false) override {return false;}; bool insertNewStack(const StackLocation &sl, const CCreature *c, TQuantity count) override {return false;}; bool eraseStack(const StackLocation &sl, bool forceRemoval = false){return false;}; diff --git a/lib/GameConstants.h b/lib/GameConstants.h index 624ec8196..2669a8f0e 100644 --- a/lib/GameConstants.h +++ b/lib/GameConstants.h @@ -864,7 +864,10 @@ public: WALKING_DEAD = 58, WIGHTS = 60, LICHES = 64, + BONE_DRAGON = 68, TROGLODYTES = 70, + HYDRA = 110, + CHAOS_HYDRA = 111, AIR_ELEMENTAL = 112, EARTH_ELEMENTAL = 113, FIRE_ELEMENTAL = 114, diff --git a/lib/IGameCallback.h b/lib/IGameCallback.h index eb391e2a8..b2ca42030 100644 --- a/lib/IGameCallback.h +++ b/lib/IGameCallback.h @@ -61,7 +61,7 @@ public: virtual void giveCreatures(const CArmedInstance *objid, const CGHeroInstance * h, const CCreatureSet &creatures, bool remove) =0; virtual void takeCreatures(ObjectInstanceID objid, const std::vector &creatures) =0; virtual bool changeStackCount(const StackLocation &sl, TQuantity count, bool absoluteValue = false) =0; - virtual bool changeStackType(const StackLocation &sl, CCreature *c) =0; + virtual bool changeStackType(const StackLocation &sl, const CCreature *c) =0; virtual bool insertNewStack(const StackLocation &sl, const CCreature *c, TQuantity count = -1) =0; //count -1 => moves whole stack virtual bool eraseStack(const StackLocation &sl, bool forceRemoval = false) =0; virtual bool swapStacks(const StackLocation &sl1, const StackLocation &sl2) =0; diff --git a/lib/NetPacks.h b/lib/NetPacks.h index 5ddd613fa..8058e5dce 100644 --- a/lib/NetPacks.h +++ b/lib/NetPacks.h @@ -795,7 +795,7 @@ struct ChangeStackCount : CGarrisonOperationPack //521 struct SetStackType : CGarrisonOperationPack //522 { StackLocation sl; - CCreature *type; + const CCreature *type; void applyCl(CClient *cl); DLL_LINKAGE void applyGs(CGameState *gs); diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index d42d95d8c..3e326d560 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -2789,7 +2789,7 @@ bool CGameHandler::upgradeCreature( ObjectInstanceID objid, SlotID pos, Creature return true; } -bool CGameHandler::changeStackType(const StackLocation &sl, CCreature *c) +bool CGameHandler::changeStackType(const StackLocation &sl, const CCreature *c) { if(!sl.army->hasStackAtSlot(sl.slot)) COMPLAIN_RET("Cannot find a stack to change type"); @@ -3208,14 +3208,15 @@ bool CGameHandler::transformInUndead(const IMarket *market, const CGHeroInstance const CStackInstance &s = army->getStack(slot); - int resCreature;//resulting creature - bone dragons or skeletons - if (s.hasBonusOfType(Bonus::DRAGON_NATURE)) - resCreature = 68; - else - resCreature = 56; + //resulting creature - bone dragons or skeletons + CreatureID resCreature = CreatureID::SKELETON; - changeStackType(StackLocation(army, slot), VLC->creh->creatures.at(resCreature)); + if(s.hasBonusOfType(Bonus::DRAGON_NATURE) + || (s.getCreatureID() == CreatureID::HYDRA) + || (s.getCreatureID() == CreatureID::CHAOS_HYDRA)) + resCreature = CreatureID::BONE_DRAGON; + changeStackType(StackLocation(army, slot), resCreature.toCreature()); return true; } diff --git a/server/CGameHandler.h b/server/CGameHandler.h index 3adc1f710..5ee6eb913 100644 --- a/server/CGameHandler.h +++ b/server/CGameHandler.h @@ -142,7 +142,7 @@ public: void giveCreatures(const CArmedInstance *objid, const CGHeroInstance * h, const CCreatureSet &creatures, bool remove) override; void takeCreatures(ObjectInstanceID objid, const std::vector &creatures) override; - bool changeStackType(const StackLocation &sl, CCreature *c) override; + bool changeStackType(const StackLocation &sl, const CCreature *c) override; bool changeStackCount(const StackLocation &sl, TQuantity count, bool absoluteValue = false) override; bool insertNewStack(const StackLocation &sl, const CCreature *c, TQuantity count) override; bool eraseStack(const StackLocation &sl, bool forceRemoval = false) override;