1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-05-13 22:06:58 +02:00

swap contitutient

This commit is contained in:
SoundSSGood 2022-12-30 21:43:32 +02:00
parent 4005b48360
commit a0568823a9
7 changed files with 33 additions and 31 deletions

View File

@ -278,13 +278,12 @@ void CHeroArtPlace::select ()
if (locked) if (locked)
return; return;
selectSlot(true);
pickSlot(true); pickSlot(true);
if(ourArt->canBeDisassembled() && slotID < GameConstants::BACKPACK_START) //worn combined artifact -> locks have to disappear if(ourArt->canBeDisassembled() && slotID < GameConstants::BACKPACK_START) //worn combined artifact -> locks have to disappear
{ {
for(int i = 0; i < GameConstants::BACKPACK_START; i++) for(auto slot : ArtifactUtils::constituentWornSlots())
{ {
auto ap = ourOwner->getArtPlace(i); auto ap = ourOwner->getArtPlace(slot);
if(ap)//getArtPlace may return null if(ap)//getArtPlace may return null
ap->pickSlot(ourArt->isPart(ap->ourArt)); ap->pickSlot(ourArt->isPart(ap->ourArt));
} }
@ -309,9 +308,9 @@ void CHeroArtPlace::deselect ()
pickSlot(false); pickSlot(false);
if(ourArt && ourArt->canBeDisassembled()) //combined art returned to its slot -> restore locks if(ourArt && ourArt->canBeDisassembled()) //combined art returned to its slot -> restore locks
{ {
for(int i = 0; i < GameConstants::BACKPACK_START; i++) for(auto slot : ArtifactUtils::constituentWornSlots())
{ {
auto place = ourOwner->getArtPlace(i); auto place = ourOwner->getArtPlace(slot);
if(nullptr != place)//getArtPlace may return null if(nullptr != place)//getArtPlace may return null
place->pickSlot(false); place->pickSlot(false);
@ -735,10 +734,10 @@ void CArtifactsOfHero::artifactMoved(const ArtifactLocation & src, const Artifac
if(isCurHeroDst && ArtifactUtils::isSlotBackpack(dst.slot)) if(isCurHeroDst && ArtifactUtils::isSlotBackpack(dst.slot))
updateSlot(dst.slot); updateSlot(dst.slot);
// We need to update all slots, artifact might be combined and affect more slots // We need to update all slots, artifact might be combined and affect more slots
if(isCurHeroSrc || isCurHeroDst) if(isCurHeroSrc || isCurHeroDst)
updateWornSlots(false); updateWornSlots(false);
if(!src.isHolder(curHero) && !isCurHeroDst) if(!isCurHeroSrc && !isCurHeroDst)
return; return;
// When moving one artifact onto another it leads to two art movements: dst->TRANSITION_POS; src->dst // When moving one artifact onto another it leads to two art movements: dst->TRANSITION_POS; src->dst
@ -748,11 +747,12 @@ void CArtifactsOfHero::artifactMoved(const ArtifactLocation & src, const Artifac
// Used when doing dragAndDrop and artifact swap multiple times // Used when doing dragAndDrop and artifact swap multiple times
if(src.slot == ArtifactPosition::TRANSITION_POS && if(src.slot == ArtifactPosition::TRANSITION_POS &&
commonInfo->src.slotID == ArtifactPosition::TRANSITION_POS && commonInfo->src.slotID == ArtifactPosition::TRANSITION_POS &&
commonInfo->dst.slotID == ArtifactPosition::PRE_FIRST) commonInfo->dst.slotID == ArtifactPosition::PRE_FIRST &&
isCurHeroDst)
{ {
auto art = curHero->getArt(ArtifactPosition::TRANSITION_POS); auto art = curHero->getArt(ArtifactPosition::TRANSITION_POS);
assert(art); assert(art);
CCS->curh->dragAndDropCursor(make_unique<CAnimImage>("artifact", art->artType->getIconIndex())); CCS->curh->dragAndDropCursor(std::make_unique<CAnimImage>("artifact", art->artType->getIconIndex()));
markPossibleSlots(art); markPossibleSlots(art);
commonInfo->src.art = art; commonInfo->src.art = art;
@ -787,21 +787,14 @@ void CArtifactsOfHero::artifactMoved(const ArtifactLocation & src, const Artifac
commonInfo->src.art = dst.getArt(); commonInfo->src.art = dst.getArt();
commonInfo->src.slotID = dst.slot; commonInfo->src.slotID = dst.slot;
assert(commonInfo->src.AOH); assert(commonInfo->src.AOH);
CCS->curh->dragAndDropCursor(make_unique<CAnimImage>("artifact", dst.getArt()->artType->getIconIndex())); CCS->curh->dragAndDropCursor(std::make_unique<CAnimImage>("artifact", dst.getArt()->artType->getIconIndex()));
markPossibleSlots(dst.getArt());
} }
updateParentWindow(); updateParentWindow();
int shift = 0;
if(!ArtifactUtils::isSlotBackpack(src.slot) && dst.slot - GameConstants::BACKPACK_START < backpackPos)
shift++;
if(!ArtifactUtils::isSlotBackpack(dst.slot) && src.slot - GameConstants::BACKPACK_START < backpackPos)
shift--;
// If backpack is changed, update it // If backpack is changed, update it
if((isCurHeroSrc && ArtifactUtils::isSlotBackpack(src.slot)) if((isCurHeroSrc && ArtifactUtils::isSlotBackpack(src.slot))
|| (isCurHeroDst && ArtifactUtils::isSlotBackpack(dst.slot))) || (isCurHeroDst && ArtifactUtils::isSlotBackpack(dst.slot)))
scrollBackpack(shift); scrollBackpack(0);
} }
void CArtifactsOfHero::artifactRemoved(const ArtifactLocation &al) void CArtifactsOfHero::artifactRemoved(const ArtifactLocation &al)
@ -815,7 +808,7 @@ void CArtifactsOfHero::artifactRemoved(const ArtifactLocation &al)
} }
} }
CArtifactsOfHero::ArtPlacePtr CArtifactsOfHero::getArtPlace(int slot) CArtifactsOfHero::ArtPlacePtr CArtifactsOfHero::getArtPlace(ArtifactPosition slot)
{ {
if(slot == ArtifactPosition::TRANSITION_POS) if(slot == ArtifactPosition::TRANSITION_POS)
{ {
@ -823,7 +816,7 @@ CArtifactsOfHero::ArtPlacePtr CArtifactsOfHero::getArtPlace(int slot)
} }
if(slot < GameConstants::BACKPACK_START) if(slot < GameConstants::BACKPACK_START)
{ {
if(artWorn.find(ArtifactPosition(slot)) == artWorn.end()) if(artWorn.find(slot) == artWorn.end())
{ {
logGlobal->error("CArtifactsOfHero::getArtPlace: invalid slot %d", slot); logGlobal->error("CArtifactsOfHero::getArtPlace: invalid slot %d", slot);
return nullptr; return nullptr;

View File

@ -141,7 +141,7 @@ public:
void artifactMoved(const ArtifactLocation &src, const ArtifactLocation &dst); void artifactMoved(const ArtifactLocation &src, const ArtifactLocation &dst);
void artifactRemoved(const ArtifactLocation &al); void artifactRemoved(const ArtifactLocation &al);
void artifactUpdateSlots(const ArtifactLocation &al); void artifactUpdateSlots(const ArtifactLocation &al);
ArtPlacePtr getArtPlace(int slot);//may return null ArtPlacePtr getArtPlace(ArtifactPosition slot);//may return null
void setHero(const CGHeroInstance * hero); void setHero(const CGHeroInstance * hero);
const CGHeroInstance *getHero() const; const CGHeroInstance *getHero() const;

View File

@ -1247,10 +1247,6 @@ CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2,
updateWidgets(); updateWidgets();
} }
CExchangeWindow::~CExchangeWindow()
{
}
const CGarrisonSlot * CExchangeWindow::getSelectedSlotID() const const CGarrisonSlot * CExchangeWindow::getSelectedSlotID() const
{ {
return garr->getSelection(); return garr->getSelection();

View File

@ -379,7 +379,6 @@ public:
const CGarrisonSlot * getSelectedSlotID() const; const CGarrisonSlot * getSelectedSlotID() const;
CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2, QueryID queryID); CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2, QueryID queryID);
~CExchangeWindow();
}; };
/// Here you can buy ships /// Here you can buy ships

View File

@ -856,7 +856,7 @@ void CArtifactInstance::putAt(ArtifactLocation al)
assert(canBePutAt(al)); assert(canBePutAt(al));
al.getHolderArtSet()->setNewArtSlot(al.slot, this, false); al.getHolderArtSet()->setNewArtSlot(al.slot, this, false);
if(!ArtifactUtils::isSlotBackpack(al.slot) && (al.slot != ArtifactPosition::TRANSITION_POS)) if(ArtifactUtils::isSlotEquipment(al.slot))
al.getHolderNode()->attachTo(*this); al.getHolderNode()->attachTo(*this);
} }
@ -864,7 +864,7 @@ void CArtifactInstance::removeFrom(ArtifactLocation al)
{ {
assert(al.getHolderArtSet()->getArt(al.slot) == this); assert(al.getHolderArtSet()->getArt(al.slot) == this);
al.getHolderArtSet()->eraseArtSlot(al.slot); al.getHolderArtSet()->eraseArtSlot(al.slot);
if(!ArtifactUtils::isSlotBackpack(al.slot) && (al.slot != ArtifactPosition::TRANSITION_POS)) if(ArtifactUtils::isSlotEquipment(al.slot))
al.getHolderNode()->detachFrom(*this); al.getHolderNode()->detachFrom(*this);
} }
@ -1003,6 +1003,8 @@ bool CArtifactInstance::isPart(const CArtifactInstance *supposedPart) const
bool CCombinedArtifactInstance::canBePutAt(const CArtifactSet *artSet, ArtifactPosition slot, bool assumeDestRemoved) const bool CCombinedArtifactInstance::canBePutAt(const CArtifactSet *artSet, ArtifactPosition slot, bool assumeDestRemoved) const
{ {
if(slot == ArtifactPosition::TRANSITION_POS)
return true;
bool canMainArtifactBePlaced = CArtifactInstance::canBePutAt(artSet, slot, assumeDestRemoved); bool canMainArtifactBePlaced = CArtifactInstance::canBePutAt(artSet, slot, assumeDestRemoved);
if(!canMainArtifactBePlaced) if(!canMainArtifactBePlaced)
return false; //no is no... return false; //no is no...
@ -1075,7 +1077,11 @@ void CCombinedArtifactInstance::addAsConstituent(CArtifactInstance *art, Artifac
void CCombinedArtifactInstance::putAt(ArtifactLocation al) void CCombinedArtifactInstance::putAt(ArtifactLocation al)
{ {
if(ArtifactUtils::isSlotBackpack(al.slot)) if(al.slot == ArtifactPosition::TRANSITION_POS)
{
CArtifactInstance::putAt(al);
}
else if(ArtifactUtils::isSlotBackpack(al.slot))
{ {
CArtifactInstance::putAt(al); CArtifactInstance::putAt(al);
for(ConstituentInfo &ci : constituentsInfo) for(ConstituentInfo &ci : constituentsInfo)
@ -1113,7 +1119,7 @@ void CCombinedArtifactInstance::putAt(ArtifactLocation al)
void CCombinedArtifactInstance::removeFrom(ArtifactLocation al) void CCombinedArtifactInstance::removeFrom(ArtifactLocation al)
{ {
if(ArtifactUtils::isSlotBackpack(al.slot)) if(ArtifactUtils::isSlotBackpack(al.slot) || al.slot == ArtifactPosition::TRANSITION_POS)
{ {
CArtifactInstance::removeFrom(al); CArtifactInstance::removeFrom(al);
} }
@ -1634,4 +1640,9 @@ DLL_LINKAGE bool ArtifactUtils::isSlotBackpack(ArtifactPosition slot)
return slot >= GameConstants::BACKPACK_START; return slot >= GameConstants::BACKPACK_START;
} }
DLL_LINKAGE bool ArtifactUtils::isSlotEquipment(ArtifactPosition slot)
{
return slot < GameConstants::BACKPACK_START && slot >= 0;
}
VCMI_LIB_NAMESPACE_END VCMI_LIB_NAMESPACE_END

View File

@ -393,6 +393,7 @@ namespace ArtifactUtils
DLL_LINKAGE bool isArtRemovable(const std::pair<ArtifactPosition, ArtSlotInfo> & slot); DLL_LINKAGE bool isArtRemovable(const std::pair<ArtifactPosition, ArtSlotInfo> & slot);
DLL_LINKAGE bool checkSpellbookIsNeeded(const CGHeroInstance * heroPtr, ArtifactID artID, ArtifactPosition slot); DLL_LINKAGE bool checkSpellbookIsNeeded(const CGHeroInstance * heroPtr, ArtifactID artID, ArtifactPosition slot);
DLL_LINKAGE bool isSlotBackpack(ArtifactPosition slot); DLL_LINKAGE bool isSlotBackpack(ArtifactPosition slot);
DLL_LINKAGE bool isSlotEquipment(ArtifactPosition slot);
} }
VCMI_LIB_NAMESPACE_END VCMI_LIB_NAMESPACE_END

View File

@ -3892,7 +3892,7 @@ bool CGameHandler::moveArtifact(const ArtifactLocation &al1, const ArtifactLocat
// Check if src/dest slots are appropriate for the artifacts exchanged. // Check if src/dest slots are appropriate for the artifacts exchanged.
// Moving to the backpack is always allowed. // Moving to the backpack is always allowed.
if ((!srcArtifact || dst.slot < GameConstants::BACKPACK_START) if ((!srcArtifact || !ArtifactUtils::isSlotBackpack(dst.slot))
&& srcArtifact && !srcArtifact->canBePutAt(dst, true)) && srcArtifact && !srcArtifact->canBePutAt(dst, true))
COMPLAIN_RET("Cannot move artifact!"); COMPLAIN_RET("Cannot move artifact!");
@ -3926,6 +3926,8 @@ bool CGameHandler::moveArtifact(const ArtifactLocation &al1, const ArtifactLocat
giveHeroNewArtifact(hero, VLC->arth->objects[ArtifactID::SPELLBOOK], ArtifactPosition::SPELLBOOK); giveHeroNewArtifact(hero, VLC->arth->objects[ArtifactID::SPELLBOOK], ArtifactPosition::SPELLBOOK);
MoveArtifact ma(&src, &dst); MoveArtifact ma(&src, &dst);
if(dst.slot == ArtifactPosition::TRANSITION_POS)
ma.askAssemble = false;
sendAndApply(&ma); sendAndApply(&ma);
} }
return true; return true;