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

A handful of fixes for artifacts, minor for for battles.

This commit is contained in:
Michał W. Urbańczyk 2011-01-15 02:17:56 +00:00
parent 57580b87e1
commit a940daba5e
7 changed files with 184 additions and 131 deletions

View File

@ -48,6 +48,8 @@ void CHeroSwitcher::clickLeft(tribool down, bool previousState)
if(!down)
{
const CGHeroInstance * buf = LOCPLINT->getWHero(id);
if(!buf)
return;
GH.popIntTotally(getOwner());
GH.pushInt(new CHeroWindow(buf));
}

View File

@ -44,6 +44,7 @@
#include "CMessage.h"
#include "../lib/CObjectHandler.h"
#include <boost/program_options.hpp>
#include "../lib/CArtHandler.h"
#ifdef _WIN32
#include "SDL_syswm.h"
@ -306,10 +307,7 @@ void processCommand(const std::string &message)
readed.str(message);
std::string cn; //command name
readed >> cn;
int3 src, dst;
// int heronum;//TODO use me
int3 dest;
if(LOCPLINT && LOCPLINT->cingconsole)
LOCPLINT->cingconsole->print(message);
@ -472,6 +470,19 @@ void processCommand(const std::string &message)
tlog4 << typeid(*obj).name() << std::endl;
}
}
else if(cn=="tell")
{
std::string what;
int id1, id2;
readed >> what >> id1 >> id2;
if(what == "hs")
{
BOOST_FOREACH(const CGHeroInstance *h, LOCPLINT->cb->getHeroesInfo())
if(h->type->ID == id1)
if(const CArtifactInstance *a = h->getArt(id2))
tlog4 << a->nodeName();
}
}
else if(client && client->serv && client->serv->connected) //send to server
{
PlayerMessage pm(LOCPLINT->playerID,message);

View File

@ -2631,23 +2631,23 @@ void CTradeWindow::CTradeableItem::clickLeft(tribool down, bool previousState)
const CArtifactInstance *movedArt = aw->arts->commonInfo->src.art;
if(movedArt)
{
aw->moveFromSlotToAltar(aw->arts->commonInfo->src.slotID, this, movedArt->id);
aw->moveFromSlotToAltar(aw->arts->commonInfo->src.slotID, this, movedArt);
}
else if(const CArtifactInstance *art = getArtInstance())
{
movedArt = art;
aw->arts->commonInfo->src.AOH = aw->arts;
aw->arts->commonInfo->src.art = movedArt;
aw->arts->commonInfo->src.slotID = aw->hero->CArtifactSet::getArtPos(art);// vstd::findPos(aw->hero->artifacts, const_cast<CArtifact*>(movedArt));
aw->arts->commonInfo->src.slotID = aw->hero->getArtPos(art);
aw->arts->markPossibleSlots(movedArt);
aw->arts->commonInfo->dst.AOH = aw->arts;
//aw->arts->commonInfo->dst.AOH = aw->arts;
CCS->curh->dragAndDropCursor(graphics->artDefs->ourImages[movedArt->artType->id].bitmap);
aw->arts->artifactsOnAltar.erase(movedArt);
id = -1;
subtitle = "";
aw->arts->artifactsOnAltar.erase(movedArt->id);
aw->deal->block(!aw->arts->artifactsOnAltar.size());
aw->arts->markPossibleSlots(movedArt);
}
aw->calcTotalExp();
@ -3607,9 +3607,9 @@ void CAltarWindow::makeDeal()
}
else
{
BOOST_FOREACH(int artID, arts->artifactsOnAltar) //sacrifice each artifact on the list
BOOST_FOREACH(const CArtifactInstance *art, arts->artifactsOnAltar) //sacrifice each artifact on the list
{
LOCPLINT->cb->trade(market->o, mode, artID, -1, 1, hero);
LOCPLINT->cb->trade(market->o, mode, hero->getArtPos(art), -1, 1, hero);
}
arts->artifactsOnAltar.clear();
@ -3649,10 +3649,10 @@ void CAltarWindow::SacrificeAll()
}
else
{
for(std::map<ui16, const CArtifact*>::const_iterator i = hero->artifWorn.begin(); i != hero->artifWorn.end(); i++)
for(std::map<ui16, ArtSlotInfo>::const_iterator i = hero->artifactsWorn.begin(); i != hero->artifactsWorn.end(); i++)
{
if(i->second->id != 145) //ignore locks from assembled artifacts
moveFromSlotToAltar(i->first, NULL, i->second->id);
if(i->second.artifact->artType->id != 145) //ignore locks from assembled artifacts
moveFromSlotToAltar(i->first, NULL, i->second.artifact);
}
SacrificeBackpack();
@ -3757,11 +3757,11 @@ void CAltarWindow::calcTotalExp()
}
else
{
for(std::multiset<int>::const_iterator i = arts->artifactsOnAltar.begin(); i != arts->artifactsOnAltar.end(); i++)
BOOST_FOREACH(const CArtifactInstance *art, arts->artifactsOnAltar)
{
int dmp, valOfArt;
market->getOffer(*i, 0, dmp, valOfArt, mode);
val += valOfArt * arts->artifactsOnAltar.count(*i);
market->getOffer(art->artType->id, 0, dmp, valOfArt, mode);
val += valOfArt; //WAS val += valOfArt * arts->artifactsOnAltar.count(*i);
}
}
val *=(100+hero->getSecSkillLevel(CGHeroInstance::LEARNING)*5)/100.0f;
@ -3801,18 +3801,20 @@ int CAltarWindow::firstFreeSlot()
void CAltarWindow::SacrificeBackpack()
{
std::multiset<int> toOmmit = arts->artifactsOnAltar;
std::multiset<const CArtifactInstance *> toOmmit = arts->artifactsOnAltar;
for (int i = 0; i < hero->artifacts.size(); i++)
for (int i = 0; i < hero->artifactsInBackpack.size(); i++)
{
if(vstd::contains(toOmmit, hero->artifacts[i]->id))
if(vstd::contains(toOmmit, hero->artifactsInBackpack[i].artifact))
{
toOmmit -= hero->artifacts[i]->id;
toOmmit -= hero->artifactsInBackpack[i].artifact;
continue;
}
putOnAltar(NULL, hero->artifacts[i]->id);
putOnAltar(NULL, hero->artifactsInBackpack[i].artifact);
}
arts->scrollBackpack(0);
calcTotalExp();
}
@ -3835,10 +3837,14 @@ void CAltarWindow::showAll(SDL_Surface * to)
}
}
bool CAltarWindow::putOnAltar(CTradeableItem* altarSlot, int artID)
bool CAltarWindow::putOnAltar(CTradeableItem* altarSlot, const CArtifactInstance *art)
{
int artID = art->artType->id;
if(artID != 1 && artID < 7) //special art
{
tlog2 << "Cannot put special artifact on altar!\n";
return false;
}
if(!altarSlot)
{
@ -3854,7 +3860,7 @@ bool CAltarWindow::putOnAltar(CTradeableItem* altarSlot, int artID)
int dmp, val;
market->getOffer(artID, 0, dmp, val, ARTIFACT_EXP);
arts->artifactsOnAltar.insert(artID);
arts->artifactsOnAltar.insert(art);
altarSlot->id = artID;
altarSlot->subtitle = boost::lexical_cast<std::string>(val);
@ -3862,7 +3868,7 @@ bool CAltarWindow::putOnAltar(CTradeableItem* altarSlot, int artID)
return true;
}
void CAltarWindow::moveFromSlotToAltar(int slotID, CTradeableItem* altarSlot, int artID)
void CAltarWindow::moveFromSlotToAltar(int slotID, CTradeableItem* altarSlot, const CArtifactInstance *art)
{
if(arts->commonInfo->src.art)
{
@ -3870,7 +3876,7 @@ void CAltarWindow::moveFromSlotToAltar(int slotID, CTradeableItem* altarSlot, in
arts->commonInfo->dst.AOH = arts;
}
if(putOnAltar(altarSlot, artID))
if(putOnAltar(altarSlot, art))
LOCPLINT->cb->swapArtifacts(hero, slotID, hero, 65500);
}
@ -4521,7 +4527,7 @@ CRClickPopupInt::~CRClickPopupInt()
}
CArtPlace::CArtPlace(const CArtifactInstance* Art)
: marked(false), ourArt(Art)
: marked(false), ourArt(Art), picked(false)
{
}
@ -4536,6 +4542,9 @@ void CArtPlace::activate()
void CArtPlace::clickLeft(tribool down, bool previousState)
{
//LRClickableAreaWTextComp::clickLeft(down);
bool inBackpack = slotID >= Arts::BACKPACK_START,
srcInBackpack = ourOwner->commonInfo->src.slotID >= Arts::BACKPACK_START,
srcInSameHero = ourOwner->commonInfo->src.AOH == ourOwner;
// If clicked on spellbook, open it only if no artifact is held at the moment.
if(ourArt && !down && previousState && !ourOwner->commonInfo->src.AOH)
@ -4557,7 +4566,7 @@ void CArtPlace::clickLeft(tribool down, bool previousState)
if(ourArt //to prevent selecting empty slots (bugfix to what GrayFace reported)
&& ourOwner->curHero->tempOwner == LOCPLINT->playerID)//can't take art from another player
{
if(ourArt->id == 3) //catapult cannot be highlighted
if(ourArt->artType->id == 3) //catapult cannot be highlighted
{
std::vector<SComponent *> catapult(1, new SComponent(SComponent::artifact, 3, 0));
LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[312], catapult); //The Catapult must be equipped.
@ -4570,34 +4579,39 @@ void CArtPlace::clickLeft(tribool down, bool previousState)
{
deselect();
}
else //perform artifact substitution
else //perform artifact transition
{
if (slotID >= 19) // Backpack destination.
if(inBackpack) // Backpack destination.
{
const CArtifact * const cur = ourOwner->commonInfo->src.art->artType;
switch(cur->id)
if(slotID == ourOwner->commonInfo->src.slotID + 1) //next slot (our is not visible, so visually same as "old" place) to the art -> make nothing, return artifact to slot
{
case 3:
//should not happen, catapult cannot be selected
assert(cur->id != 3);
break;
case 4: case 5: case 6: //war machines cannot go to backpack
LOCPLINT->showInfoDialog(boost::str(boost::format(CGI->generaltexth->allTexts[153]) % cur->Name()));
break;
default:
setMeAsDest();
amin(ourOwner->commonInfo->dst.slotID, ourOwner->curHero->artifactsInBackpack.size() + Arts::BACKPACK_START);
//
// // Correction for backpack position when src lies before dest.
// int correction = (ourOwner->commonInfo->srcAOH == ourOwner
// && ourOwner->commonInfo->srcSlotID >= 19
// && ourOwner->commonInfo->srcSlotID <= slotID);
// ourOwner->commonInfo->destSlotID += correction;
deselect();
}
else
{
const CArtifact * const cur = ourOwner->commonInfo->src.art->artType;
switch(cur->id)
{
case 3:
//should not happen, catapult cannot be selected
assert(cur->id != 3);
break;
case 4: case 5: case 6: //war machines cannot go to backpack
LOCPLINT->showInfoDialog(boost::str(boost::format(CGI->generaltexth->allTexts[153]) % cur->Name()));
break;
default:
setMeAsDest();
amin(ourOwner->commonInfo->dst.slotID, ourOwner->curHero->artifactsInBackpack.size() + Arts::BACKPACK_START);
if(!ourArt && srcInBackpack && srcInSameHero) //cannot move from backpack to AFTER backpack
ourOwner->commonInfo->dst.slotID--; //combined with amin above it will guarantee that dest is at most the last artifact
ourOwner->realizeCurrentTransaction();
break;
if(srcInSameHero && ourOwner->commonInfo->dst.slotID == ourOwner->commonInfo->src.slotID) //we came to src == dst
deselect();
else
ourOwner->realizeCurrentTransaction();
break;
}
}
}
//check if swap is possible
@ -4676,19 +4690,15 @@ void CArtPlace::select ()
if (locked())
return;
int backpackCorrection = -(slotID - 19 < ourOwner->backpackPos);
picked = true;
//int backpackCorrection = -(slotID - 19 < ourOwner->backpackPos);
CCS->curh->dragAndDropCursor(graphics->artDefs->ourImages[ourArt->artType->id].bitmap);
ourOwner->commonInfo->src.setTo(this, false);
// Temporarily remove artifact from hero.
ourOwner->markPossibleSlots(ourArt);
//
// if (slotID >= 19)
// ourOwner->scrollBackpack(backpackCorrection);
// else
ourOwner->eraseSlotData(this, slotID);
if(slotID >= Arts::BACKPACK_START)
ourOwner->scrollBackpack(0); //will update slots
// Update the hero bonuses.
ourOwner->updateParentWindow();
@ -4700,10 +4710,13 @@ void CArtPlace::select ()
*/
void CArtPlace::deselect ()
{
picked = false;
CCS->curh->dragAndDropCursor(NULL);
ourOwner->unmarkSlots();
ourOwner->commonInfo->src.clear();
if(slotID >= Arts::BACKPACK_START)
ourOwner->scrollBackpack(0); //will update slots
ourOwner->updateParentWindow();
ourOwner->safeRedraw();
@ -4719,7 +4732,7 @@ void CArtPlace::deactivate()
void CArtPlace::showAll(SDL_Surface *to)
{
if (ourArt)
if (ourArt && !picked)
blitAt(graphics->artDefs->ourImages[ourArt->artType->id].bitmap, pos.x, pos.y, to);
if(marked && active)
@ -4768,6 +4781,24 @@ void CArtPlace::setMeAsDest(bool backpackAsVoid /*= true*/)
ourOwner->commonInfo->dst.setTo(this, backpackAsVoid);
}
void CArtPlace::setArtifact(const CArtifactInstance *art)
{
ourArt = art;
if(!art)
{
text = std::string();
hoverText = CGI->generaltexth->allTexts[507];
}
else
{
text = ourArt->artType->Description();
if (locked()) // Locks should appear as empty.
hoverText = CGI->generaltexth->allTexts[507];
else
hoverText = boost::str(boost::format(CGI->generaltexth->heroscrn[1]) % ourArt->artType->Name());
}
}
void HoverableArea::hover (bool on)
{
if (on)
@ -4978,54 +5009,50 @@ void CArtifactsOfHero::dispose()
void CArtifactsOfHero::scrollBackpack(int dir)
{
int artsInBackpack = curHero->artifactsInBackpack.size();
backpackPos += dir;
if (curHero->artifactsInBackpack.size() > 0)
{
if (backpackPos < 0) // No guarantee of modulus behavior with negative operands.
{
do
{
backpackPos += curHero->artifactsInBackpack.size();
} while (backpackPos < 0);
}
else
{
backpackPos %= curHero->artifactsInBackpack.size();
}
}
if(backpackPos < 0)// No guarantee of modulus behavior with negative operands -> we keep it positive
backpackPos += artsInBackpack;
std::multiset<int> toOmmit = artifactsOnAltar;
int ommited = 0;
if(artsInBackpack)
backpackPos %= artsInBackpack;
std::multiset<const CArtifactInstance *> toOmit = artifactsOnAltar;
if(commonInfo->src.art) //if we picked an art from backapck, its slot has to be omitted
toOmit.insert(commonInfo->src.art);
int omitedSoFar = 0;
//set new data
size_t s = 0;
for( ; s < curHero->artifactsInBackpack.size(); ++s)
for( ; s < artsInBackpack; ++s)
{
if (s < curHero->artifactsInBackpack.size())
if (s < artsInBackpack)
{
int slotID = 19 + (s + backpackPos)%curHero->artifactsInBackpack.size();
int slotID = 19 + (s + backpackPos)%artsInBackpack;
const CArtifactInstance *art = curHero->getArt(slotID);
assert(art);
if(!vstd::contains(toOmmit, art->artType->id))
if(!vstd::contains(toOmit, art))
{
if(s - ommited < 5)
setSlotData(backpack[s-ommited], slotID);
if(s - omitedSoFar < 5)
setSlotData(backpack[s-omitedSoFar], slotID);
}
else
{
toOmmit -= art->artType->id;
ommited ++;
toOmit -= art;
omitedSoFar++;
continue;
}
}
}
for( ; s - ommited < 5; s++)
eraseSlotData(backpack[s-ommited], 19 + s);
for( ; s - omitedSoFar < 5; s++)
eraseSlotData(backpack[s-omitedSoFar], 19 + s);
//blocking scrolling if there is not enough artifacts to scroll
leftArtRoll->block(curHero->artifactsInBackpack.size() - ommited <= backpack.size());
rightArtRoll->block(curHero->artifactsInBackpack.size() - ommited <= backpack.size());
bool scrollingPossible = artsInBackpack - omitedSoFar > backpack.size();
leftArtRoll->block(!scrollingPossible);
rightArtRoll->block(!scrollingPossible);
safeRedraw();
@ -5050,9 +5077,17 @@ void CArtifactsOfHero::markPossibleSlots(const CArtifactInstance* art)
*/
void CArtifactsOfHero::unmarkSlots(bool withRedraw /*= true*/)
{
BOOST_FOREACH(CArtifactsOfHero *aoh, commonInfo->participants)
BOOST_FOREACH(CArtPlace *place, aoh->artWorn)
if(commonInfo)
{
BOOST_FOREACH(CArtifactsOfHero *aoh, commonInfo->participants)
BOOST_FOREACH(CArtPlace *place, aoh->artWorn)
place->marked = false;
}
else
{
BOOST_FOREACH(CArtPlace *place, artWorn)
place->marked = false;
}
if(withRedraw)
safeRedraw();
@ -5063,21 +5098,14 @@ void CArtifactsOfHero::unmarkSlots(bool withRedraw /*= true*/)
*/
void CArtifactsOfHero::setSlotData(CArtPlace* artPlace, int slotID)
{
artPlace->slotID = slotID;
artPlace->ourArt = curHero->CArtifactSet::getArt(slotID);
if(!artPlace && slotID >= Arts::BACKPACK_START) //spurious call from artifactMoved in attempt to update hidden backpack slot
{
return;
}
if (artPlace->ourArt)
{
artPlace->text = artPlace->ourArt->artType->Description();
if (artPlace->locked()) // Locks should appear as empty.
artPlace->hoverText = CGI->generaltexth->allTexts[507];
else
artPlace->hoverText = boost::str(boost::format(CGI->generaltexth->heroscrn[1]) % artPlace->ourArt->artType->Name());
}
else
{
eraseSlotData(artPlace, slotID);
}
artPlace->picked = false;
artPlace->slotID = slotID;
artPlace->setArtifact(curHero->getArt(slotID));
}
/**
@ -5085,10 +5113,9 @@ void CArtifactsOfHero::setSlotData(CArtPlace* artPlace, int slotID)
*/
void CArtifactsOfHero::eraseSlotData (CArtPlace* artPlace, int slotID)
{
artPlace->picked = false;
artPlace->slotID = slotID;
artPlace->ourArt = NULL;
artPlace->text = std::string();
artPlace->hoverText = CGI->generaltexth->allTexts[507];
artPlace->setArtifact(NULL);
}
CArtifactsOfHero::CArtifactsOfHero(const Point& position, bool createCommonPart /*= false*/)
@ -5199,13 +5226,11 @@ void CArtifactsOfHero::realizeCurrentTransaction()
void CArtifactsOfHero::artifactMoved(const ArtifactLocation &src, const ArtifactLocation &dst)
{
BOOST_FOREACH(CArtifactsOfHero *aoh, commonInfo->participants) //update affected slots
{
if(src.hero == aoh->curHero)
setSlotData(aoh->getArtPlace(src.slot), src.slot);
if(dst.hero == aoh->curHero)
setSlotData(aoh->getArtPlace(dst.slot), dst.slot);
}
if(src.hero == curHero)
setSlotData(getArtPlace(src.slot), src.slot);
if(dst.hero == curHero)
setSlotData(getArtPlace(dst.slot), dst.slot);
updateParentWindow();
if(commonInfo->src == src) //artifact was taken from us
@ -5247,6 +5272,10 @@ void CArtifactsOfHero::artifactMoved(const ArtifactLocation &src, const Artifact
{
tlog1 << "Unexpected artifact movement...\n";
}
if( src.hero == curHero && src.slot >= Arts::BACKPACK_START
|| dst.hero == curHero && dst.slot >= Arts::BACKPACK_START)
scrollBackpack(0); //update backpack slots
}
CArtPlace * CArtifactsOfHero::getArtPlace(int slot)
@ -5476,6 +5505,8 @@ CExchangeWindow::CExchangeWindow(si32 hero1, si32 hero2) : bg(NULL)
artifs[1]->commonInfo->participants.insert(artifs[1]);
artifs[1]->setHero(heroInst[1]);
artSets.push_back(artifs[0]);
artSets.push_back(artifs[1]);
//primary skills
for(int g=0; g<4; ++g)

View File

@ -700,7 +700,7 @@ public:
void SacrificeBackpack();
void putOnAltar(int backpackIndex);
bool putOnAltar(CTradeableItem* altarSlot, int artID);
bool putOnAltar(CTradeableItem* altarSlot, const CArtifactInstance *art);
void makeDeal();
void showAll(SDL_Surface * to);
@ -719,7 +719,7 @@ public:
void artifactPicked();
int firstFreeSlot();
void moveFromSlotToAltar(int slotID, CTradeableItem* altarSlot, int artID);
void moveFromSlotToAltar(int slotID, CTradeableItem* altarSlot, const CArtifactInstance *art);
};
class CSystemOptionsWindow : public CIntObject
@ -922,6 +922,7 @@ class CArtPlace: public LRClickableAreaWTextComp
public:
int slotID; //0 head 1 shoulders 2 neck 3 right hand 4 left hand 5 torso 6 right ring 7 left ring 8 feet 9 misc. slot 1 10 misc. slot 2 11 misc. slot 3 12 misc. slot 4 13 ballista (war machine 1) 14 ammo cart (war machine 2) 15 first aid tent (war machine 3) 16 catapult 17 spell book 18 misc. slot 5 19+ backpack slots
bool picked;
bool marked;
CArtifactsOfHero * ourOwner;
const CArtifactInstance * ourArt;
@ -938,6 +939,7 @@ public:
bool locked () const;
void setMeAsDest(bool backpackAsVoid = true);
void setArtifact(const CArtifactInstance *art);
~CArtPlace(); //d-tor
};
@ -974,7 +976,7 @@ public:
AdventureMapButton * leftArtRoll, * rightArtRoll;
bool allowedAssembling;
std::multiset<int> artifactsOnAltar; //artifacts id that are technically present in backpack but in GUI are moved to the altar - they'll be ommited in backpack slots
std::multiset<const CArtifactInstance*> artifactsOnAltar; //artifacts id that are technically present in backpack but in GUI are moved to the altar - they'll be ommited in backpack slots
void realizeCurrentTransaction(); //calls callback with parameters stored in commonInfo
void artifactMoved(const ArtifactLocation &src, const ArtifactLocation &dst);
@ -1011,7 +1013,7 @@ public:
~CGarrisonWindow(); //d-tor
};
class CExchangeWindow : public CWindowWithGarrison
class CExchangeWindow : public CWindowWithGarrison, public CWindowWithArtifacts
{
CStatusBar * ourBar; //internal statusbar

View File

@ -10,6 +10,7 @@
#include <boost/algorithm/string/trim.hpp>
#include <boost/bind.hpp>
#include "CHeroHandler.h"
#include "CGeneralTextHandler.h"
#define FOREACH_CONST_PARENT(pname) TCNodes parents; getParents(parents); BOOST_FOREACH(const CBonusSystemNode *pname, parents)
#define FOREACH_PARENT(pname) TNodes parents; getParents(parents); BOOST_FOREACH(CBonusSystemNode *pname, parents)
@ -171,7 +172,7 @@ const Bonus * CBonusSystemNode::getBonus( const CSelector &selector ) const
void CBonusSystemNode::getModifiersWDescr(TModDescr &out, Bonus::BonusType type, int subtype /*= -1 */) const
{
getModifiersWDescr(out, Selector::typeSybtype(type, subtype));
getModifiersWDescr(out, subtype != -1 ? Selector::typeSybtype(type, subtype) : Selector::type(type));
}
void CBonusSystemNode::getModifiersWDescr(TModDescr &out, const CSelector &selector) const
@ -491,6 +492,9 @@ std::string Bonus::Description() const
case CREATURE_ABILITY:
str << VLC->creh->creatures[id]->namePl;
break;
case SECONDARY_SKILL:
str << VLC->generaltexth->skillName[id] << " secondary skill";
break;
}
return str.str();

View File

@ -713,8 +713,10 @@ DLL_EXPORT void EraseArtifact::applyGs( CGameState *gs )
DLL_EXPORT void MoveArtifact::applyGs( CGameState *gs )
{
assert(!dst.getArt());
CArtifactInstance *a = src.getArt();
if(dst.slot < Arts::BACKPACK_START)
assert(!dst.getArt());
a->removeFrom(src.hero, src.slot);
a->putAt(dst.hero, dst.slot);
}

View File

@ -2499,9 +2499,9 @@ bool CGameHandler::moveArtifact(si32 srcHeroID, si32 destHeroID, ui16 srcSlot, u
if(dst.slot >= Arts::BACKPACK_START)
amin(dst.slot, Arts::BACKPACK_START + dst.hero->artifactsInBackpack.size());
// Correction for destination from removing source artifact in backpack.
if (src.slot >= 19 && dst.slot >= 19 && src.slot < dst.slot)
dst.slot--;
// // Correction for destination from removing source artifact in backpack.
// if (src.slot >= 19 && dst.slot >= 19 && src.slot < dst.slot)
// dst.slot--;
if (src.slot == dst.slot)
COMPLAIN_RET("Won't move artifact: Dest same as source!");
@ -3089,9 +3089,10 @@ bool CGameHandler::makeBattleAction( BattleAction &ba )
if( !CStack::isMeleeAttackPossible(curStack, stackAtEnd) )
{
tlog3 << "Attack cannot be performed!";
complain("Attack cannot be performed!");
sendAndApply(&EndAction());
ok = false;
break;
}
//attack
@ -4979,12 +4980,12 @@ void CGameHandler::moveArtifact(const ArtifactLocation &al1, const ArtifactLocat
void CGameHandler::giveHeroNewArtifact(const CGHeroInstance *h, const CArtifact *artType, int pos)
{
CArtifactInstance *a = NULL;
a->artType = artType; //NOT via settype -> all bonus-related stuff must be done by NewArtifact apply
CArtifactInstance *a = new CArtifactInstance();
a->artType = artType; //*NOT* via settype -> all bonus-related stuff must be done by NewArtifact apply
NewArtifact na;
na.art = a;
sendAndApply(&na); // -> updates a!!!
sendAndApply(&na); // -> updates a!!!, will create a on other machines
giveHeroArtifact(h, a, pos);
}