1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-24 08:32:34 +02:00

* swapping artifacts in hero window almost works (artifacts are cloned instead of swapped for some reason)

This commit is contained in:
mateuszb 2009-07-26 15:37:27 +00:00
parent 150a79d643
commit 898d266580
3 changed files with 30 additions and 13 deletions

View File

@ -51,6 +51,8 @@ CHeroWindow::CHeroWindow(int playerColor):
curHero = NULL;
artifs = new CArtifactsOfHero(pos);
artifs->commonInfo = new CArtifactsOfHero::SCommonPart;
artifs->commonInfo->activeArtPlace = NULL;
garr = NULL;
ourBar = new CStatusBar(pos.x+72, pos.y+567, "ADROLLVR.bmp", 660);
@ -143,6 +145,8 @@ CHeroWindow::~CHeroWindow()
delete garr;
delete ourBar;
delete artifs->commonInfo;
artifs->commonInfo = NULL; //to prevent heap corruption
delete artifs;
delete portraitArea;

View File

@ -3316,12 +3316,12 @@ void CArtPlace::clickLeft(boost::logic::tribool down)
{
if(ourArt && ourArt->id == 0)
return; //this is handled separately
if(!ourOwner->activeArtPlace) //nothing has bewn clicked
if(!ourOwner->commonInfo->activeArtPlace) //nothing has been clicked
{
if(ourArt) //to prevent selecting empty slots (bugfix to what GrayFace reported)
{
clicked = true;
ourOwner->activeArtPlace = this;
ourOwner->commonInfo->activeArtPlace = this;
}
}
else //perform artifact substitution
@ -3329,18 +3329,18 @@ void CArtPlace::clickLeft(boost::logic::tribool down)
if(slotID >= 19) //we are an backpack slot - remove active artifact and put it to the last free pos in backpack
{ //TODO: putting artifacts in the middle of backpack (pushing following arts)
LOCPLINT->cb->swapArtifacts(ourOwner->curHero,ourOwner->activeArtPlace->slotID,ourOwner->curHero,ourOwner->curHero->artifacts.size()+19);
LOCPLINT->cb->swapArtifacts(ourOwner->commonInfo->activeArtPlace->ourOwner->curHero, ourOwner->commonInfo->activeArtPlace->slotID, ourOwner->curHero, ourOwner->curHero->artifacts.size()+19);
}
//check if swap is possible
else if(this->fitsHere(ourOwner->activeArtPlace->ourArt) && ourOwner->activeArtPlace->fitsHere(this->ourArt))
else if(this->fitsHere(ourOwner->commonInfo->activeArtPlace->ourArt) && ourOwner->commonInfo->activeArtPlace->fitsHere(this->ourArt))
{
int destSlot = slotID,
srcSlot = ourOwner->activeArtPlace->slotID;
srcSlot = ourOwner->commonInfo->activeArtPlace->slotID;
LOCPLINT->cb->swapArtifacts(ourOwner->curHero,destSlot,ourOwner->curHero,srcSlot);
LOCPLINT->cb->swapArtifacts(ourOwner->curHero,destSlot,ourOwner->commonInfo->activeArtPlace->ourOwner->curHero,srcSlot);
ourOwner->activeArtPlace->clicked = false;
ourOwner->activeArtPlace = NULL;
ourOwner->commonInfo->activeArtPlace->clicked = false;
ourOwner->commonInfo->activeArtPlace = NULL;
}
}
}
@ -3349,7 +3349,7 @@ void CArtPlace::clickLeft(boost::logic::tribool down)
if(ourArt && ourArt->id == 0)
return; //this is handled separately
clicked = false;
ourOwner->activeArtPlace = NULL;
ourOwner->commonInfo->activeArtPlace = NULL;
}
ClickableL::clickLeft(down);
}
@ -3638,7 +3638,7 @@ void CArtifactsOfHero::setHero(const CGHeroInstance * hero)
add->slotID = 19+s;
backpack.push_back(add);
}
activeArtPlace = NULL;
commonInfo->activeArtPlace = NULL;
//blocking scrolling if there is not enough artifacts to scroll
leftArtRoll->block(hero->artifacts.size()<6);
@ -3659,7 +3659,8 @@ void CArtifactsOfHero::dispose()
backpack[g] = NULL;
}
backpack.clear();
activeArtPlace = NULL;
if(commonInfo)
commonInfo->activeArtPlace = NULL;
}
void CArtifactsOfHero::scrollBackpack(int dir)
@ -3681,7 +3682,7 @@ void CArtifactsOfHero::scrollBackpack(int dir)
}
CArtifactsOfHero::CArtifactsOfHero(const SDL_Rect & position) :
activeArtPlace(NULL), backpackPos(0)
backpackPos(0)
{
pos = position;
artWorn.resize(19);
@ -3885,8 +3886,11 @@ CExchangeWindow::CExchangeWindow(si32 hero1, si32 hero2) : bg(NULL)
heroInst[1] = LOCPLINT->cb->getHeroInfo(hero2, 2);
artifs[0] = new CArtifactsOfHero(genRect(600, 800, -334, 150));
artifs[0]->commonInfo = new CArtifactsOfHero::SCommonPart;
artifs[0]->setHero(heroInst[0]);
artifs[0]->commonInfo->activeArtPlace = NULL;
artifs[1] = new CArtifactsOfHero(genRect(600, 800, 96, 150));
artifs[1]->commonInfo = artifs[0]->commonInfo;
artifs[1]->setHero(heroInst[1]);
prepareBackground();
@ -3970,7 +3974,12 @@ CExchangeWindow::~CExchangeWindow() //d-tor
{
SDL_FreeSurface(bg);
delete quit;
//warning: don't experiment with these =NULL lines, they prevent heap corruption!
delete artifs[0]->commonInfo;
artifs[0]->commonInfo = NULL;
delete artifs[0];
artifs[1]->commonInfo = NULL;
delete artifs[1];
delete garr;

View File

@ -644,9 +644,13 @@ class CArtifactsOfHero : public IShowActivable, public CIntObject
std::vector<CArtPlace *> artWorn; // 0 - head; 1 - shoulders; 2 - neck; 3 - right hand; 4 - left hand; 5 - torso; 6 - right ring; 7 - left ring; 8 - feet; 9 - misc1; 10 - misc2; 11 - misc3; 12 - misc4; 13 - mach1; 14 - mach2; 15 - mach3; 16 - mach4; 17 - spellbook; 18 - misc5
std::vector<CArtPlace *> backpack; //hero's visible backpack (only 5 elements!)
int backpackPos; //unmber of first art visible in backpack (in hero's vector)
CArtPlace * activeArtPlace;
public:
struct SCommonPart
{
CArtPlace * activeArtPlace;
} * commonInfo; //when we have more than one CArtifactsOfHero in one window with exchange possibility, we use this (eg. in exchange window); to be provided externally
AdventureMapButton * leftArtRoll, * rightArtRoll;