mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
* showing creature amount in the CCreInfoWindow
* fixes and improvements in dismiss/upgrade dialogs * possibility of moving hero into the garrison * viewing hero window in the town screen
This commit is contained in:
parent
8a6cfa2590
commit
346af53961
@ -1237,7 +1237,7 @@ void CBattleHex::clickRight(boost::logic::tribool down)
|
|||||||
pom->morale = h->getCurrentMorale();
|
pom->morale = h->getCurrentMorale();
|
||||||
pom->currentHealth = myst.firstHPleft;
|
pom->currentHealth = myst.firstHPleft;
|
||||||
}
|
}
|
||||||
(new CCreInfoWindow(myst.creature->idNumber,0,pom,boost::function<void()>(),boost::function<void()>(),NULL))
|
(new CCreInfoWindow(myst.creature->idNumber,0,myst.amount,pom,boost::function<void()>(),boost::function<void()>(),NULL))
|
||||||
->activate();
|
->activate();
|
||||||
}
|
}
|
||||||
delete pom;
|
delete pom;
|
||||||
|
@ -498,3 +498,9 @@ bool CCallback::battleCanShoot(int ID, int dest) //TODO: finish
|
|||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CCallback::swapGarrisonHero( const CGTownInstance *town )
|
||||||
|
{
|
||||||
|
if(town->tempOwner != player) return;
|
||||||
|
*cl->serv << ui16(508) << si32(town->id);
|
||||||
|
}
|
@ -39,6 +39,7 @@ public:
|
|||||||
virtual bool dismissCreature(const CArmedInstance *obj, int stackPos)=0;
|
virtual bool dismissCreature(const CArmedInstance *obj, int stackPos)=0;
|
||||||
virtual bool upgradeCreature(const CArmedInstance *obj, int stackPos, int newID=-1)=0; //if newID==-1 then best possible upgrade will be made
|
virtual bool upgradeCreature(const CArmedInstance *obj, int stackPos, int newID=-1)=0; //if newID==-1 then best possible upgrade will be made
|
||||||
virtual void endTurn()=0;
|
virtual void endTurn()=0;
|
||||||
|
virtual void swapGarrisonHero(const CGTownInstance *town)=0;
|
||||||
|
|
||||||
//get info
|
//get info
|
||||||
virtual bool verifyPath(CPath * path, bool blockSea)=0;
|
virtual bool verifyPath(CPath * path, bool blockSea)=0;
|
||||||
@ -111,6 +112,7 @@ public:
|
|||||||
bool dismissCreature(const CArmedInstance *obj, int stackPos);
|
bool dismissCreature(const CArmedInstance *obj, int stackPos);
|
||||||
bool upgradeCreature(const CArmedInstance *obj, int stackPos, int newID=-1);
|
bool upgradeCreature(const CArmedInstance *obj, int stackPos, int newID=-1);
|
||||||
void endTurn();
|
void endTurn();
|
||||||
|
void swapGarrisonHero(const CGTownInstance *town);
|
||||||
|
|
||||||
//get info
|
//get info
|
||||||
bool verifyPath(CPath * path, bool blockSea);
|
bool verifyPath(CPath * path, bool blockSea);
|
||||||
|
@ -14,6 +14,9 @@
|
|||||||
#include "hch/CGeneralTextHandler.h"
|
#include "hch/CGeneralTextHandler.h"
|
||||||
#include "CCallback.h"
|
#include "CCallback.h"
|
||||||
#include "client/Graphics.h"
|
#include "client/Graphics.h"
|
||||||
|
#include "CHeroWindow.h"
|
||||||
|
#include <boost/algorithm/string.hpp>
|
||||||
|
#include <boost/algorithm/string/replace.hpp>
|
||||||
extern TTF_Font * GEOR16;
|
extern TTF_Font * GEOR16;
|
||||||
CBuildingRect::CBuildingRect(Structure *Str)
|
CBuildingRect::CBuildingRect(Structure *Str)
|
||||||
:str(Str), moi(false), offset(0)
|
:str(Str), moi(false), offset(0)
|
||||||
@ -170,7 +173,116 @@ void CBuildingRect::mouseMoved (SDL_MouseMotionEvent & sEvent)
|
|||||||
//if(border)
|
//if(border)
|
||||||
// blitAt(border,pos.x,pos.y);
|
// blitAt(border,pos.x,pos.y);
|
||||||
}
|
}
|
||||||
|
void CHeroGSlot::hover (bool on)
|
||||||
|
{
|
||||||
|
if(!on) return;
|
||||||
|
CHeroGSlot *other = upg ? &owner->hslotup : &owner->hslotdown;
|
||||||
|
std::string temp;
|
||||||
|
if(hero)
|
||||||
|
{
|
||||||
|
if(highlight)//view NNN
|
||||||
|
{
|
||||||
|
temp = CGI->townh->tcommands[4];
|
||||||
|
boost::algorithm::replace_first(temp,"%s",hero->name);
|
||||||
|
}
|
||||||
|
else if(other->hero && other->highlight)//exchange
|
||||||
|
{
|
||||||
|
temp = CGI->townh->tcommands[7];
|
||||||
|
boost::algorithm::replace_first(temp,"%s",hero->name);
|
||||||
|
boost::algorithm::replace_first(temp,"%s",other->hero->name);
|
||||||
|
}
|
||||||
|
else// select NNN (in ZZZ)
|
||||||
|
{
|
||||||
|
if(upg)//down - visiting
|
||||||
|
{
|
||||||
|
temp = CGI->townh->tcommands[32];
|
||||||
|
boost::algorithm::replace_first(temp,"%s",hero->name);
|
||||||
|
}
|
||||||
|
else //up - garrison
|
||||||
|
{
|
||||||
|
temp = CGI->townh->tcommands[12];
|
||||||
|
boost::algorithm::replace_first(temp,"%s",hero->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else //we are empty slot
|
||||||
|
{
|
||||||
|
if(other->highlight && other->hero) //move NNNN
|
||||||
|
{
|
||||||
|
temp = CGI->townh->tcommands[6];
|
||||||
|
boost::algorithm::replace_first(temp,"%s",other->hero->name);
|
||||||
|
}
|
||||||
|
else //empty
|
||||||
|
{
|
||||||
|
temp = CGI->generaltexth->allTexts[507];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(temp.size())
|
||||||
|
LOCPLINT->statusbar->print(temp);
|
||||||
|
}
|
||||||
|
void CHeroGSlot::clickRight (boost::logic::tribool down)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
void CHeroGSlot::clickLeft(boost::logic::tribool down)
|
||||||
|
{
|
||||||
|
if(!down)
|
||||||
|
{
|
||||||
|
CHeroGSlot *other = upg ? &owner->hslotup : &owner->hslotdown;
|
||||||
|
if(hero && highlight)
|
||||||
|
{
|
||||||
|
highlight = false;
|
||||||
|
LOCPLINT->openHeroWindow(hero);
|
||||||
|
LOCPLINT->adventureInt->heroWindow->quitButton->callback += boost::bind(&CCastleInterface::showAll,owner,screen,true);
|
||||||
|
}
|
||||||
|
else if(hero)
|
||||||
|
{
|
||||||
|
highlight = true;
|
||||||
|
owner->showAll();
|
||||||
|
}
|
||||||
|
else if(other->hero, other->highlight)
|
||||||
|
{
|
||||||
|
other->highlight = highlight = false;
|
||||||
|
LOCPLINT->cb->swapGarrisonHero(owner->town);
|
||||||
|
}
|
||||||
|
hover(false);hover(true); //refresh statusbar
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void CHeroGSlot::activate()
|
||||||
|
{
|
||||||
|
ClickableL::activate();
|
||||||
|
ClickableR::activate();
|
||||||
|
Hoverable::activate();
|
||||||
|
}
|
||||||
|
void CHeroGSlot::deactivate()
|
||||||
|
{
|
||||||
|
ClickableL::deactivate();
|
||||||
|
ClickableR::deactivate();
|
||||||
|
Hoverable::deactivate();
|
||||||
|
}
|
||||||
|
void CHeroGSlot::show()
|
||||||
|
{
|
||||||
|
if(hero) //there is hero
|
||||||
|
blitAt(graphics->portraitLarge[hero->portrait],pos);
|
||||||
|
else if(!upg) //up garrison
|
||||||
|
blitAt((static_cast<CCastleInterface*>(LOCPLINT->curint))->flag->ourImages[(static_cast<CCastleInterface*>(LOCPLINT->curint))->town->getOwner()].bitmap,pos);
|
||||||
|
if(highlight)
|
||||||
|
blitAt(graphics->bigImgs[-1],pos);
|
||||||
|
}
|
||||||
|
CHeroGSlot::CHeroGSlot(int x, int y, int updown, const CGHeroInstance *h, CCastleInterface * Owner)
|
||||||
|
{
|
||||||
|
owner = Owner;
|
||||||
|
pos.x = x;
|
||||||
|
pos.y = y;
|
||||||
|
pos.w = 58;
|
||||||
|
pos.h = 64;
|
||||||
|
hero = h;
|
||||||
|
upg = updown;
|
||||||
|
highlight = false;
|
||||||
|
}
|
||||||
|
CHeroGSlot::~CHeroGSlot()
|
||||||
|
{
|
||||||
|
}
|
||||||
std::string getBgName(int type) //TODO - co z tym zrobiæ?
|
std::string getBgName(int type) //TODO - co z tym zrobiæ?
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
@ -213,6 +325,7 @@ public:
|
|||||||
} srthlp ;
|
} srthlp ;
|
||||||
|
|
||||||
CCastleInterface::CCastleInterface(const CGTownInstance * Town, bool Activate)
|
CCastleInterface::CCastleInterface(const CGTownInstance * Town, bool Activate)
|
||||||
|
:hslotup(241,387,0,Town->garrisonHero,this),hslotdown(241,483,1,Town->visitingHero,this)
|
||||||
{
|
{
|
||||||
hall = NULL;
|
hall = NULL;
|
||||||
townInt = BitmapHandler::loadBitmap("TOWNSCRN.bmp");
|
townInt = BitmapHandler::loadBitmap("TOWNSCRN.bmp");
|
||||||
@ -375,7 +488,7 @@ void CCastleInterface::enterHall()
|
|||||||
hallInt->activate();
|
hallInt->activate();
|
||||||
hallInt->show();
|
hallInt->show();
|
||||||
}
|
}
|
||||||
void CCastleInterface::showAll(SDL_Surface * to)
|
void CCastleInterface::showAll( SDL_Surface * to/*=NULL*/, bool forceTotalRedraw /*= false*/)
|
||||||
{
|
{
|
||||||
if (!to)
|
if (!to)
|
||||||
to=screen;
|
to=screen;
|
||||||
@ -445,11 +558,15 @@ void CCastleInterface::showAll(SDL_Surface * to)
|
|||||||
pom++;
|
pom++;
|
||||||
blitAt(graphics->bigTownPic->ourImages[pom].bitmap,15,387,to);
|
blitAt(graphics->bigTownPic->ourImages[pom].bitmap,15,387,to);
|
||||||
|
|
||||||
//flag
|
hslotup.show();
|
||||||
if(town->getOwner()<PLAYER_LIMIT)
|
hslotdown.show();
|
||||||
blitAt(flag->ourImages[town->getOwner()].bitmap,241,387,to);
|
|
||||||
|
|
||||||
|
pom=false;
|
||||||
|
if(forceTotalRedraw && !showing)
|
||||||
|
pom = showing = true;
|
||||||
show();
|
show();
|
||||||
|
if(pom)
|
||||||
|
showing = false;
|
||||||
}
|
}
|
||||||
void CCastleInterface::townChange()
|
void CCastleInterface::townChange()
|
||||||
{
|
{
|
||||||
@ -466,7 +583,7 @@ void CCastleInterface::show(SDL_Surface * to)
|
|||||||
if (!to)
|
if (!to)
|
||||||
to=screen;
|
to=screen;
|
||||||
count++;
|
count++;
|
||||||
if(count==4)
|
if(count==8)
|
||||||
{
|
{
|
||||||
count=0;
|
count=0;
|
||||||
animval++;
|
animval++;
|
||||||
@ -503,6 +620,8 @@ void CCastleInterface::activate()
|
|||||||
split->activate();
|
split->activate();
|
||||||
for(int i=0;i<buildings.size();i++)
|
for(int i=0;i<buildings.size();i++)
|
||||||
buildings[i]->activate();
|
buildings[i]->activate();
|
||||||
|
hslotdown.activate();
|
||||||
|
hslotup.activate();
|
||||||
}
|
}
|
||||||
void CCastleInterface::deactivate()
|
void CCastleInterface::deactivate()
|
||||||
{
|
{
|
||||||
@ -513,6 +632,8 @@ void CCastleInterface::deactivate()
|
|||||||
split->deactivate();
|
split->deactivate();
|
||||||
for(int i=0;i<buildings.size();i++)
|
for(int i=0;i<buildings.size();i++)
|
||||||
buildings[i]->deactivate();
|
buildings[i]->deactivate();
|
||||||
|
hslotdown.deactivate();
|
||||||
|
hslotup.deactivate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCastleInterface::addBuilding(int bid)
|
void CCastleInterface::addBuilding(int bid)
|
||||||
|
@ -28,6 +28,24 @@ public:
|
|||||||
void mouseMoved (SDL_MouseMotionEvent & sEvent);
|
void mouseMoved (SDL_MouseMotionEvent & sEvent);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CHeroGSlot : public ClickableL, public ClickableR, public Hoverable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CCastleInterface *owner;
|
||||||
|
const CGHeroInstance *hero;
|
||||||
|
int upg; //0 - up garrison, 1 - down garrison
|
||||||
|
bool highlight;
|
||||||
|
|
||||||
|
void hover (bool on);
|
||||||
|
void clickRight (boost::logic::tribool down);
|
||||||
|
void clickLeft(boost::logic::tribool down);
|
||||||
|
void activate();
|
||||||
|
void deactivate();
|
||||||
|
void show();
|
||||||
|
CHeroGSlot(int x, int y, int updown, const CGHeroInstance *h,CCastleInterface * Owner);
|
||||||
|
~CHeroGSlot();
|
||||||
|
};
|
||||||
|
|
||||||
class CCastleInterface : public IShowable, public IActivable
|
class CCastleInterface : public IShowable, public IActivable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -44,6 +62,7 @@ public:
|
|||||||
CDefEssential* bicons; //150x70 buildings imgs
|
CDefEssential* bicons; //150x70 buildings imgs
|
||||||
CTownList * townlist;
|
CTownList * townlist;
|
||||||
|
|
||||||
|
CHeroGSlot hslotup, hslotdown;
|
||||||
CGarrisonInt * garr;
|
CGarrisonInt * garr;
|
||||||
AdventureMapButton *exit;
|
AdventureMapButton *exit;
|
||||||
AdventureMapButton *split;
|
AdventureMapButton *split;
|
||||||
@ -54,7 +73,7 @@ public:
|
|||||||
~CCastleInterface();
|
~CCastleInterface();
|
||||||
void townChange();
|
void townChange();
|
||||||
void show(SDL_Surface * to=NULL);
|
void show(SDL_Surface * to=NULL);
|
||||||
void showAll(SDL_Surface * to=NULL);
|
void showAll(SDL_Surface * to=NULL, bool forceTotalRedraw = false);
|
||||||
void buildingClicked(int building);
|
void buildingClicked(int building);
|
||||||
void enterHall();
|
void enterHall();
|
||||||
void close();
|
void close();
|
||||||
|
@ -59,6 +59,7 @@ public:
|
|||||||
virtual void garrisonChanged(const CGObjectInstance * obj){};
|
virtual void garrisonChanged(const CGObjectInstance * obj){};
|
||||||
virtual void buildChanged(const CGTownInstance *town, int buildingID, int what){}; //what: 1 - built, 2 - demolished
|
virtual void buildChanged(const CGTownInstance *town, int buildingID, int what){}; //what: 1 - built, 2 - demolished
|
||||||
virtual void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback)=0; //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id
|
virtual void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback)=0; //pskill is gained primary skill, interface has to choose one of given skills and call callback with selection id
|
||||||
|
virtual void heroInGarrisonChange(const CGTownInstance *town){};
|
||||||
//battle call-ins
|
//battle call-ins
|
||||||
virtual void battleStart(CCreatureSet *army1, CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side){}; //called by engine when battle starts; side=0 - left, side=1 - right
|
virtual void battleStart(CCreatureSet *army1, CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side){}; //called by engine when battle starts; side=0 - left, side=1 - right
|
||||||
virtual void battlefieldPrepared(int battlefieldType, std::vector<CObstacle*> obstacles){}; //called when battlefield is prepared, prior the battle beginning
|
virtual void battlefieldPrepared(int battlefieldType, std::vector<CObstacle*> obstacles){}; //called when battlefield is prepared, prior the battle beginning
|
||||||
|
@ -431,6 +431,27 @@ void CGameState::applyNL(IPack * pack)
|
|||||||
static_cast<CGTownInstance*>(map->objects[sac->tid])->strInfo.creatures = sac->creatures;
|
static_cast<CGTownInstance*>(map->objects[sac->tid])->strInfo.creatures = sac->creatures;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 508:
|
||||||
|
{
|
||||||
|
SetHeroesInTown *sac = static_cast<SetHeroesInTown*>(pack);
|
||||||
|
CGTownInstance *t = getTown(sac->tid);
|
||||||
|
CGHeroInstance *v = getHero(sac->visiting), *g = getHero(sac->garrison);
|
||||||
|
t->visitingHero = v;
|
||||||
|
t->garrisonHero = g;
|
||||||
|
if(v)
|
||||||
|
{
|
||||||
|
v->visitedTown = t;
|
||||||
|
v->inTownGarrison = false;
|
||||||
|
map->addBlockVisTiles(v);
|
||||||
|
}
|
||||||
|
if(g)
|
||||||
|
{
|
||||||
|
g->visitedTown = t;
|
||||||
|
g->inTownGarrison = true;
|
||||||
|
map->removeBlockVisTiles(g);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 1001://set object property
|
case 1001://set object property
|
||||||
{
|
{
|
||||||
SetObjectProperty *p = static_cast<SetObjectProperty*>(pack);
|
SetObjectProperty *p = static_cast<SetObjectProperty*>(pack);
|
||||||
|
@ -518,7 +518,7 @@ void CHeroWindow::quit()
|
|||||||
}
|
}
|
||||||
deactivate();
|
deactivate();
|
||||||
|
|
||||||
LOCPLINT->adventureInt->activate();
|
LOCPLINT->curint->activate();
|
||||||
|
|
||||||
SDL_FreeSurface(curBack);
|
SDL_FreeSurface(curBack);
|
||||||
curBack = NULL;
|
curBack = NULL;
|
||||||
@ -544,7 +544,7 @@ void CHeroWindow::quit()
|
|||||||
|
|
||||||
void CHeroWindow::activate()
|
void CHeroWindow::activate()
|
||||||
{
|
{
|
||||||
LOCPLINT->curint = this;
|
//LOCPLINT->curint = this;
|
||||||
quitButton->activate();
|
quitButton->activate();
|
||||||
dismissButton->activate();
|
dismissButton->activate();
|
||||||
questlogButton->activate();
|
questlogButton->activate();
|
||||||
|
@ -91,9 +91,6 @@ class CHeroWindow: public IActivable, public IShowable, public virtual CIntObjec
|
|||||||
CDefHandler *flags;
|
CDefHandler *flags;
|
||||||
|
|
||||||
//buttons
|
//buttons
|
||||||
AdventureMapButton * quitButton, * dismissButton, * questlogButton, //general
|
|
||||||
* gar1button, * gar2button, * gar3button, //garrison / formation handling
|
|
||||||
* leftArtRoll, * rightArtRoll;
|
|
||||||
AdventureMapButton * gar4button; //splitting
|
AdventureMapButton * gar4button; //splitting
|
||||||
//std::vector< AdventureMapButton<CHeroWindow> * > heroList; //list of heroes
|
//std::vector< AdventureMapButton<CHeroWindow> * > heroList; //list of heroes
|
||||||
std::vector<LClickableAreaHero *> heroListMi; //new better list of heroes
|
std::vector<LClickableAreaHero *> heroListMi; //new better list of heroes
|
||||||
@ -114,6 +111,9 @@ class CHeroWindow: public IActivable, public IShowable, public virtual CIntObjec
|
|||||||
LRClickableAreaWText * spellPointsArea;
|
LRClickableAreaWText * spellPointsArea;
|
||||||
std::vector<LRClickableAreaWTextComp *> secSkillAreas;
|
std::vector<LRClickableAreaWTextComp *> secSkillAreas;
|
||||||
public:
|
public:
|
||||||
|
AdventureMapButton * quitButton, * dismissButton, * questlogButton, //general
|
||||||
|
* gar1button, * gar2button, * gar3button, //garrison / formation handling
|
||||||
|
* leftArtRoll, * rightArtRoll;
|
||||||
int player;
|
int player;
|
||||||
CHeroWindow(int playerColor); //c-tor
|
CHeroWindow(int playerColor); //c-tor
|
||||||
~CHeroWindow(); //d-tor
|
~CHeroWindow(); //d-tor
|
||||||
|
2
CLua.cpp
2
CLua.cpp
@ -291,12 +291,12 @@ void CVisitableOPH::onNAHeroVisit(int objid, int heroID, bool alreadyVisited)
|
|||||||
}
|
}
|
||||||
case 100: //give 1000 exp
|
case 100: //give 1000 exp
|
||||||
{
|
{
|
||||||
cb->changePrimSkill(heroID,w,vvv);
|
|
||||||
InfoWindow iw;
|
InfoWindow iw;
|
||||||
iw.components.push_back(Component(0,4,vvv,0));
|
iw.components.push_back(Component(0,4,vvv,0));
|
||||||
iw.player = cb->getHeroOwner(heroID);
|
iw.player = cb->getHeroOwner(heroID);
|
||||||
iw.text << std::pair<ui8,ui32>(11,ot);
|
iw.text << std::pair<ui8,ui32>(11,ot);
|
||||||
cb->showInfoDialog(&iw);
|
cb->showInfoDialog(&iw);
|
||||||
|
cb->changePrimSkill(heroID,w,vvv);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -137,8 +137,9 @@ void CGarrisonSlot::clickRight (tribool down)
|
|||||||
pom->luck = h->getCurrentLuck();
|
pom->luck = h->getCurrentLuck();
|
||||||
pom->morale = h->getCurrentMorale();
|
pom->morale = h->getCurrentMorale();
|
||||||
}
|
}
|
||||||
(new CCreInfoWindow(creature->idNumber,0,pom,boost::function<void()>(),boost::function<void()>(),NULL))
|
(new CCreInfoWindow(creature->idNumber,0,count,pom,boost::function<void()>(),boost::function<void()>(),NULL))
|
||||||
->activate();
|
->activate();
|
||||||
|
//LOCPLINT->curint->deactivate();
|
||||||
}
|
}
|
||||||
delete pom;
|
delete pom;
|
||||||
}
|
}
|
||||||
@ -160,16 +161,18 @@ void CGarrisonSlot::clickLeft(tribool down)
|
|||||||
if(pom.oldID>=0)
|
if(pom.oldID>=0)
|
||||||
{
|
{
|
||||||
(new CCreInfoWindow
|
(new CCreInfoWindow
|
||||||
(creature->idNumber,1,NULL,
|
(creature->idNumber,1,count,NULL,
|
||||||
boost::bind(&CCallback::upgradeCreature,LOCPLINT->cb,getObj(),ID,pom.newID[0]), //if upgrade is possible we'll bind proper function in callback
|
boost::bind(&CCallback::upgradeCreature,LOCPLINT->cb,getObj(),ID,pom.newID[0]), //if upgrade is possible we'll bind proper function in callback
|
||||||
boost::bind(&CCallback::dismissCreature,LOCPLINT->cb,getObj(),ID),&pom))
|
boost::bind(&CCallback::dismissCreature,LOCPLINT->cb,getObj(),ID),&pom))
|
||||||
->activate();
|
->activate();
|
||||||
|
LOCPLINT->curint->deactivate();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(new CCreInfoWindow
|
(new CCreInfoWindow
|
||||||
(creature->idNumber,1,NULL,0, boost::bind(&CCallback::dismissCreature,LOCPLINT->cb,getObj(),ID),NULL) )
|
(creature->idNumber,1,count,NULL,0, boost::bind(&CCallback::dismissCreature,LOCPLINT->cb,getObj(),ID),NULL) )
|
||||||
->activate();
|
->activate();
|
||||||
|
LOCPLINT->curint->deactivate();
|
||||||
}
|
}
|
||||||
owner->highlighted = NULL;
|
owner->highlighted = NULL;
|
||||||
show();
|
show();
|
||||||
@ -387,6 +390,8 @@ void CGarrisonInt::deleteSlots()
|
|||||||
delete (*sup)[i];
|
delete (*sup)[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete sup;
|
||||||
|
sup = NULL;
|
||||||
}
|
}
|
||||||
if(sdown)
|
if(sdown)
|
||||||
{
|
{
|
||||||
@ -397,6 +402,8 @@ void CGarrisonInt::deleteSlots()
|
|||||||
delete (*sdown)[i];
|
delete (*sdown)[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete sdown;
|
||||||
|
sdown = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void CGarrisonInt::recreateSlots()
|
void CGarrisonInt::recreateSlots()
|
||||||
@ -484,6 +491,7 @@ void CInfoWindow::close()
|
|||||||
{
|
{
|
||||||
deactivate();
|
deactivate();
|
||||||
delete this;
|
delete this;
|
||||||
|
LOCPLINT->showingDialog->setn(false);
|
||||||
}
|
}
|
||||||
void CInfoWindow::show(SDL_Surface * to)
|
void CInfoWindow::show(SDL_Surface * to)
|
||||||
{
|
{
|
||||||
@ -494,8 +502,11 @@ void CInfoWindow::show(SDL_Surface * to)
|
|||||||
|
|
||||||
CInfoWindow::~CInfoWindow()
|
CInfoWindow::~CInfoWindow()
|
||||||
{
|
{
|
||||||
for (int i=0;i<components.size();i++)
|
if(delComps)
|
||||||
delete components[i];
|
{
|
||||||
|
for (int i=0;i<components.size();i++)
|
||||||
|
delete components[i];
|
||||||
|
}
|
||||||
for(int i=0;i<buttons.size();i++)
|
for(int i=0;i<buttons.size();i++)
|
||||||
delete buttons[i];
|
delete buttons[i];
|
||||||
}
|
}
|
||||||
@ -966,10 +977,12 @@ CPlayerInterface::CPlayerInterface(int Player, int serial)
|
|||||||
serialID=serial;
|
serialID=serial;
|
||||||
human=true;
|
human=true;
|
||||||
pim = new boost::mutex;
|
pim = new boost::mutex;
|
||||||
|
showingDialog = new CondSh<bool>(false);
|
||||||
}
|
}
|
||||||
CPlayerInterface::~CPlayerInterface()
|
CPlayerInterface::~CPlayerInterface()
|
||||||
{
|
{
|
||||||
delete pim;
|
delete pim;
|
||||||
|
delete showingDialog;
|
||||||
}
|
}
|
||||||
void CPlayerInterface::init(ICallback * CB)
|
void CPlayerInterface::init(ICallback * CB)
|
||||||
{
|
{
|
||||||
@ -1929,11 +1942,53 @@ void CPlayerInterface::showSelDialog(std::string &text, std::vector<Component*>
|
|||||||
}
|
}
|
||||||
void CPlayerInterface::heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16>& skills, boost::function<void(ui32)> &callback)
|
void CPlayerInterface::heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16>& skills, boost::function<void(ui32)> &callback)
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
boost::unique_lock<boost::mutex> un(showingDialog->mx);
|
||||||
|
while(showingDialog->data)
|
||||||
|
showingDialog->cond.wait(un);
|
||||||
|
}
|
||||||
boost::unique_lock<boost::mutex> un(*pim);
|
boost::unique_lock<boost::mutex> un(*pim);
|
||||||
CLevelWindow *lw = new CLevelWindow(hero,pskill,skills,callback);
|
CLevelWindow *lw = new CLevelWindow(hero,pskill,skills,callback);
|
||||||
curint->deactivate();
|
curint->deactivate();
|
||||||
lw->activate();
|
lw->activate();
|
||||||
}
|
}
|
||||||
|
void CPlayerInterface::heroInGarrisonChange(const CGTownInstance *town)
|
||||||
|
{
|
||||||
|
boost::unique_lock<boost::mutex> un(*pim);
|
||||||
|
//redraw infowindow
|
||||||
|
SDL_FreeSurface(graphics->townWins[town->subID]);
|
||||||
|
graphics->townWins[town->subID] = infoWin(town);
|
||||||
|
if(town->garrisonHero)
|
||||||
|
{
|
||||||
|
CGI->mh->hideObject(town->garrisonHero);
|
||||||
|
for(int i=0; i<adventureInt->heroList.items.size();i++)
|
||||||
|
{
|
||||||
|
if(adventureInt->heroList.items[i].first == town->garrisonHero)
|
||||||
|
{
|
||||||
|
adventureInt->heroList.items.erase(adventureInt->heroList.items.begin()+i);
|
||||||
|
if(adventureInt->heroList.selected >= adventureInt->heroList.items.size())
|
||||||
|
adventureInt->heroList.selected--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(town->visitingHero)
|
||||||
|
{
|
||||||
|
CGI->mh->printObject(town->visitingHero);
|
||||||
|
adventureInt->heroList.items.push_back(std::pair<const CGHeroInstance*, CPath *>(town->visitingHero,NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
CCastleInterface *c = dynamic_cast<CCastleInterface*>(curint);
|
||||||
|
if(c)
|
||||||
|
{
|
||||||
|
c->garr->highlighted = NULL;
|
||||||
|
c->hslotup.hero = town->garrisonHero;
|
||||||
|
c->garr->odown = c->hslotdown.hero = town->visitingHero;
|
||||||
|
c->garr->set2 = town->visitingHero ? &town->visitingHero->army : NULL;
|
||||||
|
c->garr->recreateSlots();
|
||||||
|
c->showAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
void CPlayerInterface::heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town)
|
void CPlayerInterface::heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town)
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::mutex> un(*pim);
|
boost::unique_lock<boost::mutex> un(*pim);
|
||||||
@ -2098,6 +2153,7 @@ void CPlayerInterface::showInfoDialog(std::string &text, std::vector<Component*>
|
|||||||
}
|
}
|
||||||
void CPlayerInterface::showInfoDialog(std::string &text, std::vector<SComponent*> & components)
|
void CPlayerInterface::showInfoDialog(std::string &text, std::vector<SComponent*> & components)
|
||||||
{
|
{
|
||||||
|
showingDialog->set(true);
|
||||||
curint->deactivate(); //dezaktywacja starego interfejsu
|
curint->deactivate(); //dezaktywacja starego interfejsu
|
||||||
|
|
||||||
std::vector<std::pair<std::string,CFunctionList<void()> > > pom;
|
std::vector<std::pair<std::string,CFunctionList<void()> > > pom;
|
||||||
@ -2108,18 +2164,24 @@ void CPlayerInterface::showInfoDialog(std::string &text, std::vector<SComponent*
|
|||||||
temp->activate();
|
temp->activate();
|
||||||
LOCPLINT->objsToBlit.push_back(temp);
|
LOCPLINT->objsToBlit.push_back(temp);
|
||||||
}
|
}
|
||||||
void CPlayerInterface::showYesNoDialog(std::string &text, std::vector<SComponent*> & components, CFunctionList<void()> onYes, CFunctionList<void()> onNo, bool deactivateCur)
|
void CPlayerInterface::showYesNoDialog(std::string &text, std::vector<SComponent*> & components, CFunctionList<void()> onYes, CFunctionList<void()> onNo, bool deactivateCur, bool DelComps)
|
||||||
{
|
{
|
||||||
if(deactivateCur)
|
if(deactivateCur)
|
||||||
curint->deactivate(); //dezaktywacja starego interfejsu
|
curint->deactivate(); //dezaktywacja starego interfejsu
|
||||||
std::vector<std::pair<std::string,CFunctionList<void()> > > pom;
|
std::vector<std::pair<std::string,CFunctionList<void()> > > pom;
|
||||||
pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",onYes));
|
pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",0));
|
||||||
pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",onNo));
|
pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",0));
|
||||||
CInfoWindow * temp = new CInfoWindow(text,playerID,32,components,pom);
|
CInfoWindow * temp = new CInfoWindow(text,playerID,32,components,pom);
|
||||||
if(onYes)
|
temp->delComps = DelComps;
|
||||||
temp->buttons[0]->callback += boost::bind(&CInfoWindow::close,temp);
|
for(int i=0;i<onYes.funcs.size();i++)
|
||||||
if(onNo)
|
temp->buttons[0]->callback += onYes.funcs[i];
|
||||||
temp->buttons[1]->callback += boost::bind(&CInfoWindow::close,temp);
|
for(int i=0;i<onNo.funcs.size();i++)
|
||||||
|
temp->buttons[1]->callback += onNo.funcs[i];
|
||||||
|
|
||||||
|
//if(onYes)
|
||||||
|
// temp->buttons[0]->callback += boost::bind(&CInfoWindow::close,temp);
|
||||||
|
//if(onNo)
|
||||||
|
// temp->buttons[1]->callback += boost::bind(&CInfoWindow::close,temp);
|
||||||
temp->activate();
|
temp->activate();
|
||||||
LOCPLINT->objsToBlit.push_back(temp);
|
LOCPLINT->objsToBlit.push_back(temp);
|
||||||
}
|
}
|
||||||
@ -2141,7 +2203,7 @@ void CPlayerInterface::openHeroWindow(const CGHeroInstance *hero)
|
|||||||
{
|
{
|
||||||
adventureInt->heroWindow->setHero(hero);
|
adventureInt->heroWindow->setHero(hero);
|
||||||
this->objsToBlit.push_back(adventureInt->heroWindow);
|
this->objsToBlit.push_back(adventureInt->heroWindow);
|
||||||
adventureInt->hide();
|
curint->deactivate();
|
||||||
adventureInt->heroWindow->activate();
|
adventureInt->heroWindow->activate();
|
||||||
}
|
}
|
||||||
CStatusBar::CStatusBar(int x, int y, std::string name, int maxw)
|
CStatusBar::CStatusBar(int x, int y, std::string name, int maxw)
|
||||||
@ -2797,7 +2859,7 @@ void CRecrutationWindow::show(SDL_Surface * to)
|
|||||||
curx = pos.x + 192 + 102 - (102*creatures.size()/2) - (18*(creatures.size()-1)/2);
|
curx = pos.x + 192 + 102 - (102*creatures.size()/2) - (18*(creatures.size()-1)/2);
|
||||||
for(int i=0;i<creatures.size();i++)
|
for(int i=0;i<creatures.size();i++)
|
||||||
{
|
{
|
||||||
creatures[i].pic->blitPic(screen,curx-50,pos.y+130-65,!(c%2));
|
creatures[i].pic->blitPic(screen,curx-50,pos.y+130-65,!(c%4));
|
||||||
curx += 120;
|
curx += 120;
|
||||||
}
|
}
|
||||||
c++;
|
c++;
|
||||||
@ -2966,8 +3028,11 @@ void CCreInfoWindow::show(SDL_Surface * to)
|
|||||||
{
|
{
|
||||||
char pom[15];
|
char pom[15];
|
||||||
blitAt(bitmap,pos.x,pos.y,screen);
|
blitAt(bitmap,pos.x,pos.y,screen);
|
||||||
anim->blitPic(screen,pos.x+21,pos.y+48,(type) && anf%4);
|
anim->blitPic(screen,pos.x+21,pos.y+48,(type) && !(anf%4));
|
||||||
anf++;
|
if(++anf==4)
|
||||||
|
anf=0;
|
||||||
|
if(count.size())
|
||||||
|
printTo(count.c_str(),pos.x+114,pos.y+174,GEOR16,zwykly);
|
||||||
if(upgrade)
|
if(upgrade)
|
||||||
upgrade->show();
|
upgrade->show();
|
||||||
if(dismiss)
|
if(dismiss)
|
||||||
@ -2976,9 +3041,11 @@ void CCreInfoWindow::show(SDL_Surface * to)
|
|||||||
ok->show();
|
ok->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
CCreInfoWindow::CCreInfoWindow(int Cid, int Type, StackState *State, boost::function<void()> Upg, boost::function<void()> Dsm, UpgradeInfo *ui)
|
CCreInfoWindow::CCreInfoWindow(int Cid, int Type, int creatureCount, StackState *State, boost::function<void()> Upg, boost::function<void()> Dsm, UpgradeInfo *ui)
|
||||||
:ok(0),dismiss(0),upgrade(0),type(Type),dsm(Dsm),dependant(0)
|
:ok(0),dismiss(0),upgrade(0),type(Type),dsm(Dsm),dependant(0)
|
||||||
{
|
{
|
||||||
|
active = false;
|
||||||
|
anf = 0;
|
||||||
c = &CGI->creh->creatures[Cid];
|
c = &CGI->creh->creatures[Cid];
|
||||||
bitmap = BitmapHandler::loadBitmap("CRSTKPU.bmp");
|
bitmap = BitmapHandler::loadBitmap("CRSTKPU.bmp");
|
||||||
pos.x = screen->w/2 - bitmap->w/2;
|
pos.x = screen->w/2 - bitmap->w/2;
|
||||||
@ -2991,6 +3058,13 @@ CCreInfoWindow::CCreInfoWindow(int Cid, int Type, StackState *State, boost::func
|
|||||||
if(!type) anim->anim->setType(1);
|
if(!type) anim->anim->setType(1);
|
||||||
|
|
||||||
char pom[25];int hlp=0;
|
char pom[25];int hlp=0;
|
||||||
|
|
||||||
|
if(creatureCount)
|
||||||
|
{
|
||||||
|
SDL_itoa(creatureCount,pom,10);
|
||||||
|
count = pom;
|
||||||
|
}
|
||||||
|
|
||||||
printAtMiddle(c->namePl,149,30,GEOR13,zwykly,bitmap); //creature name
|
printAtMiddle(c->namePl,149,30,GEOR13,zwykly,bitmap); //creature name
|
||||||
|
|
||||||
//atttack
|
//atttack
|
||||||
@ -3063,24 +3137,41 @@ CCreInfoWindow::CCreInfoWindow(int Cid, int Type, StackState *State, boost::func
|
|||||||
{
|
{
|
||||||
if(Upg && ui)
|
if(Upg && ui)
|
||||||
{
|
{
|
||||||
|
for(std::set<std::pair<int,int> >::iterator i=ui->cost[0].begin(); i!=ui->cost[0].end(); i++) //calculate upgrade cost
|
||||||
|
{
|
||||||
|
upgResCost.push_back(new SComponent(SComponent::resource,i->first,i->second*creatureCount));
|
||||||
|
}
|
||||||
|
|
||||||
CFunctionList<void()> fs[2];
|
CFunctionList<void()> fs[2];
|
||||||
fs[0] += Upg;
|
fs[0] += Upg;
|
||||||
fs[0] += boost::bind(&CCreInfoWindow::close,this);
|
fs[0] += boost::bind(&CCreInfoWindow::close,this);
|
||||||
std::vector<SComponent*> upgResCost;
|
|
||||||
for(std::set<std::pair<int,int> >::iterator i=ui->cost[0].begin(); i!=ui->cost[0].end(); i++)
|
CCastleInterface *pom;
|
||||||
|
if(pom=dynamic_cast<CCastleInterface*>(LOCPLINT->curint)) //if town screen is opened it needs to be redrawn
|
||||||
{
|
{
|
||||||
upgResCost.push_back(new SComponent(SComponent::resource,i->first,i->second)); //will be deleted by CInfoWindow::close
|
fs[1] += boost::bind(&CCastleInterface::showAll,pom,screen,true);
|
||||||
}
|
}
|
||||||
boost::function<void()> fff = boost::bind(&CPlayerInterface::showYesNoDialog,LOCPLINT,CGI->generaltexth->allTexts[207],upgResCost,fs[0],fs[1],false);
|
fs[1] += boost::bind(&CCreInfoWindow::activate,this);
|
||||||
upgrade = new AdventureMapButton("",CGI->preth->zelp[446].second,fff,pos.x+76,pos.y+237,"IVIEWCR.DEF");
|
CFunctionList<void()> cfl = boost::bind(&CCreInfoWindow::deactivate,this);
|
||||||
|
cfl += boost::bind(&CPlayerInterface::showYesNoDialog,LOCPLINT,CGI->generaltexth->allTexts[207],boost::ref(upgResCost),fs[0],fs[1],false,false);
|
||||||
|
upgrade = new AdventureMapButton("",CGI->preth->zelp[446].second,cfl,pos.x+76,pos.y+237,"IVIEWCR.DEF");
|
||||||
}
|
}
|
||||||
if(Dsm)
|
if(Dsm)
|
||||||
{
|
{
|
||||||
CFunctionList<void()> fs[2];
|
CFunctionList<void()> fs[2];
|
||||||
fs[0] += Dsm;
|
//on dismiss confirmed
|
||||||
fs[0] += boost::bind(&CCreInfoWindow::close,this);
|
fs[0] += Dsm; //dismiss
|
||||||
boost::function<void()> fff = boost::bind(&CPlayerInterface::showYesNoDialog,LOCPLINT,CGI->generaltexth->allTexts[12],std::vector<SComponent*>(),fs[0],fs[1],false);
|
fs[0] += boost::bind(&CCreInfoWindow::close,this);//close this window
|
||||||
dismiss = new AdventureMapButton("",CGI->preth->zelp[445].second,fff,pos.x+21,pos.y+237,"IVIEWCR2.DEF");
|
|
||||||
|
CCastleInterface *pom;
|
||||||
|
if(pom=dynamic_cast<CCastleInterface*>(LOCPLINT->curint)) //if town screen is opened it needs to be redrawn
|
||||||
|
{
|
||||||
|
fs[1] += boost::bind(&CCastleInterface::showAll,pom,screen,true);
|
||||||
|
}
|
||||||
|
fs[1] += boost::bind(&CCreInfoWindow::activate,this);
|
||||||
|
CFunctionList<void()> cfl = boost::bind(&CCreInfoWindow::deactivate,this);
|
||||||
|
cfl += boost::bind(&CPlayerInterface::showYesNoDialog,LOCPLINT,CGI->generaltexth->allTexts[12],std::vector<SComponent*>(),fs[0],fs[1],false,false);
|
||||||
|
dismiss = new AdventureMapButton("",CGI->preth->zelp[445].second,cfl,pos.x+21,pos.y+237,"IVIEWCR2.DEF");
|
||||||
}
|
}
|
||||||
ok = new AdventureMapButton("",CGI->preth->zelp[445].second,boost::bind(&CCreInfoWindow::close,this),pos.x+216,pos.y+237,"IOKAY.DEF");
|
ok = new AdventureMapButton("",CGI->preth->zelp[445].second,boost::bind(&CCreInfoWindow::close,this),pos.x+216,pos.y+237,"IOKAY.DEF");
|
||||||
}
|
}
|
||||||
@ -3096,9 +3187,13 @@ CCreInfoWindow::~CCreInfoWindow()
|
|||||||
delete upgrade;
|
delete upgrade;
|
||||||
delete ok;
|
delete ok;
|
||||||
delete dismiss;
|
delete dismiss;
|
||||||
|
for(int i=0; i<upgResCost.size();i++)
|
||||||
|
delete upgResCost[i];
|
||||||
}
|
}
|
||||||
void CCreInfoWindow::activate()
|
void CCreInfoWindow::activate()
|
||||||
{
|
{
|
||||||
|
if(active) return;
|
||||||
|
active = true;
|
||||||
if(!type)
|
if(!type)
|
||||||
ClickableR::activate();
|
ClickableR::activate();
|
||||||
LOCPLINT->objsToBlit.push_back(this);
|
LOCPLINT->objsToBlit.push_back(this);
|
||||||
@ -3108,8 +3203,6 @@ void CCreInfoWindow::activate()
|
|||||||
dismiss->activate();
|
dismiss->activate();
|
||||||
if(upgrade)
|
if(upgrade)
|
||||||
upgrade->activate();
|
upgrade->activate();
|
||||||
if(type)
|
|
||||||
LOCPLINT->curint->deactivate();
|
|
||||||
}
|
}
|
||||||
void CCreInfoWindow::close()
|
void CCreInfoWindow::close()
|
||||||
{
|
{
|
||||||
@ -3119,7 +3212,6 @@ void CCreInfoWindow::close()
|
|||||||
if(type)
|
if(type)
|
||||||
LOCPLINT->curint->activate();
|
LOCPLINT->curint->activate();
|
||||||
delete this;
|
delete this;
|
||||||
|
|
||||||
}
|
}
|
||||||
void CCreInfoWindow::clickRight(boost::logic::tribool down)
|
void CCreInfoWindow::clickRight(boost::logic::tribool down)
|
||||||
{
|
{
|
||||||
@ -3137,6 +3229,8 @@ void CCreInfoWindow::keyPressed (SDL_KeyboardEvent & key)
|
|||||||
}
|
}
|
||||||
void CCreInfoWindow::deactivate()
|
void CCreInfoWindow::deactivate()
|
||||||
{
|
{
|
||||||
|
if(!active) return;
|
||||||
|
active = false;
|
||||||
if(!type)
|
if(!type)
|
||||||
ClickableR::deactivate();
|
ClickableR::deactivate();
|
||||||
LOCPLINT->objsToBlit.erase(std::find(LOCPLINT->objsToBlit.begin(),LOCPLINT->objsToBlit.end(),this));
|
LOCPLINT->objsToBlit.erase(std::find(LOCPLINT->objsToBlit.begin(),LOCPLINT->objsToBlit.end(),this));
|
||||||
|
@ -24,6 +24,8 @@ class CCreatureSet;
|
|||||||
class CGObjectInstance;
|
class CGObjectInstance;
|
||||||
class CSlider;
|
class CSlider;
|
||||||
struct UpgradeInfo;
|
struct UpgradeInfo;
|
||||||
|
template <typename T> struct CondSh;
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
class mutex;
|
class mutex;
|
||||||
@ -158,8 +160,9 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
class CInfoWindow : public CSimpleWindow //text + comp. + ok button
|
class CInfoWindow : public CSimpleWindow //text + comp. + ok button
|
||||||
{ //window deletes its components when closed
|
{ //window able to delete its components when closed
|
||||||
public:
|
public:
|
||||||
|
bool delComps; //whether comps will be deleted
|
||||||
std::vector<AdventureMapButton *> buttons;
|
std::vector<AdventureMapButton *> buttons;
|
||||||
std::vector<SComponent*> components;
|
std::vector<SComponent*> components;
|
||||||
virtual void close();
|
virtual void close();
|
||||||
@ -303,6 +306,7 @@ class CPlayerInterface : public CGameInterface
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//minor interfaces
|
//minor interfaces
|
||||||
|
CondSh<bool> *showingDialog;
|
||||||
boost::mutex *pim;
|
boost::mutex *pim;
|
||||||
bool makingTurn;
|
bool makingTurn;
|
||||||
SDL_Event * current;
|
SDL_Event * current;
|
||||||
@ -311,7 +315,6 @@ public:
|
|||||||
CCastleInterface * castleInt;
|
CCastleInterface * castleInt;
|
||||||
FPSmanager * mainFPSmng;
|
FPSmanager * mainFPSmng;
|
||||||
IStatusBar *statusbar;
|
IStatusBar *statusbar;
|
||||||
|
|
||||||
//to commucate with engine
|
//to commucate with engine
|
||||||
CCallback * cb;
|
CCallback * cb;
|
||||||
|
|
||||||
@ -339,6 +342,7 @@ public:
|
|||||||
void garrisonChanged(const CGObjectInstance * obj);
|
void garrisonChanged(const CGObjectInstance * obj);
|
||||||
void buildChanged(const CGTownInstance *town, int buildingID, int what); //what: 1 - built, 2 - demolished
|
void buildChanged(const CGTownInstance *town, int buildingID, int what); //what: 1 - built, 2 - demolished
|
||||||
void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback);
|
void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback);
|
||||||
|
void heroInGarrisonChange(const CGTownInstance *town);
|
||||||
//for battles
|
//for battles
|
||||||
void battleStart(CCreatureSet *army1, CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side); //called by engine when battle starts; side=0 - left, side=1 - right
|
void battleStart(CCreatureSet *army1, CCreatureSet *army2, int3 tile, CGHeroInstance *hero1, CGHeroInstance *hero2, bool side); //called by engine when battle starts; side=0 - left, side=1 - right
|
||||||
void battlefieldPrepared(int battlefieldType, std::vector<CObstacle*> obstacles); //called when battlefield is prepared, prior the battle beginning
|
void battlefieldPrepared(int battlefieldType, std::vector<CObstacle*> obstacles); //called when battlefield is prepared, prior the battle beginning
|
||||||
@ -367,7 +371,7 @@ public:
|
|||||||
int3 repairScreenPos(int3 pos);
|
int3 repairScreenPos(int3 pos);
|
||||||
void removeObjToBlit(IShowable* obj);
|
void removeObjToBlit(IShowable* obj);
|
||||||
void showInfoDialog(std::string &text, std::vector<SComponent*> & components);
|
void showInfoDialog(std::string &text, std::vector<SComponent*> & components);
|
||||||
void showYesNoDialog(std::string &text, std::vector<SComponent*> & components, CFunctionList<void()> onYes, CFunctionList<void()> onNo, bool deactivateCur);
|
void showYesNoDialog(std::string &text, std::vector<SComponent*> & components, CFunctionList<void()> onYes, CFunctionList<void()> onNo, bool deactivateCur, bool DelComps); //deactivateCur - whether current main interface should be deactivated; delComps - if components will be deleted on window close
|
||||||
|
|
||||||
CPlayerInterface(int Player, int serial);//c-tor
|
CPlayerInterface(int Player, int serial);//c-tor
|
||||||
~CPlayerInterface();//d-tor
|
~CPlayerInterface();//d-tor
|
||||||
@ -521,17 +525,20 @@ public:
|
|||||||
class CCreInfoWindow : public IShowable, public KeyInterested, public ClickableR
|
class CCreInfoWindow : public IShowable, public KeyInterested, public ClickableR
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
bool active;
|
||||||
int type;//0 - rclick popup; 1 - normal window
|
int type;//0 - rclick popup; 1 - normal window
|
||||||
SDL_Surface *bitmap;
|
SDL_Surface *bitmap;
|
||||||
char anf;
|
char anf;
|
||||||
|
std::string count; //creature count in text format
|
||||||
|
|
||||||
boost::function<void()> dsm;
|
boost::function<void()> dsm;
|
||||||
CCreaturePic *anim;
|
CCreaturePic *anim;
|
||||||
CCreature *c;
|
CCreature *c;
|
||||||
CInfoWindow *dependant; //it may be dialog asking whther upgrade/dismiss stack (if opened)
|
CInfoWindow *dependant; //it may be dialog asking whther upgrade/dismiss stack (if opened)
|
||||||
|
std::vector<SComponent*> upgResCost; //cost of upgrade (if not possible then empty)
|
||||||
|
|
||||||
AdventureMapButton *dismiss, *upgrade, *ok;
|
AdventureMapButton *dismiss, *upgrade, *ok;
|
||||||
CCreInfoWindow(int Cid, int Type, StackState *State, boost::function<void()> Upg, boost::function<void()> Dsm, UpgradeInfo *ui);
|
CCreInfoWindow(int Cid, int Type, int creatureCount, StackState *State, boost::function<void()> Upg, boost::function<void()> Dsm, UpgradeInfo *ui);
|
||||||
~CCreInfoWindow();
|
~CCreInfoWindow();
|
||||||
void activate();
|
void activate();
|
||||||
void close();
|
void close();
|
||||||
|
@ -337,6 +337,17 @@ void CClient::process(int what)
|
|||||||
//TODO: do we need to inform interface?
|
//TODO: do we need to inform interface?
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 508:
|
||||||
|
{
|
||||||
|
SetHeroesInTown inTown;
|
||||||
|
*serv >> inTown;
|
||||||
|
std::cout << "Setting heroes in town " << inTown.tid << std::endl;
|
||||||
|
gs->apply(&inTown);
|
||||||
|
CGTownInstance *t = gs->getTown(inTown.tid);
|
||||||
|
if(vstd::contains(playerint,t->tempOwner))
|
||||||
|
playerint[t->tempOwner]->heroInGarrisonChange(t);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 1001:
|
case 1001:
|
||||||
{
|
{
|
||||||
SetObjectProperty sop;
|
SetObjectProperty sop;
|
||||||
|
@ -154,6 +154,16 @@ struct SetAvailableCreatures : public CPack<SetAvailableCreatures> //506
|
|||||||
h & tid & creatures;
|
h & tid & creatures;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
struct SetHeroesInTown : public CPack<SetHeroesInTown> //508
|
||||||
|
{
|
||||||
|
SetHeroesInTown(){type = 508;};
|
||||||
|
si32 tid, visiting, garrison; //id of town, visiting hero, hero in garrison
|
||||||
|
|
||||||
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
|
{
|
||||||
|
h & tid & visiting & garrison;
|
||||||
|
}
|
||||||
|
};
|
||||||
struct NewTurn : public CPack<NewTurn> //101
|
struct NewTurn : public CPack<NewTurn> //101
|
||||||
{
|
{
|
||||||
struct Hero
|
struct Hero
|
||||||
|
@ -1107,7 +1107,7 @@ std::string CMapHandler::getDefName(int id, int subid)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMapHandler::printObject(CGObjectInstance *obj)
|
bool CMapHandler::printObject(const CGObjectInstance *obj)
|
||||||
{
|
{
|
||||||
CDefHandler * curd = obj->defInfo->handler;
|
CDefHandler * curd = obj->defInfo->handler;
|
||||||
for(int fx=0; fx<curd->ourImages[0].bitmap->w/32; ++fx)
|
for(int fx=0; fx<curd->ourImages[0].bitmap->w/32; ++fx)
|
||||||
@ -1119,7 +1119,7 @@ bool CMapHandler::printObject(CGObjectInstance *obj)
|
|||||||
cr.h = 32;
|
cr.h = 32;
|
||||||
cr.x = fx*32;
|
cr.x = fx*32;
|
||||||
cr.y = fy*32;
|
cr.y = fy*32;
|
||||||
std::pair<CGObjectInstance*,SDL_Rect> toAdd = std::make_pair(obj, cr);
|
std::pair<const CGObjectInstance*,SDL_Rect> toAdd = std::make_pair(obj, cr);
|
||||||
if((obj->pos.x + fx - curd->ourImages[0].bitmap->w/32+1)>=0 && (obj->pos.x + fx - curd->ourImages[0].bitmap->w/32+1)<ttiles.size()-Woff && (obj->pos.y + fy - curd->ourImages[0].bitmap->h/32+1)>=0 && (obj->pos.y + fy - curd->ourImages[0].bitmap->h/32+1)<ttiles[0].size()-Hoff)
|
if((obj->pos.x + fx - curd->ourImages[0].bitmap->w/32+1)>=0 && (obj->pos.x + fx - curd->ourImages[0].bitmap->w/32+1)<ttiles.size()-Woff && (obj->pos.y + fy - curd->ourImages[0].bitmap->h/32+1)>=0 && (obj->pos.y + fy - curd->ourImages[0].bitmap->h/32+1)<ttiles[0].size()-Hoff)
|
||||||
{
|
{
|
||||||
TerrainTile2 & curt =
|
TerrainTile2 & curt =
|
||||||
@ -1137,7 +1137,7 @@ bool CMapHandler::printObject(CGObjectInstance *obj)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMapHandler::hideObject(CGObjectInstance *obj)
|
bool CMapHandler::hideObject(const CGObjectInstance *obj)
|
||||||
{
|
{
|
||||||
CDefHandler * curd = obj->defInfo->handler;
|
CDefHandler * curd = obj->defInfo->handler;
|
||||||
for(int fx=0; fx<curd->ourImages[0].bitmap->w/32; ++fx)
|
for(int fx=0; fx<curd->ourImages[0].bitmap->w/32; ++fx)
|
||||||
|
@ -86,8 +86,8 @@ public:
|
|||||||
//std::vector< CGObjectInstance * > getVisitableObjs(int3 pos); //returns vector of visitable objects at certain position
|
//std::vector< CGObjectInstance * > getVisitableObjs(int3 pos); //returns vector of visitable objects at certain position
|
||||||
CGObjectInstance * createObject(int id, int subid, int3 pos, int owner=254); //creates a new object with a certain id and subid
|
CGObjectInstance * createObject(int id, int subid, int3 pos, int owner=254); //creates a new object with a certain id and subid
|
||||||
std::string getDefName(int id, int subid); //returns name of def for object with given id and subid
|
std::string getDefName(int id, int subid); //returns name of def for object with given id and subid
|
||||||
bool printObject(CGObjectInstance * obj); //puts appropriate things to ttiles, so obj will be visible on map
|
bool printObject(const CGObjectInstance * obj); //puts appropriate things to ttiles, so obj will be visible on map
|
||||||
bool hideObject(CGObjectInstance * obj); //removes appropriate things from ttiles, so obj will be no longer visible on map (but still will exist)
|
bool hideObject(const CGObjectInstance * obj); //removes appropriate things from ttiles, so obj will be no longer visible on map (but still will exist)
|
||||||
bool removeObject(CGObjectInstance * obj); //removes object from each place in VCMI (I hope)
|
bool removeObject(CGObjectInstance * obj); //removes object from each place in VCMI (I hope)
|
||||||
void init();
|
void init();
|
||||||
void calculateBlockedPos();
|
void calculateBlockedPos();
|
||||||
|
@ -666,6 +666,72 @@ void CGameHandler::handleConnection(std::set<int> players, CConnection &c)
|
|||||||
upgend:
|
upgend:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 508: //garrison swap
|
||||||
|
{
|
||||||
|
si32 tid;
|
||||||
|
c >> tid;
|
||||||
|
CGTownInstance *town = gs->getTown(tid);
|
||||||
|
if(!town->garrisonHero && town->visitingHero) //visiting => garrison, merge armies
|
||||||
|
{
|
||||||
|
CCreatureSet csn = town->visitingHero->army, cso = town->army;
|
||||||
|
while(!cso.slots.empty())//while there are unmoved creatures
|
||||||
|
{
|
||||||
|
int pos = csn.getSlotFor(cso.slots.begin()->first);
|
||||||
|
if(pos<0)
|
||||||
|
goto handleConEnd;
|
||||||
|
if(csn.slots.find(pos)!=csn.slots.end()) //add creatures to the existing stack
|
||||||
|
{
|
||||||
|
csn.slots[pos].second += cso.slots.begin()->second.second;
|
||||||
|
}
|
||||||
|
else //move stack on the free pos
|
||||||
|
{
|
||||||
|
csn.slots[pos].first = cso.slots.begin()->second.first;
|
||||||
|
csn.slots[pos].second = cso.slots.begin()->second.second;
|
||||||
|
}
|
||||||
|
cso.slots.erase(cso.slots.begin());
|
||||||
|
}
|
||||||
|
SetGarrisons sg;
|
||||||
|
sg.garrs[town->visitingHero->id] = csn;
|
||||||
|
sg.garrs[town->id] = csn;
|
||||||
|
sendAndApply(&sg);
|
||||||
|
|
||||||
|
SetHeroesInTown intown;
|
||||||
|
intown.tid = tid;
|
||||||
|
intown.visiting = -1;
|
||||||
|
intown.garrison = town->visitingHero->id;
|
||||||
|
sendAndApply(&intown);
|
||||||
|
}
|
||||||
|
else if (town->garrisonHero && !town->visitingHero) //move hero out of the garrison
|
||||||
|
{
|
||||||
|
//town will be empty
|
||||||
|
SetGarrisons sg;
|
||||||
|
sg.garrs[tid] = CCreatureSet();
|
||||||
|
sendAndApply(&sg);
|
||||||
|
|
||||||
|
SetHeroesInTown intown;
|
||||||
|
intown.tid = tid;
|
||||||
|
intown.garrison = -1;
|
||||||
|
intown.visiting = town->garrisonHero->id;
|
||||||
|
sendAndApply(&intown);
|
||||||
|
}
|
||||||
|
else if (town->garrisonHero && town->visitingHero) //swap visiting and garrison hero
|
||||||
|
{
|
||||||
|
SetGarrisons sg;
|
||||||
|
sg.garrs[town->id] = town->visitingHero->army;
|
||||||
|
sendAndApply(&sg);
|
||||||
|
|
||||||
|
SetHeroesInTown intown;
|
||||||
|
intown.tid = tid;
|
||||||
|
intown.garrison = town->visitingHero->id;
|
||||||
|
intown.visiting = town->garrisonHero->id;
|
||||||
|
sendAndApply(&intown);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Warning, wrong garrison swap command for " << tid << std::endl;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 2001:
|
case 2001:
|
||||||
{
|
{
|
||||||
ui32 qid, answer;
|
ui32 qid, answer;
|
||||||
@ -759,6 +825,8 @@ upgend:
|
|||||||
{
|
{
|
||||||
end2 = true;
|
end2 = true;
|
||||||
}
|
}
|
||||||
|
handleConEnd:
|
||||||
|
;
|
||||||
}
|
}
|
||||||
void CGameHandler::moveStack(int stack, int dest)
|
void CGameHandler::moveStack(int stack, int dest)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user