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

ask assemble regression fixed

This commit is contained in:
SoundSSGood 2023-11-08 19:54:02 +02:00
parent ce3d407396
commit 57e3abc548
7 changed files with 41 additions and 35 deletions

View File

@ -188,8 +188,7 @@ public:
void removeAfterVisit(const CGObjectInstance * object) override {};
bool swapGarrisonOnSiege(ObjectInstanceID tid) override {return false;};
bool giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos) override {return false;}
bool giveHeroArtifact(const CGHeroInstance * h, const CArtifactInstance * a, ArtifactPosition pos) override {return false;}
void putArtifact(const ArtifactLocation & al, const CArtifactInstance * a) override {};
bool putArtifact(const ArtifactLocation & al, const CArtifactInstance * art, std::optional<bool> askAssemble) override {return false;};
void removeArtifact(const ArtifactLocation & al) override {};
bool moveArtifact(const ArtifactLocation & al1, const ArtifactLocation & al2) override {return false;};

View File

@ -33,10 +33,11 @@ DLL_LINKAGE ArtifactPosition ArtifactUtils::getArtAnyPosition(const CArtifactSet
DLL_LINKAGE ArtifactPosition ArtifactUtils::getArtBackpackPosition(const CArtifactSet * target, const ArtifactID & aid)
{
const auto * art = aid.toArtifact();
if(art->canBePutAt(target, ArtifactPosition::BACKPACK_START))
{
return ArtifactPosition::BACKPACK_START;
}
if(target->bearerType() == ArtBearer::HERO)
if(art->canBePutAt(target, ArtifactPosition::BACKPACK_START))
{
return ArtifactPosition::BACKPACK_START;
}
return ArtifactPosition::PRE_FIRST;
}

View File

@ -107,8 +107,7 @@ public:
virtual void removeAfterVisit(const CGObjectInstance *object) = 0; //object will be destroyed when interaction is over. Do not call when interaction is not ongoing!
virtual bool giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos) = 0;
virtual bool giveHeroArtifact(const CGHeroInstance * h, const CArtifactInstance * a, ArtifactPosition pos) = 0;
virtual void putArtifact(const ArtifactLocation &al, const CArtifactInstance *a) = 0;
virtual bool putArtifact(const ArtifactLocation & al, const CArtifactInstance * art, std::optional<bool> askAssemble = std::nullopt) = 0;
virtual void removeArtifact(const ArtifactLocation &al) = 0;
virtual bool moveArtifact(const ArtifactLocation &al1, const ArtifactLocation &al2) = 0;

View File

@ -881,7 +881,7 @@ void CGArtifact::onHeroVisit(const CGHeroInstance * h) const
void CGArtifact::pick(const CGHeroInstance * h) const
{
if(cb->giveHeroArtifact(h, storedArtifact, ArtifactPosition::FIRST_AVAILABLE))
if(cb->putArtifact(ArtifactLocation(h->id, ArtifactPosition::FIRST_AVAILABLE), storedArtifact))
cb->removeObject(this, h->getOwner());
}

View File

@ -975,13 +975,13 @@ struct DLL_LINKAGE CArtifactOperationPack : CPackForClient
struct DLL_LINKAGE PutArtifact : CArtifactOperationPack
{
PutArtifact() = default;
explicit PutArtifact(ArtifactLocation * dst, bool askAssemble = true)
: al(*dst), askAssemble(askAssemble)
explicit PutArtifact(ArtifactLocation & dst, bool askAssemble = true)
: al(dst), askAssemble(askAssemble)
{
}
ArtifactLocation al;
bool askAssemble = false;
bool askAssemble;
ConstTransitivePtr<CArtifactInstance> art;
void applyGs(CGameState * gs);

View File

@ -3959,38 +3959,46 @@ bool CGameHandler::swapStacks(const StackLocation & sl1, const StackLocation & s
}
}
bool CGameHandler::giveHeroArtifact(const CGHeroInstance * h, const CArtifactInstance * a, ArtifactPosition pos)
bool CGameHandler::putArtifact(const ArtifactLocation & al, const CArtifactInstance * art, std::optional<bool> askAssemble)
{
assert(a->artType);
ArtifactLocation al(h->id, ArtifactPosition::PRE_FIRST);
assert(art && art->artType);
ArtifactLocation dst(al.artHolder, ArtifactPosition::PRE_FIRST);
dst.creature = al.creature;
auto putTo = getArtSet(al);
assert(putTo);
if(pos == ArtifactPosition::FIRST_AVAILABLE)
if(al.slot == ArtifactPosition::FIRST_AVAILABLE)
{
al.slot = ArtifactUtils::getArtAnyPosition(h, a->getTypeId());
dst.slot = ArtifactUtils::getArtAnyPosition(putTo, art->getTypeId());
}
else if(ArtifactUtils::isSlotBackpack(pos))
else if(ArtifactUtils::isSlotBackpack(al.slot) && !al.creature.has_value())
{
al.slot = ArtifactUtils::getArtBackpackPosition(h, a->getTypeId());
dst.slot = ArtifactUtils::getArtBackpackPosition(putTo, art->getTypeId());
}
else
{
al.slot = pos;
dst.slot = al.slot;
}
if(a->canBePutAt(h, al.slot))
putArtifact(al, a);
if(!askAssemble.has_value())
{
if(!dst.creature.has_value() && ArtifactUtils::isSlotEquipment(dst.slot))
askAssemble = true;
else
askAssemble = false;
}
if(art->canBePutAt(putTo, dst.slot))
{
PutArtifact pa(dst, askAssemble.value());
pa.art = art;
sendAndApply(&pa);
return true;
}
else
{
return false;
return true;
}
void CGameHandler::putArtifact(const ArtifactLocation &al, const CArtifactInstance *a)
{
PutArtifact pa;
pa.art = a;
pa.al = al;
sendAndApply(&pa);
}
}
bool CGameHandler::giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos)
@ -4019,7 +4027,7 @@ bool CGameHandler::giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact
na.art = newArtInst;
sendAndApply(&na); // -> updates newArtInst!!!
if(giveHeroArtifact(h, newArtInst, pos))
if(putArtifact(ArtifactLocation(h->id, pos), newArtInst, false))
return true;
else
return false;

View File

@ -127,8 +127,7 @@ public:
void removeAfterVisit(const CGObjectInstance *object) override;
bool giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos = ArtifactPosition::FIRST_AVAILABLE) override;
bool giveHeroArtifact(const CGHeroInstance * h, const CArtifactInstance * a, ArtifactPosition pos) override;
void putArtifact(const ArtifactLocation &al, const CArtifactInstance *a) override;
bool putArtifact(const ArtifactLocation & al, const CArtifactInstance * art, std::optional<bool> askAssemble) override;
void removeArtifact(const ArtifactLocation &al) override;
bool moveArtifact(const ArtifactLocation & src, const ArtifactLocation & dst) override;
bool bulkMoveArtifacts(ObjectInstanceID srcHero, ObjectInstanceID dstHero, bool swap, bool equipped, bool backpack);