mirror of
https://github.com/vcmi/vcmi.git
synced 2025-07-13 01:20:34 +02:00
* fixed crash on closing application
* unified yes/no and selection dialog interface calls * VCMI won't anymore be always giving all three stacks in the starting armies * fix for drawing starting army creatures count * support for School of Magic * support for School of War * support for Pillar of Fire * minor changes
This commit is contained in:
@ -63,6 +63,12 @@ void CGeniusAI::heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector
|
|||||||
{
|
{
|
||||||
callback(rand() % skills.size());
|
callback(rand() % skills.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGeniusAI::showBlockingDialog( const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel )
|
||||||
|
{
|
||||||
|
m_cb->selectionMade(cancel ? 0 : 1, askID);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* occurs AFTER every action taken by any stack or by the hero
|
* occurs AFTER every action taken by any stack or by the hero
|
||||||
*/
|
*/
|
||||||
|
@ -190,6 +190,7 @@ public:
|
|||||||
virtual void heroMoved(const HeroMoveDetails &);
|
virtual void heroMoved(const HeroMoveDetails &);
|
||||||
virtual void heroPrimarySkillChanged(const CGHeroInstance * hero, int which, int val) {};
|
virtual void heroPrimarySkillChanged(const CGHeroInstance * hero, int which, int val) {};
|
||||||
virtual void showSelDialog(std::string text, std::vector<CSelectableComponent*> & components, int askID){};
|
virtual void showSelDialog(std::string text, std::vector<CSelectableComponent*> & components, int askID){};
|
||||||
|
virtual void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel);
|
||||||
virtual void tileRevealed(int3 pos){};
|
virtual void tileRevealed(int3 pos){};
|
||||||
virtual void tileHidden(int3 pos){};
|
virtual void tileHidden(int3 pos){};
|
||||||
virtual void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback);
|
virtual void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback);
|
||||||
|
@ -1245,6 +1245,7 @@ endTurn(CGI->generaltexth->zelp[302].first,CGI->generaltexth->zelp[302].second,
|
|||||||
heroList(ADVOPT.hlistSize),
|
heroList(ADVOPT.hlistSize),
|
||||||
townList(ADVOPT.tlistSize,ADVOPT.tlistX,ADVOPT.tlistY,ADVOPT.tlistAU,ADVOPT.tlistAD)//(5,&genRect(192,48,747,196),747,196,747,372),
|
townList(ADVOPT.tlistSize,ADVOPT.tlistX,ADVOPT.tlistY,ADVOPT.tlistAU,ADVOPT.tlistAD)//(5,&genRect(192,48,747,196),747,196,747,372),
|
||||||
{
|
{
|
||||||
|
active = 0;
|
||||||
subInt = NULL;
|
subInt = NULL;
|
||||||
selection = NULL;
|
selection = NULL;
|
||||||
townList.fun = boost::bind(&CAdvMapInt::selectionChanged,this);
|
townList.fun = boost::bind(&CAdvMapInt::selectionChanged,this);
|
||||||
@ -1363,6 +1364,10 @@ void CAdvMapInt::fendTurn()
|
|||||||
|
|
||||||
void CAdvMapInt::activate()
|
void CAdvMapInt::activate()
|
||||||
{
|
{
|
||||||
|
if(active++)
|
||||||
|
{
|
||||||
|
tlog1 << "Error: advmapint already active...\n";
|
||||||
|
}
|
||||||
if(subInt == heroWindow)
|
if(subInt == heroWindow)
|
||||||
{
|
{
|
||||||
heroWindow->activate();
|
heroWindow->activate();
|
||||||
@ -1392,6 +1397,10 @@ void CAdvMapInt::activate()
|
|||||||
}
|
}
|
||||||
void CAdvMapInt::deactivate()
|
void CAdvMapInt::deactivate()
|
||||||
{
|
{
|
||||||
|
if(--active)
|
||||||
|
{
|
||||||
|
tlog1 << "Error: advmapint still active...\n";
|
||||||
|
}
|
||||||
if(subInt == heroWindow)
|
if(subInt == heroWindow)
|
||||||
{
|
{
|
||||||
heroWindow->deactivate();
|
heroWindow->deactivate();
|
||||||
|
@ -107,7 +107,7 @@ public:
|
|||||||
~CAdvMapInt();
|
~CAdvMapInt();
|
||||||
|
|
||||||
int3 position; //top left corner of visible map part
|
int3 position; //top left corner of visible map part
|
||||||
int player;
|
int player, active;
|
||||||
|
|
||||||
std::vector<CDefHandler *> gems;
|
std::vector<CDefHandler *> gems;
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ class ICallback
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual bool moveHero(const CGHeroInstance *h, int3 dst) const =0; //dst must be free, neighbouring tile (this function can move hero only by one tile)
|
virtual bool moveHero(const CGHeroInstance *h, int3 dst) const =0; //dst must be free, neighbouring tile (this function can move hero only by one tile)
|
||||||
|
virtual void selectionMade(int selection, int asker) =0;
|
||||||
virtual int swapCreatures(const CGObjectInstance *s1, const CGObjectInstance *s2, int p1, int p2)=0;//swaps creatures between two posiibly different garrisons // TODO: AI-unsafe code - fix it!
|
virtual int swapCreatures(const CGObjectInstance *s1, const CGObjectInstance *s2, int p1, int p2)=0;//swaps creatures between two posiibly different garrisons // TODO: AI-unsafe code - fix it!
|
||||||
virtual int mergeStacks(const CGObjectInstance *s1, const CGObjectInstance *s2, int p1, int p2)=0;//joins first stack tothe second (creatures must be same type)
|
virtual int mergeStacks(const CGObjectInstance *s1, const CGObjectInstance *s2, int p1, int p2)=0;//joins first stack tothe second (creatures must be same type)
|
||||||
virtual int splitStack(const CGObjectInstance *s1, const CGObjectInstance *s2, int p1, int p2, int val)=0;//split creatures from the first stack
|
virtual int splitStack(const CGObjectInstance *s1, const CGObjectInstance *s2, int p1, int p2, int val)=0;//split creatures from the first stack
|
||||||
|
@ -69,8 +69,9 @@ public:
|
|||||||
virtual void init(ICallback * CB){};
|
virtual void init(ICallback * CB){};
|
||||||
virtual void receivedResource(int type, int val){};
|
virtual void receivedResource(int type, int val){};
|
||||||
virtual void showInfoDialog(const std::string &text, const std::vector<Component*> &components){};
|
virtual void showInfoDialog(const std::string &text, const std::vector<Component*> &components){};
|
||||||
virtual void showSelDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID){};
|
//virtual void showSelDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID){};
|
||||||
virtual void showYesNoDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID){};
|
//virtual void showYesNoDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID){};
|
||||||
|
virtual void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel) = 0; //Show a dialog, player must take decision. If selection then he has to choose between one of given components, if cancel he is allowed to not choose. After making choice, CCallback::selectionMade should be called with number of selected component (1 - n) or 0 for cancel (if allowed) and askID.
|
||||||
virtual void tileHidden(const std::set<int3> &pos){};
|
virtual void tileHidden(const std::set<int3> &pos){};
|
||||||
virtual void tileRevealed(const std::set<int3> &pos){};
|
virtual void tileRevealed(const std::set<int3> &pos){};
|
||||||
virtual void yourTurn(){};
|
virtual void yourTurn(){};
|
||||||
|
9
CMT.cpp
9
CMT.cpp
@ -45,11 +45,14 @@
|
|||||||
#if __MINGW32__
|
#if __MINGW32__
|
||||||
#undef main
|
#undef main
|
||||||
#endif
|
#endif
|
||||||
std::string NAME = NAME_VER + std::string(" (client)");
|
std::string NAME = NAME_VER + std::string(" (client)"); //application name
|
||||||
SDL_Surface * screen, * screen2;
|
SDL_Surface * screen; //main screen surface
|
||||||
|
|
||||||
std::queue<SDL_Event*> events;
|
std::queue<SDL_Event*> events;
|
||||||
boost::mutex eventsM;
|
boost::mutex eventsM;
|
||||||
|
|
||||||
TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM, *GEOR16;
|
TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM, *GEOR16;
|
||||||
|
|
||||||
void processCommand(const std::string &message, CClient *&client);
|
void processCommand(const std::string &message, CClient *&client);
|
||||||
#ifndef __GNUC__
|
#ifndef __GNUC__
|
||||||
int _tmain(int argc, _TCHAR* argv[])
|
int _tmain(int argc, _TCHAR* argv[])
|
||||||
@ -196,11 +199,11 @@ int main(int argc, char** argv)
|
|||||||
SDL_WaitEvent(ev);
|
SDL_WaitEvent(ev);
|
||||||
if((ev->type==SDL_QUIT) || (ev->type == SDL_KEYDOWN && ev->key.keysym.sym==SDLK_F4 && (ev->key.keysym.mod & KMOD_ALT)))
|
if((ev->type==SDL_QUIT) || (ev->type == SDL_KEYDOWN && ev->key.keysym.sym==SDLK_F4 && (ev->key.keysym.mod & KMOD_ALT)))
|
||||||
{
|
{
|
||||||
|
LOCPLINT->pim->lock();
|
||||||
cl.close();
|
cl.close();
|
||||||
#ifndef __unix__
|
#ifndef __unix__
|
||||||
::console->killConsole(console->native_handle());
|
::console->killConsole(console->native_handle());
|
||||||
#endif
|
#endif
|
||||||
LOCPLINT->pim->lock();
|
|
||||||
SDL_Delay(750);
|
SDL_Delay(750);
|
||||||
tlog0 << "Ending...\n";
|
tlog0 << "Ending...\n";
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
@ -564,16 +564,16 @@ void CGarrisonInt::deactivate()
|
|||||||
|
|
||||||
CInfoWindow::CInfoWindow(std::string text, int player, int charperline, const std::vector<SComponent*> &comps, std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons)
|
CInfoWindow::CInfoWindow(std::string text, int player, int charperline, const std::vector<SComponent*> &comps, std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons)
|
||||||
{
|
{
|
||||||
|
ID = -1;
|
||||||
for(int i=0;i<Buttons.size();i++)
|
for(int i=0;i<Buttons.size();i++)
|
||||||
{
|
{
|
||||||
buttons.push_back(new AdventureMapButton("","",Buttons[i].second,0,0,Buttons[i].first));
|
buttons.push_back(new AdventureMapButton("","",Buttons[i].second,0,0,Buttons[i].first));
|
||||||
if(!Buttons[i].second) //if no function, then by default we'll set it to close
|
buttons[i]->callback += boost::bind(&CInfoWindow::close,this); //each button will close the window apart from call-defined actions
|
||||||
{
|
|
||||||
buttons[i]->assignedKeys.insert(SDLK_RETURN);
|
|
||||||
buttons[i]->assignedKeys.insert(SDLK_ESCAPE);
|
|
||||||
buttons[i]->callback += boost::bind(&CInfoWindow::close,this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buttons.front()->assignedKeys.insert(SDLK_RETURN); //first button - reacts on enter
|
||||||
|
buttons.back()->assignedKeys.insert(SDLK_ESCAPE); //last button - reacts on escape
|
||||||
|
|
||||||
for(int i=0;i<comps.size();i++)
|
for(int i=0;i<comps.size();i++)
|
||||||
{
|
{
|
||||||
components.push_back(comps[i]);
|
components.push_back(comps[i]);
|
||||||
@ -582,6 +582,7 @@ CInfoWindow::CInfoWindow(std::string text, int player, int charperline, const st
|
|||||||
}
|
}
|
||||||
CInfoWindow::CInfoWindow()
|
CInfoWindow::CInfoWindow()
|
||||||
{
|
{
|
||||||
|
ID = -1;
|
||||||
}
|
}
|
||||||
void CInfoWindow::close()
|
void CInfoWindow::close()
|
||||||
{
|
{
|
||||||
@ -906,15 +907,22 @@ void CSelWindow::selectionChange(unsigned to)
|
|||||||
blitAt(pom->getImg(),pom->pos.x-pos.x,pom->pos.y-pos.y,bitmap);
|
blitAt(pom->getImg(),pom->pos.x-pos.x,pom->pos.y-pos.y,bitmap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CSelWindow::CSelWindow(std::string text, int player, int charperline, std::vector<CSelectableComponent*> &comps, std::vector<std::pair<std::string,boost::function<void()> > > &Buttons)
|
CSelWindow::CSelWindow(const std::string &text, int player, int charperline, const std::vector<CSelectableComponent*> &comps, const std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons, int askID)
|
||||||
{
|
{
|
||||||
|
ID = askID;
|
||||||
for(int i=0;i<Buttons.size();i++)
|
for(int i=0;i<Buttons.size();i++)
|
||||||
{
|
{
|
||||||
buttons.push_back(new AdventureMapButton("","",(Buttons[i].second)?(Buttons[i].second):(boost::bind(&CInfoWindow::close,this)),0,0,Buttons[i].first));
|
buttons.push_back(new AdventureMapButton("","",Buttons[i].second,0,0,Buttons[i].first));
|
||||||
|
if(!i && askID >= 0)
|
||||||
|
buttons.back()->callback += boost::bind(&CSelWindow::madeChoice,this);
|
||||||
|
buttons[i]->callback += boost::bind(&CInfoWindow::close,this); //each button will close the window apart from call-defined actions
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Buttons.size() == 1) //only one button - assign enter to it
|
buttons.front()->assignedKeys.insert(SDLK_RETURN); //first button - reacts on enter
|
||||||
buttons[0]->assignedKeys.insert(SDLK_RETURN);
|
buttons.back()->assignedKeys.insert(SDLK_ESCAPE); //last button - reacts on escape
|
||||||
|
|
||||||
|
if(buttons.size() > 1 && askID >= 0) //cancel button functionality
|
||||||
|
buttons.back()->callback += boost::bind(&ICallback::selectionMade,LOCPLINT->cb,0,askID);
|
||||||
|
|
||||||
for(int i=0;i<comps.size();i++)
|
for(int i=0;i<comps.size();i++)
|
||||||
{
|
{
|
||||||
@ -928,6 +936,14 @@ CSelWindow::CSelWindow(std::string text, int player, int charperline, std::vecto
|
|||||||
void CSelWindow::close()
|
void CSelWindow::close()
|
||||||
{
|
{
|
||||||
deactivate();
|
deactivate();
|
||||||
|
LOCPLINT->showingDialog->setn(false);
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSelWindow::madeChoice()
|
||||||
|
{
|
||||||
|
if(ID < 0)
|
||||||
|
return;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
for (int i=0;i<components.size();i++)
|
for (int i=0;i<components.size();i++)
|
||||||
{
|
{
|
||||||
@ -936,11 +952,9 @@ void CSelWindow::close()
|
|||||||
ret = i;
|
ret = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOCPLINT->curint->activate();
|
LOCPLINT->cb->selectionMade(ret+1,ID);
|
||||||
LOCPLINT->showingDialog->setn(false);
|
|
||||||
LOCPLINT->cb->selectionMade(ret,ID);
|
|
||||||
delete this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CButtonBase::CButtonBase()
|
CButtonBase::CButtonBase()
|
||||||
{
|
{
|
||||||
bitmapOffset = 0;
|
bitmapOffset = 0;
|
||||||
@ -1130,95 +1144,102 @@ void CPlayerInterface::init(ICallback * CB)
|
|||||||
}
|
}
|
||||||
void CPlayerInterface::yourTurn()
|
void CPlayerInterface::yourTurn()
|
||||||
{
|
{
|
||||||
LOCPLINT = this;
|
try
|
||||||
makingTurn = true;
|
|
||||||
|
|
||||||
for(std::map<int,SDL_Surface*>::iterator i=graphics->heroWins.begin(); i!=graphics->heroWins.end();i++) //redraw hero infoboxes
|
|
||||||
SDL_FreeSurface(i->second);
|
|
||||||
graphics->heroWins.clear();
|
|
||||||
std::vector <const CGHeroInstance *> hh = cb->getHeroesInfo(false);
|
|
||||||
for(int i=0;i<hh.size();i++)
|
|
||||||
{
|
{
|
||||||
SDL_Surface * pom = infoWin(hh[i]);
|
LOCPLINT = this;
|
||||||
graphics->heroWins.insert(std::pair<int,SDL_Surface*>(hh[i]->subID,pom));
|
makingTurn = true;
|
||||||
}
|
|
||||||
|
|
||||||
adventureInt->infoBar.newDay(cb->getDate(1));
|
static int autosaveCount = 0;
|
||||||
|
LOCPLINT->cb->save("Autosave_" + boost::lexical_cast<std::string>(autosaveCount++ + 1));
|
||||||
|
autosaveCount %= 5;
|
||||||
|
|
||||||
//select first hero if available.
|
for(std::map<int,SDL_Surface*>::iterator i=graphics->heroWins.begin(); i!=graphics->heroWins.end();i++) //redraw hero infoboxes
|
||||||
//TODO: check if hero is slept
|
SDL_FreeSurface(i->second);
|
||||||
if(adventureInt->heroList.items.size())
|
graphics->heroWins.clear();
|
||||||
adventureInt->select(adventureInt->heroList.items[0].first);
|
std::vector <const CGHeroInstance *> hh = cb->getHeroesInfo(false);
|
||||||
else
|
for(int i=0;i<hh.size();i++)
|
||||||
adventureInt->select(adventureInt->townList.items[0]);
|
|
||||||
adventureInt->activate();
|
|
||||||
|
|
||||||
|
|
||||||
timeHandler th;
|
|
||||||
th.getDif();
|
|
||||||
for(;makingTurn;) // main loop
|
|
||||||
{
|
|
||||||
|
|
||||||
updateWater();
|
|
||||||
pim->lock();
|
|
||||||
|
|
||||||
|
|
||||||
//if there are any waiting dialogs, show them
|
|
||||||
if(dialogs.size() && !showingDialog->get())
|
|
||||||
{
|
{
|
||||||
dialogs.front()->buttons[0]->callback += boost::bind(&IActivable::activate,LOCPLINT->curint);
|
SDL_Surface * pom = infoWin(hh[i]);
|
||||||
showingDialog->set(true);
|
graphics->heroWins.insert(std::pair<int,SDL_Surface*>(hh[i]->subID,pom));
|
||||||
curint->deactivate(); //dezaktywacja starego interfejsu
|
|
||||||
dialogs.front()->activate();
|
|
||||||
LOCPLINT->objsToBlit.push_back(dialogs.front());
|
|
||||||
dialogs.pop_front();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int tv = th.getDif();
|
adventureInt->infoBar.newDay(cb->getDate(1));
|
||||||
std::list<TimeInterested*> hlp = timeinterested;
|
|
||||||
for (std::list<TimeInterested*>::iterator i=hlp.begin(); i != hlp.end();i++)
|
|
||||||
{
|
|
||||||
if(!vstd::contains(timeinterested,*i)) continue;
|
|
||||||
if ((*i)->toNextTick>=0)
|
|
||||||
(*i)->toNextTick-=tv;
|
|
||||||
if ((*i)->toNextTick<0)
|
|
||||||
(*i)->tick();
|
|
||||||
}
|
|
||||||
LOCPLINT->adventureInt->updateScreen = false;
|
|
||||||
|
|
||||||
while(true)
|
//select first hero if available.
|
||||||
|
//TODO: check if hero is slept
|
||||||
|
if(adventureInt->heroList.items.size())
|
||||||
|
adventureInt->select(adventureInt->heroList.items[0].first);
|
||||||
|
else
|
||||||
|
adventureInt->select(adventureInt->townList.items[0]);
|
||||||
|
adventureInt->activate();
|
||||||
|
|
||||||
|
|
||||||
|
timeHandler th;
|
||||||
|
th.getDif();
|
||||||
|
while(makingTurn) // main loop
|
||||||
{
|
{
|
||||||
SDL_Event *ev = NULL;
|
|
||||||
|
updateWater();
|
||||||
|
pim->lock();
|
||||||
|
|
||||||
|
|
||||||
|
//if there are any waiting dialogs, show them
|
||||||
|
if(dialogs.size() && !showingDialog->get())
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::mutex> lock(eventsM);
|
dialogs.front()->buttons[0]->callback += boost::bind(&IActivable::activate,LOCPLINT->curint);
|
||||||
if(!events.size())
|
showingDialog->set(true);
|
||||||
{
|
curint->deactivate(); //dezaktywacja starego interfejsu
|
||||||
break;
|
dialogs.front()->activate();
|
||||||
}
|
LOCPLINT->objsToBlit.push_back(dialogs.front());
|
||||||
else
|
dialogs.pop_front();
|
||||||
{
|
|
||||||
ev = events.front();
|
|
||||||
events.pop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
handleEvent(ev);
|
|
||||||
delete ev;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (curint == adventureInt) //stuff for advMapInt
|
int tv = th.getDif();
|
||||||
{
|
std::list<TimeInterested*> hlp = timeinterested;
|
||||||
adventureInt->update();
|
for (std::list<TimeInterested*>::iterator i=hlp.begin(); i != hlp.end();i++)
|
||||||
|
{
|
||||||
|
if(!vstd::contains(timeinterested,*i)) continue;
|
||||||
|
if ((*i)->toNextTick>=0)
|
||||||
|
(*i)->toNextTick-=tv;
|
||||||
|
if ((*i)->toNextTick<0)
|
||||||
|
(*i)->tick();
|
||||||
|
}
|
||||||
|
LOCPLINT->adventureInt->updateScreen = false;
|
||||||
|
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
SDL_Event *ev = NULL;
|
||||||
|
{
|
||||||
|
boost::unique_lock<boost::mutex> lock(eventsM);
|
||||||
|
if(!events.size())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ev = events.front();
|
||||||
|
events.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handleEvent(ev);
|
||||||
|
delete ev;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (curint == adventureInt) //stuff for advMapInt
|
||||||
|
{
|
||||||
|
adventureInt->update();
|
||||||
|
}
|
||||||
|
for(int i=0;i<objsToBlit.size();i++)
|
||||||
|
objsToBlit[i]->show();
|
||||||
|
CGI->curh->draw1();
|
||||||
|
CSDL_Ext::update(screen);
|
||||||
|
CGI->curh->draw2();
|
||||||
|
pim->unlock();
|
||||||
|
SDL_framerateDelay(mainFPSmng);
|
||||||
}
|
}
|
||||||
for(int i=0;i<objsToBlit.size();i++)
|
adventureInt->deactivate();
|
||||||
objsToBlit[i]->show();
|
cb->endTurn();
|
||||||
CGI->curh->draw1();
|
} HANDLE_EXCEPTION
|
||||||
CSDL_Ext::update(screen);
|
|
||||||
CGI->curh->draw2();
|
|
||||||
pim->unlock();
|
|
||||||
SDL_framerateDelay(mainFPSmng);
|
|
||||||
}
|
|
||||||
adventureInt->deactivate();
|
|
||||||
cb->endTurn();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void subRect(const int & x, const int & y, const int & z, const SDL_Rect & r, const int & hid)
|
inline void subRect(const int & x, const int & y, const int & z, const SDL_Rect & r, const int & hid)
|
||||||
@ -2033,24 +2054,6 @@ void CPlayerInterface::receivedResource(int type, int val)
|
|||||||
castleInt->resdatabar->draw();
|
castleInt->resdatabar->draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayerInterface::showSelDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID)
|
|
||||||
//void CPlayerInterface::showSelDialog(std::string text, std::vector<CSelectableComponent*> & components, int askID)
|
|
||||||
{
|
|
||||||
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
|
||||||
LOCPLINT->showingDialog->setn(true);
|
|
||||||
adventureInt->deactivate(); //dezaktywacja starego interfejsu
|
|
||||||
std::vector<CSelectableComponent*> intComps;
|
|
||||||
for(int i=0;i<components.size();i++)
|
|
||||||
intComps.push_back(new CSelectableComponent(*components[i])); //will be deleted by CSelWindow::close
|
|
||||||
std::vector<std::pair<std::string,boost::function<void()> > > pom;
|
|
||||||
pom.push_back(std::pair<std::string,boost::function<void()> >("IOKAY.DEF",0));
|
|
||||||
|
|
||||||
CSelWindow * temp = new CSelWindow(text,playerID,35,intComps,pom);
|
|
||||||
LOCPLINT->objsToBlit.push_back(temp);
|
|
||||||
temp->activate();
|
|
||||||
temp->ID = askID;
|
|
||||||
intComps[0]->clickLeft(true);
|
|
||||||
}
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -2424,6 +2427,7 @@ void CPlayerInterface::showInfoDialog(const std::string &text, const std::vector
|
|||||||
dialogs.push_back(temp);
|
dialogs.push_back(temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayerInterface::showYesNoDialog(const std::string &text, const std::vector<SComponent*> & components, CFunctionList<void()> onYes, CFunctionList<void()> onNo, bool deactivateCur, bool DelComps)
|
void CPlayerInterface::showYesNoDialog(const std::string &text, const std::vector<SComponent*> & components, CFunctionList<void()> onYes, CFunctionList<void()> onNo, bool deactivateCur, bool DelComps)
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
||||||
@ -2431,8 +2435,8 @@ void CPlayerInterface::showYesNoDialog(const std::string &text, const std::vecto
|
|||||||
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",0));
|
pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",boost::bind(&IActivable::activate,curint)));
|
||||||
pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",0));
|
pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",boost::bind(&IActivable::activate,curint)));
|
||||||
CInfoWindow * temp = new CInfoWindow(text,playerID,36,components,pom);
|
CInfoWindow * temp = new CInfoWindow(text,playerID,36,components,pom);
|
||||||
temp->delComps = DelComps;
|
temp->delComps = DelComps;
|
||||||
for(int i=0;i<onYes.funcs.size();i++)
|
for(int i=0;i<onYes.funcs.size();i++)
|
||||||
@ -2440,37 +2444,46 @@ void CPlayerInterface::showYesNoDialog(const std::string &text, const std::vecto
|
|||||||
for(int i=0;i<onNo.funcs.size();i++)
|
for(int i=0;i<onNo.funcs.size();i++)
|
||||||
temp->buttons[1]->callback += onNo.funcs[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);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayerInterface::showYesNoDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID )
|
void CPlayerInterface::showBlockingDialog( const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel )
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
||||||
LOCPLINT->showingDialog->setn(false);
|
|
||||||
curint->deactivate(); //dezaktywacja starego interfejsu
|
|
||||||
|
|
||||||
std::vector<SComponent*> intComps;
|
|
||||||
for(int i=0;i<components.size();i++)
|
|
||||||
intComps.push_back(new SComponent(*components[i])); //will be deleted by CSelWindow::close
|
|
||||||
std::vector<std::pair<std::string,CFunctionList<void()> > > pom;
|
|
||||||
pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",0));
|
|
||||||
pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",0));
|
|
||||||
|
|
||||||
CInfoWindow * temp = new CInfoWindow(text,playerID,36,intComps,pom);
|
if(!selection && cancel) //simple yes/no dialog
|
||||||
temp->buttons[0]->callback += boost::bind(&IActivable::activate,curint);
|
{
|
||||||
temp->buttons[1]->callback += boost::bind(&IActivable::activate,curint);
|
std::vector<SComponent*> intComps;
|
||||||
temp->buttons[0]->callback += boost::bind(&CCallback::selectionMade,cb,0,askID);
|
for(int i=0;i<components.size();i++)
|
||||||
temp->buttons[1]->callback += boost::bind(&CCallback::selectionMade,cb,1,askID);
|
intComps.push_back(new SComponent(components[i])); //will be deleted by close in window
|
||||||
temp->delComps = true;
|
|
||||||
|
showYesNoDialog(text,intComps,boost::bind(&CCallback::selectionMade,cb,1,askID),boost::bind(&CCallback::selectionMade,cb,0,askID),true,true);
|
||||||
|
}
|
||||||
|
else if(selection)
|
||||||
|
{
|
||||||
|
std::vector<CSelectableComponent*> intComps;
|
||||||
|
for(int i=0;i<components.size();i++)
|
||||||
|
intComps.push_back(new CSelectableComponent(components[i])); //will be deleted by CSelWindow::close
|
||||||
|
|
||||||
|
adventureInt->deactivate(); //dezaktywacja starego interfejsu
|
||||||
|
|
||||||
|
std::vector<std::pair<std::string,CFunctionList<void()> > > pom;
|
||||||
|
pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",boost::bind(&IActivable::activate,curint)));
|
||||||
|
if(cancel)
|
||||||
|
{
|
||||||
|
pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",boost::bind(&IActivable::activate,curint)));
|
||||||
|
}
|
||||||
|
|
||||||
|
CSelWindow * temp = new CSelWindow(text,playerID,35,intComps,pom,askID);
|
||||||
|
LOCPLINT->objsToBlit.push_back(temp);
|
||||||
|
temp->activate();
|
||||||
|
intComps[0]->clickLeft(true);
|
||||||
|
}
|
||||||
|
|
||||||
temp->activate();
|
|
||||||
LOCPLINT->objsToBlit.push_back(temp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayerInterface::removeObjToBlit(IShowable* obj)
|
void CPlayerInterface::removeObjToBlit(IShowable* obj)
|
||||||
{
|
{
|
||||||
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
boost::unique_lock<boost::recursive_mutex> un(*pim);
|
||||||
|
@ -358,7 +358,8 @@ class CSelWindow : public CInfoWindow //component selection window
|
|||||||
public:
|
public:
|
||||||
void selectionChange(unsigned to);
|
void selectionChange(unsigned to);
|
||||||
void close();
|
void close();
|
||||||
CSelWindow(std::string text, int player, int charperline, std::vector<CSelectableComponent*> &comps, std::vector<std::pair<std::string,boost::function<void()> > > &Buttons); //c-tor
|
void madeChoice(); //looks for selected component and calls callback
|
||||||
|
CSelWindow(const std::string& text, int player, int charperline ,const std::vector<CSelectableComponent*> &comps, const std::vector<std::pair<std::string,CFunctionList<void()> > > &Buttons, int askID); //c-tor
|
||||||
CSelWindow(){}; //c-tor
|
CSelWindow(){}; //c-tor
|
||||||
//notification - this class inherits important destructor from CInfoWindow
|
//notification - this class inherits important destructor from CInfoWindow
|
||||||
};
|
};
|
||||||
@ -544,8 +545,9 @@ public:
|
|||||||
void heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town);
|
void heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town);
|
||||||
void receivedResource(int type, int val);
|
void receivedResource(int type, int val);
|
||||||
void showInfoDialog(const std::string &text, const std::vector<Component*> &components);
|
void showInfoDialog(const std::string &text, const std::vector<Component*> &components);
|
||||||
void showSelDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID);
|
//void showSelDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID);
|
||||||
void showYesNoDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID);
|
//void showYesNoDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID);
|
||||||
|
void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel); //Show a dialog, player must take decision. If selection then he has to choose between one of given components, if cancel he is allowed to not choose. After making choice, CCallback::selectionMade should be called with number of selected component (1 - n) or 0 for cancel (if allowed) and askID.
|
||||||
void tileHidden(const std::set<int3> &pos);
|
void tileHidden(const std::set<int3> &pos);
|
||||||
void tileRevealed(const std::set<int3> &pos);
|
void tileRevealed(const std::set<int3> &pos);
|
||||||
void yourTurn();
|
void yourTurn();
|
||||||
|
@ -109,29 +109,32 @@ void CClient::waitForMoveAndSend(int color)
|
|||||||
}
|
}
|
||||||
void CClient::run()
|
void CClient::run()
|
||||||
{
|
{
|
||||||
CPack *pack;
|
try
|
||||||
while(1)
|
|
||||||
{
|
{
|
||||||
tlog5 << "Listening... ";
|
CPack *pack;
|
||||||
*serv >> pack;
|
while(1)
|
||||||
tlog5 << "\treceived server message of type " << typeid(*pack).name() << std::endl;
|
|
||||||
CBaseForCLApply *apply = applier->apps[typeList.getTypeID(pack)];
|
|
||||||
if(apply)
|
|
||||||
{
|
{
|
||||||
apply->applyOnClBefore(this,pack);
|
tlog5 << "Listening... ";
|
||||||
tlog5 << "\tMade first apply on cl\n";
|
*serv >> pack;
|
||||||
gs->apply(pack);
|
tlog5 << "\treceived server message of type " << typeid(*pack).name() << std::endl;
|
||||||
tlog5 << "\tApplied on gs\n";
|
CBaseForCLApply *apply = applier->apps[typeList.getTypeID(pack)];
|
||||||
apply->applyOnClAfter(this,pack);
|
if(apply)
|
||||||
tlog5 << "\tMade second apply on cl\n";
|
{
|
||||||
|
apply->applyOnClBefore(this,pack);
|
||||||
|
tlog5 << "\tMade first apply on cl\n";
|
||||||
|
gs->apply(pack);
|
||||||
|
tlog5 << "\tApplied on gs\n";
|
||||||
|
apply->applyOnClAfter(this,pack);
|
||||||
|
tlog5 << "\tMade second apply on cl\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tlog5 << "Message cannot be applied, cannot find applier!\n";
|
||||||
|
}
|
||||||
|
delete pack;
|
||||||
|
pack = NULL;
|
||||||
}
|
}
|
||||||
else
|
} HANDLE_EXCEPTION(tlog1 << "Lost connection to server, ending listening thread!\n");
|
||||||
{
|
|
||||||
tlog5 << "Message cannot be applied, cannot find applier!\n";
|
|
||||||
}
|
|
||||||
delete pack;
|
|
||||||
pack = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CClient::close()
|
void CClient::close()
|
||||||
|
@ -77,8 +77,8 @@ public:
|
|||||||
void changePrimSkill(int ID, int which, int val, bool abs=false){};
|
void changePrimSkill(int ID, int which, int val, bool abs=false){};
|
||||||
void changeSecSkill(int ID, int which, int val, bool abs=false){};
|
void changeSecSkill(int ID, int which, int val, bool abs=false){};
|
||||||
void showInfoDialog(InfoWindow *iw){};
|
void showInfoDialog(InfoWindow *iw){};
|
||||||
void showYesNoDialog(YesNoDialog *iw, const CFunctionList<void(ui32)> &callback){};
|
void showBlockingDialog(BlockingDialog *iw, const CFunctionList<void(ui32)> &callback){};
|
||||||
void showSelectionDialog(SelectionDialog *iw, const CFunctionList<void(ui32)> &callback){}; //returns question id
|
ui32 showBlockingDialog(BlockingDialog *iw){return 0;}; //synchronous version of above
|
||||||
void giveResource(int player, int which, int val){};
|
void giveResource(int player, int which, int val){};
|
||||||
void showCompInfo(ShowInInfobox * comp){};
|
void showCompInfo(ShowInInfobox * comp){};
|
||||||
void heroVisitCastle(int obj, int heroID){};
|
void heroVisitCastle(int obj, int heroID){};
|
||||||
|
@ -282,28 +282,11 @@ void HeroLevelUp::applyCl( CClient *cl )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectionDialog::applyCl( CClient *cl )
|
void BlockingDialog::applyCl( CClient *cl )
|
||||||
{
|
{
|
||||||
std::vector<Component*> comps;
|
|
||||||
for(size_t i=0; i < components.size(); ++i) {
|
|
||||||
comps.push_back(&components[i]);
|
|
||||||
}
|
|
||||||
std::string str = toString(text);
|
std::string str = toString(text);
|
||||||
if(vstd::contains(cl->playerint,player))
|
if(vstd::contains(cl->playerint,player))
|
||||||
cl->playerint[player]->showSelDialog(str,comps,id);
|
cl->playerint[player]->showBlockingDialog(str,components,id,selection(),cancel());
|
||||||
else
|
|
||||||
tlog2 << "We received SelectionDialog for not our player...\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
void YesNoDialog::applyCl( CClient *cl )
|
|
||||||
{
|
|
||||||
std::vector<Component*> comps;
|
|
||||||
for(size_t i=0; i < components.size(); ++i) {
|
|
||||||
comps.push_back(&components[i]);
|
|
||||||
}
|
|
||||||
std::string str = toString(text);
|
|
||||||
if(vstd::contains(cl->playerint,player))
|
|
||||||
cl->playerint[player]->showYesNoDialog(str,comps,id);
|
|
||||||
else
|
else
|
||||||
tlog2 << "We received YesNoDialog for not our player...\n";
|
tlog2 << "We received YesNoDialog for not our player...\n";
|
||||||
}
|
}
|
||||||
@ -417,7 +400,7 @@ void EndAction::applyCl( CClient *cl )
|
|||||||
void SystemMessage::applyCl( CClient *cl )
|
void SystemMessage::applyCl( CClient *cl )
|
||||||
{
|
{
|
||||||
std::ostringstream str;
|
std::ostringstream str;
|
||||||
str << "System message from server: " << text;
|
str << "System message: " << text;
|
||||||
|
|
||||||
tlog4 << str.str() << std::endl;
|
tlog4 << str.str() << std::endl;
|
||||||
if(LOCPLINT)
|
if(LOCPLINT)
|
||||||
|
@ -511,6 +511,16 @@ void CGHeroInstance::initHero()
|
|||||||
if (!army.slots.size()) //standard army//initial army
|
if (!army.slots.size()) //standard army//initial army
|
||||||
{
|
{
|
||||||
int pom, pom2=0;
|
int pom, pom2=0;
|
||||||
|
|
||||||
|
int x = 0; //how many stacks will hero receives <1 - 3>
|
||||||
|
pom = ran()%100;
|
||||||
|
if(pom < 5)
|
||||||
|
x = 1;
|
||||||
|
else if(pom < 67)
|
||||||
|
x = 2;
|
||||||
|
else
|
||||||
|
x = 3;
|
||||||
|
|
||||||
for(int x=0;x<3;x++)
|
for(int x=0;x<3;x++)
|
||||||
{
|
{
|
||||||
pom = (VLC->creh->nameToID[type->refTypeStack[x]]);
|
pom = (VLC->creh->nameToID[type->refTypeStack[x]]);
|
||||||
@ -529,10 +539,8 @@ void CGHeroInstance::initHero()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
army.slots[x-pom2].first = pom;
|
army.slots[x-pom2].first = pom;
|
||||||
if((pom = (type->highStack[x]-type->lowStack[x])) > 0)
|
pom = type->highStack[x] - type->lowStack[x];
|
||||||
army.slots[x-pom2].second = (ran()%pom)+type->lowStack[x];
|
army.slots[x-pom2].second = ran()%(pom+1) + type->lowStack[x];
|
||||||
else
|
|
||||||
army.slots[x-pom2].second = +type->lowStack[x];
|
|
||||||
army.formation = false;
|
army.formation = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -540,7 +548,7 @@ void CGHeroInstance::initHero()
|
|||||||
boost::algorithm::replace_first(hoverName,"%s",name);
|
boost::algorithm::replace_first(hoverName,"%s",name);
|
||||||
boost::algorithm::replace_first(hoverName,"%s", type->heroClass->name);
|
boost::algorithm::replace_first(hoverName,"%s", type->heroClass->name);
|
||||||
|
|
||||||
//clear all bonuses from artifacts and give those from artifacts
|
//clear all bonuses from artifacts (if present) and give them again
|
||||||
std::remove_if(bonuses.begin(), bonuses.end(), boost::bind(HeroBonus::IsFrom,_1,HeroBonus::ARTIFACT,0xffffff));
|
std::remove_if(bonuses.begin(), bonuses.end(), boost::bind(HeroBonus::IsFrom,_1,HeroBonus::ARTIFACT,0xffffff));
|
||||||
for (std::map<ui16,ui32>::iterator ari = artifWorn.begin(); ari != artifWorn.end(); ari++)
|
for (std::map<ui16,ui32>::iterator ari = artifWorn.begin(); ari != artifWorn.end(); ari++)
|
||||||
{
|
{
|
||||||
@ -928,8 +936,18 @@ void CGVisitableOPH::onHeroVisit( const CGHeroInstance * h ) const
|
|||||||
if(visitors.find(h->id)==visitors.end())
|
if(visitors.find(h->id)==visitors.end())
|
||||||
{
|
{
|
||||||
onNAHeroVisit(h->id, false);
|
onNAHeroVisit(h->id, false);
|
||||||
if(ID != 102 && ID!=4 && ID!=41) //not tree nor arena nor library of enlightenment
|
switch(ID)
|
||||||
|
{
|
||||||
|
case 102: //tree
|
||||||
|
case 4: //arena
|
||||||
|
case 41://library
|
||||||
|
case 47: //School of Magic
|
||||||
|
case 107://School of War
|
||||||
|
break;
|
||||||
|
default:
|
||||||
cb->setObjProperty(id,4,h->id); //add to the visitors
|
cb->setObjProperty(id,4,h->id); //add to the visitors
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -947,7 +965,7 @@ void CGVisitableOPH::initObj()
|
|||||||
|
|
||||||
void CGVisitableOPH::treeSelected( int heroID, int resType, int resVal, int expVal, ui32 result ) const
|
void CGVisitableOPH::treeSelected( int heroID, int resType, int resVal, int expVal, ui32 result ) const
|
||||||
{
|
{
|
||||||
if(result==0) //player agreed to give res for exp
|
if(result) //player agreed to give res for exp
|
||||||
{
|
{
|
||||||
cb->giveResource(cb->getOwner(heroID),resType,-resVal); //take resource
|
cb->giveResource(cb->getOwner(heroID),resType,-resVal); //take resource
|
||||||
cb->changePrimSkill(heroID,4,expVal); //give exp
|
cb->changePrimSkill(heroID,4,expVal); //give exp
|
||||||
@ -992,6 +1010,12 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
|
|||||||
case 41:
|
case 41:
|
||||||
ot = 66;
|
ot = 66;
|
||||||
break;
|
break;
|
||||||
|
case 47: //School of Magic
|
||||||
|
ot = 71;
|
||||||
|
break;
|
||||||
|
case 107://School of War
|
||||||
|
ot = 158;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (!alreadyVisited)
|
if (!alreadyVisited)
|
||||||
{
|
{
|
||||||
@ -999,12 +1023,12 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
|
|||||||
{
|
{
|
||||||
case 4: //arena
|
case 4: //arena
|
||||||
{
|
{
|
||||||
SelectionDialog sd;
|
BlockingDialog sd(false,true);
|
||||||
sd.text << std::pair<ui8,ui32>(11,ot);
|
sd.text << std::pair<ui8,ui32>(11,ot);
|
||||||
sd.components.push_back(Component(0,0,2,0));
|
sd.components.push_back(Component(0,0,2,0));
|
||||||
sd.components.push_back(Component(0,1,2,0));
|
sd.components.push_back(Component(0,1,2,0));
|
||||||
sd.player = cb->getOwner(heroID);
|
sd.player = cb->getOwner(heroID);
|
||||||
cb->showSelectionDialog(&sd,boost::bind(&CGVisitableOPH::arenaSelected,this,heroID,_1));
|
cb->showBlockingDialog(&sd,boost::bind(&CGVisitableOPH::arenaSelected,this,heroID,_1));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case 51:
|
case 51:
|
||||||
@ -1030,7 +1054,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
|
|||||||
cb->changePrimSkill(heroID,4,val);
|
cb->changePrimSkill(heroID,4,val);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 102:
|
case 102://tree
|
||||||
{
|
{
|
||||||
const CGHeroInstance *h = cb->getHero(heroID);
|
const CGHeroInstance *h = cb->getHero(heroID);
|
||||||
val = VLC->heroh->reqExp(h->level+val) - VLC->heroh->reqExp(h->level);
|
val = VLC->heroh->reqExp(h->level+val) - VLC->heroh->reqExp(h->level);
|
||||||
@ -1071,15 +1095,15 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
YesNoDialog sd;
|
BlockingDialog sd(true,false);
|
||||||
sd.player = cb->getOwner(heroID);
|
sd.player = cb->getOwner(heroID);
|
||||||
sd.text << std::pair<ui8,ui32>(11,ot);
|
sd.text << std::pair<ui8,ui32>(11,ot);
|
||||||
sd.components.push_back(Component(id,subid,val,0));
|
sd.components.push_back(Component(id,subid,val,0));
|
||||||
cb->showYesNoDialog(&sd,boost::bind(&CGVisitableOPH::treeSelected,this,heroID,res,resval,val,_1));
|
cb->showBlockingDialog(&sd,boost::bind(&CGVisitableOPH::treeSelected,this,heroID,res,resval,val,_1));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 41:
|
case 41://library of enlightenment
|
||||||
{
|
{
|
||||||
const CGHeroInstance *h = cb->getHero(heroID);
|
const CGHeroInstance *h = cb->getHero(heroID);
|
||||||
if(h->level < 10 - 2*h->getSecSkillLevel(4)) //not enough level
|
if(h->level < 10 - 2*h->getSecSkillLevel(4)) //not enough level
|
||||||
@ -1103,6 +1127,28 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 47: //School of Magic
|
||||||
|
case 107://School of War
|
||||||
|
{
|
||||||
|
int skill = (ID==47 ? 2 : 0);
|
||||||
|
if(cb->getResource(cb->getOwner(heroID),6) < 1000) //not enough resources
|
||||||
|
{
|
||||||
|
InfoWindow iw;
|
||||||
|
iw.player = cb->getOwner(heroID);
|
||||||
|
iw.text << std::pair<ui8,ui32>(MetaString::ADVOB_TXT,ot+2);
|
||||||
|
cb->showInfoDialog(&iw);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BlockingDialog sd(true,true);
|
||||||
|
sd.player = cb->getOwner(heroID);
|
||||||
|
sd.text << std::pair<ui8,ui32>(11,ot);
|
||||||
|
sd.components.push_back(Component(Component::PRIM_SKILL, skill, +1, 0));
|
||||||
|
sd.components.push_back(Component(Component::PRIM_SKILL, skill+1, +1, 0));
|
||||||
|
cb->showBlockingDialog(&sd,boost::bind(&CGVisitableOPH::schoolSelected,this,heroID,_1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1143,6 +1189,12 @@ const std::string & CGVisitableOPH::getHoverText() const
|
|||||||
break;
|
break;
|
||||||
case 41:
|
case 41:
|
||||||
break;
|
break;
|
||||||
|
case 47: //School of Magic
|
||||||
|
pom = 9;
|
||||||
|
break;
|
||||||
|
case 107://School of War
|
||||||
|
pom = 10;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw std::string("Wrong CGVisitableOPH object ID!\n");
|
throw std::string("Wrong CGVisitableOPH object ID!\n");
|
||||||
}
|
}
|
||||||
@ -1163,7 +1215,7 @@ const std::string & CGVisitableOPH::getHoverText() const
|
|||||||
void CGVisitableOPH::arenaSelected( int heroID, int primSkill ) const
|
void CGVisitableOPH::arenaSelected( int heroID, int primSkill ) const
|
||||||
{
|
{
|
||||||
cb->setObjProperty(id,4,heroID); //add to the visitors
|
cb->setObjProperty(id,4,heroID); //add to the visitors
|
||||||
cb->changePrimSkill(heroID,primSkill,2);
|
cb->changePrimSkill(heroID,primSkill-1,2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGVisitableOPH::setPropertyDer( ui8 what, ui32 val )
|
void CGVisitableOPH::setPropertyDer( ui8 what, ui32 val )
|
||||||
@ -1172,6 +1224,17 @@ void CGVisitableOPH::setPropertyDer( ui8 what, ui32 val )
|
|||||||
visitors.insert(val);
|
visitors.insert(val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGVisitableOPH::schoolSelected(int heroID, ui32 which) const
|
||||||
|
{
|
||||||
|
if(!which) //player refused to pay
|
||||||
|
return;
|
||||||
|
|
||||||
|
int base = (ID == 47 ? 2 : 0);
|
||||||
|
cb->setObjProperty(id,4,heroID); //add to the visitors
|
||||||
|
cb->giveResource(cb->getOwner(heroID),6,-1000); //take 1000 gold
|
||||||
|
cb->changePrimSkill(heroID, base + which-1, +1); //give appropriate skill
|
||||||
|
}
|
||||||
|
|
||||||
bool CArmedInstance::needsLastStack() const
|
bool CArmedInstance::needsLastStack() const
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -1302,10 +1365,10 @@ void CGResource::onHeroVisit( const CGHeroInstance * h ) const
|
|||||||
{
|
{
|
||||||
if(message.size())
|
if(message.size())
|
||||||
{
|
{
|
||||||
YesNoDialog ynd;
|
BlockingDialog ynd(true,false);
|
||||||
ynd.player = h->getOwner();
|
ynd.player = h->getOwner();
|
||||||
ynd.text << message;
|
ynd.text << message;
|
||||||
cb->showYesNoDialog(&ynd,boost::bind(&CGResource::fightForRes,this,_1,h));
|
cb->showBlockingDialog(&ynd,boost::bind(&CGResource::fightForRes,this,_1,h));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1337,9 +1400,9 @@ void CGResource::collectRes( int player ) const
|
|||||||
cb->removeObject(id);
|
cb->removeObject(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGResource::fightForRes(ui32 refusedFight, const CGHeroInstance *h) const
|
void CGResource::fightForRes(ui32 agreed, const CGHeroInstance *h) const
|
||||||
{
|
{
|
||||||
if(!refusedFight)
|
if(agreed)
|
||||||
cb->startBattleI(h->id,army,pos,boost::bind(&CGResource::endBattle,this,_1,h));
|
cb->startBattleI(h->id,army,pos,boost::bind(&CGResource::endBattle,this,_1,h));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1519,10 +1582,10 @@ void CGArtifact::onHeroVisit( const CGHeroInstance * h ) const
|
|||||||
{
|
{
|
||||||
if(message.size())
|
if(message.size())
|
||||||
{
|
{
|
||||||
YesNoDialog ynd;
|
BlockingDialog ynd(true,false);
|
||||||
ynd.player = h->getOwner();
|
ynd.player = h->getOwner();
|
||||||
ynd.text << message;
|
ynd.text << message;
|
||||||
cb->showYesNoDialog(&ynd,boost::bind(&CGArtifact::fightForArt,this,_1,h));
|
cb->showBlockingDialog(&ynd,boost::bind(&CGArtifact::fightForArt,this,_1,h));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1544,9 +1607,9 @@ void CGArtifact::pick(const CGHeroInstance * h) const
|
|||||||
cb->removeObject(id);
|
cb->removeObject(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGArtifact::fightForArt( ui32 refusedFight, const CGHeroInstance *h ) const
|
void CGArtifact::fightForArt( ui32 agreed, const CGHeroInstance *h ) const
|
||||||
{
|
{
|
||||||
if(!refusedFight)
|
if(agreed)
|
||||||
cb->startBattleI(h->id,army,pos,boost::bind(&CGArtifact::endBattle,this,_1,h));
|
cb->startBattleI(h->id,army,pos,boost::bind(&CGArtifact::endBattle,this,_1,h));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1632,13 +1695,13 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SelectionDialog sd;
|
BlockingDialog sd(false,true);
|
||||||
sd.player = h->tempOwner;
|
sd.player = h->tempOwner;
|
||||||
sd.text << std::pair<ui8,ui32>(11,146);
|
sd.text << std::pair<ui8,ui32>(11,146);
|
||||||
sd.components.push_back(Component(2,6,val1,0));
|
sd.components.push_back(Component(2,6,val1,0));
|
||||||
sd.components.push_back(Component(5,0,val2,0));
|
sd.components.push_back(Component(5,0,val2,0));
|
||||||
boost::function<void(ui32)> fun = boost::bind(&CGPickable::chosen,this,_1,h->id);
|
boost::function<void(ui32)> fun = boost::bind(&CGPickable::chosen,this,_1,h->id);
|
||||||
cb->showSelectionDialog(&sd,fun);
|
cb->showBlockingDialog(&sd,fun);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1650,10 +1713,10 @@ void CGPickable::chosen( int which, int heroID ) const
|
|||||||
{
|
{
|
||||||
switch(which)
|
switch(which)
|
||||||
{
|
{
|
||||||
case 0: //player pick gold
|
case 1: //player pick gold
|
||||||
cb->giveResource(cb->getOwner(heroID),6,val1);
|
cb->giveResource(cb->getOwner(heroID),6,val1);
|
||||||
break;
|
break;
|
||||||
case 1: //player pick exp
|
case 2: //player pick exp
|
||||||
cb->changePrimSkill(heroID, 4, val2);
|
cb->changePrimSkill(heroID, 4, val2);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1930,7 +1993,7 @@ void CGObservatory::onHeroVisit( const CGHeroInstance * h ) const
|
|||||||
|
|
||||||
InfoWindow iw;
|
InfoWindow iw;
|
||||||
iw.player = h->tempOwner;
|
iw.player = h->tempOwner;
|
||||||
iw.text.addTxt(MetaString::ADVOB_TXT,98);
|
iw.text.addTxt(MetaString::ADVOB_TXT,98 + (ID==60));
|
||||||
cb->showInfoDialog(&iw);
|
cb->showInfoDialog(&iw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,6 +352,7 @@ public:
|
|||||||
void onNAHeroVisit(int heroID, bool alreadyVisited) const;
|
void onNAHeroVisit(int heroID, bool alreadyVisited) const;
|
||||||
void initObj();
|
void initObj();
|
||||||
void treeSelected(int heroID, int resType, int resVal, int expVal, ui32 result) const; //handle player's anwer to the Tree of Knowledge dialog
|
void treeSelected(int heroID, int resType, int resVal, int expVal, ui32 result) const; //handle player's anwer to the Tree of Knowledge dialog
|
||||||
|
void schoolSelected(int heroID, ui32 which) const;
|
||||||
void arenaSelected(int heroID, int primSkill) const;
|
void arenaSelected(int heroID, int primSkill) const;
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
@ -498,7 +499,7 @@ public:
|
|||||||
std::string message;
|
std::string message;
|
||||||
ui32 spell; //if it's spell scroll
|
ui32 spell; //if it's spell scroll
|
||||||
void onHeroVisit(const CGHeroInstance * h) const;
|
void onHeroVisit(const CGHeroInstance * h) const;
|
||||||
void fightForArt(ui32 refusedFight, const CGHeroInstance *h) const;
|
void fightForArt(ui32 agreed, const CGHeroInstance *h) const;
|
||||||
void endBattle(BattleResult *result, const CGHeroInstance *h) const;
|
void endBattle(BattleResult *result, const CGHeroInstance *h) const;
|
||||||
void pick( const CGHeroInstance * h ) const;
|
void pick( const CGHeroInstance * h ) const;
|
||||||
void initObj();
|
void initObj();
|
||||||
@ -519,7 +520,7 @@ public:
|
|||||||
void onHeroVisit(const CGHeroInstance * h) const;
|
void onHeroVisit(const CGHeroInstance * h) const;
|
||||||
void collectRes(int player) const;
|
void collectRes(int player) const;
|
||||||
void initObj();
|
void initObj();
|
||||||
void fightForRes(ui32 refusedFight, const CGHeroInstance *h) const;
|
void fightForRes(ui32 agreed, const CGHeroInstance *h) const;
|
||||||
void endBattle(BattleResult *result, const CGHeroInstance *h) const;
|
void endBattle(BattleResult *result, const CGHeroInstance *h) const;
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
|
@ -11,8 +11,7 @@ struct GiveBonus;
|
|||||||
class CGObjectInstance;
|
class CGObjectInstance;
|
||||||
class CGTownInstance;
|
class CGTownInstance;
|
||||||
class CGHeroInstance;
|
class CGHeroInstance;
|
||||||
struct SelectionDialog;
|
struct BlockingDialog;
|
||||||
struct YesNoDialog;
|
|
||||||
struct InfoWindow;
|
struct InfoWindow;
|
||||||
struct MetaString;
|
struct MetaString;
|
||||||
struct ShowInInfobox;
|
struct ShowInInfobox;
|
||||||
@ -52,8 +51,8 @@ public:
|
|||||||
virtual void changePrimSkill(int ID, int which, int val, bool abs=false)=0;
|
virtual void changePrimSkill(int ID, int which, int val, bool abs=false)=0;
|
||||||
virtual void changeSecSkill(int ID, int which, int val, bool abs=false)=0;
|
virtual void changeSecSkill(int ID, int which, int val, bool abs=false)=0;
|
||||||
virtual void showInfoDialog(InfoWindow *iw)=0;
|
virtual void showInfoDialog(InfoWindow *iw)=0;
|
||||||
virtual void showYesNoDialog(YesNoDialog *iw, const CFunctionList<void(ui32)> &callback)=0;
|
virtual void showBlockingDialog(BlockingDialog *iw, const CFunctionList<void(ui32)> &callback)=0;
|
||||||
virtual void showSelectionDialog(SelectionDialog *iw, const CFunctionList<void(ui32)> &callback)=0; //returns question id
|
virtual ui32 showBlockingDialog(BlockingDialog *iw) =0; //synchronous version of above
|
||||||
virtual void giveResource(int player, int which, int val)=0;
|
virtual void giveResource(int player, int which, int val)=0;
|
||||||
virtual void showCompInfo(ShowInInfobox * comp)=0;
|
virtual void showCompInfo(ShowInInfobox * comp)=0;
|
||||||
virtual void heroVisitCastle(int obj, int heroID)=0;
|
virtual void heroVisitCastle(int obj, int heroID)=0;
|
||||||
|
@ -555,35 +555,43 @@ struct HeroLevelUp : public Query//2000
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SelectionDialog : public Query//2001
|
//A dialog that requires making decision by player - it may contain components to choose between or has yes/no options
|
||||||
|
//Client responds with QueryReply, where answer: 0 - cancel pressed, choice doesn't matter; 1/2/... - first/second/... component selected and OK pressed
|
||||||
|
//Until sending reply player won't be allowed to take any actions
|
||||||
|
struct BlockingDialog : public Query//2003
|
||||||
{
|
{
|
||||||
|
enum {ALLOW_CANCEL = 1, SELECTION = 2};
|
||||||
|
|
||||||
void applyCl(CClient *cl);
|
void applyCl(CClient *cl);
|
||||||
|
|
||||||
MetaString text;
|
MetaString text;
|
||||||
std::vector<Component> components;
|
std::vector<Component> components;
|
||||||
ui8 player;
|
ui8 player;
|
||||||
|
ui8 flags;
|
||||||
|
|
||||||
SelectionDialog(){type = 2001;};
|
bool cancel() const
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
|
||||||
{
|
{
|
||||||
h & id & text & components & player;
|
return flags & ALLOW_CANCEL;
|
||||||
|
}
|
||||||
|
bool selection() const
|
||||||
|
{
|
||||||
|
return flags & SELECTION;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
struct YesNoDialog : public Query//2002
|
BlockingDialog(bool yesno, bool Selection)
|
||||||
{
|
{
|
||||||
void applyCl(CClient *cl);
|
type = 2003;
|
||||||
|
if(yesno) flags |= ALLOW_CANCEL;
|
||||||
MetaString text;
|
if(Selection) flags |= SELECTION;
|
||||||
std::vector<Component> components;
|
}
|
||||||
ui8 player;
|
BlockingDialog()
|
||||||
|
{
|
||||||
YesNoDialog(){type = 2002;};
|
type = 2003;
|
||||||
|
};
|
||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int version)
|
template <typename Handler> void serialize(Handler &h, const int version)
|
||||||
{
|
{
|
||||||
h & id & text & components & player;
|
h & id & text & components & player & flags;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -67,8 +67,7 @@ void registerTypes2(Serializer &s)
|
|||||||
s.template registerType<SetObjectProperty>();
|
s.template registerType<SetObjectProperty>();
|
||||||
s.template registerType<SetHoverName>();
|
s.template registerType<SetHoverName>();
|
||||||
s.template registerType<HeroLevelUp>();
|
s.template registerType<HeroLevelUp>();
|
||||||
s.template registerType<SelectionDialog>();
|
s.template registerType<BlockingDialog>();
|
||||||
s.template registerType<YesNoDialog>();
|
|
||||||
s.template registerType<BattleStart>();
|
s.template registerType<BattleStart>();
|
||||||
s.template registerType<BattleNextRound>();
|
s.template registerType<BattleNextRound>();
|
||||||
s.template registerType<BattleSetActiveStack>();
|
s.template registerType<BattleSetActiveStack>();
|
||||||
|
5
map.cpp
5
map.cpp
@ -1413,7 +1413,7 @@ void Mapa::readObjects( unsigned char * bufor, int &i)
|
|||||||
loadHero(nobj, bufor, i);
|
loadHero(nobj, bufor, i);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 4: //arena
|
case 4: //Arena
|
||||||
case 51: //Mercenary Camp
|
case 51: //Mercenary Camp
|
||||||
case 23: //Marletto Tower
|
case 23: //Marletto Tower
|
||||||
case 61: // Star Axis
|
case 61: // Star Axis
|
||||||
@ -1421,6 +1421,8 @@ void Mapa::readObjects( unsigned char * bufor, int &i)
|
|||||||
case 100: //Learning Stone
|
case 100: //Learning Stone
|
||||||
case 102: //Tree of Knowledge
|
case 102: //Tree of Knowledge
|
||||||
case 41: //Library of Enlightenment
|
case 41: //Library of Enlightenment
|
||||||
|
case 47: //School of Magic
|
||||||
|
case 107: //School of War
|
||||||
{
|
{
|
||||||
nobj = new CGVisitableOPH();
|
nobj = new CGVisitableOPH();
|
||||||
break;
|
break;
|
||||||
@ -1784,6 +1786,7 @@ void Mapa::readObjects( unsigned char * bufor, int &i)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 58: //Redwood Observatory
|
case 58: //Redwood Observatory
|
||||||
|
case 60: //Pillar of Fire
|
||||||
{
|
{
|
||||||
nobj = new CGObservatory();
|
nobj = new CGObservatory();
|
||||||
break;
|
break;
|
||||||
|
@ -1208,14 +1208,27 @@ void CGameHandler::showInfoDialog(InfoWindow *iw)
|
|||||||
{
|
{
|
||||||
sendToAllClients(iw);
|
sendToAllClients(iw);
|
||||||
}
|
}
|
||||||
void CGameHandler::showYesNoDialog( YesNoDialog *iw, const CFunctionList<void(ui32)> &callback )
|
void CGameHandler::showBlockingDialog( BlockingDialog *iw, const CFunctionList<void(ui32)> &callback )
|
||||||
{
|
{
|
||||||
ask(iw,iw->player,callback);
|
ask(iw,iw->player,callback);
|
||||||
}
|
}
|
||||||
void CGameHandler::showSelectionDialog(SelectionDialog *iw, const CFunctionList<void(ui32)> &callback)
|
|
||||||
|
ui32 CGameHandler::showBlockingDialog( BlockingDialog *iw )
|
||||||
{
|
{
|
||||||
ask(iw,iw->player,callback);
|
//TODO
|
||||||
|
|
||||||
|
//gsm.lock();
|
||||||
|
//int query = QID++;
|
||||||
|
//states.addQuery(player,query);
|
||||||
|
//sendToAllClients(iw);
|
||||||
|
//gsm.unlock();
|
||||||
|
//ui32 ret = getQueryResult(iw->player, query);
|
||||||
|
//gsm.lock();
|
||||||
|
//states.removeQuery(player, query);
|
||||||
|
//gsm.unlock();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CGameHandler::getCurrentPlayer()
|
int CGameHandler::getCurrentPlayer()
|
||||||
{
|
{
|
||||||
return gs->currentPlayer;
|
return gs->currentPlayer;
|
||||||
@ -1439,8 +1452,11 @@ void CGameHandler::save( const std::string &fname )
|
|||||||
|
|
||||||
void CGameHandler::close()
|
void CGameHandler::close()
|
||||||
{
|
{
|
||||||
tlog0 << "We have been requested to close.\n";
|
tlog0 << "We have been requested to close.\n";
|
||||||
exit(0);
|
//BOOST_FOREACH(CConnection *cc, conns)
|
||||||
|
// if(cc && cc->socket && cc->socket->is_open())
|
||||||
|
// cc->socket->close();
|
||||||
|
//exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGameHandler::arrangeStacks(si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2, si32 val)
|
void CGameHandler::arrangeStacks(si32 id1, si32 id2, ui8 what, ui8 p1, ui8 p2, si32 val)
|
||||||
@ -2300,8 +2316,9 @@ void CGameHandler::makeCustomAction( BattleAction &ba )
|
|||||||
case 52: //misfortune
|
case 52: //misfortune
|
||||||
case 53: //haste
|
case 53: //haste
|
||||||
case 54: //slow
|
case 54: //slow
|
||||||
|
case 61: //forgetfulness
|
||||||
{
|
{
|
||||||
SPELL_CAST_TEMPLATE_1(ba.additionalInfo, h->getPrimSkillLevel(2))
|
SPELL_CAST_TEMPLATE_1(ba.additionalInfo, h->getPrimSkillLevel(2) + h->valOfBonuses(HeroBonus::SPELL_DURATION) )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 56: //frenzy
|
case 56: //frenzy
|
||||||
@ -2309,11 +2326,6 @@ void CGameHandler::makeCustomAction( BattleAction &ba )
|
|||||||
SPELL_CAST_TEMPLATE_1(ba.additionalInfo, 1)
|
SPELL_CAST_TEMPLATE_1(ba.additionalInfo, 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 61: //forgetfulness
|
|
||||||
{
|
|
||||||
SPELL_CAST_TEMPLATE_1(ba.additionalInfo, h->getPrimSkillLevel(2))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sendAndApply(&EndAction());
|
sendAndApply(&EndAction());
|
||||||
}
|
}
|
||||||
@ -2380,4 +2392,10 @@ bool CGameHandler::complain( const std::string &problem )
|
|||||||
sendMessageToAll("Server encountered a problem: " + problem);
|
sendMessageToAll("Server encountered a problem: " + problem);
|
||||||
tlog1 << problem << std::endl;
|
tlog1 << problem << std::endl;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui32 CGameHandler::getQueryResult( ui8 player, int queryID )
|
||||||
|
{
|
||||||
|
//TODO: write
|
||||||
|
return 0;
|
||||||
}
|
}
|
@ -93,8 +93,8 @@ public:
|
|||||||
void changePrimSkill(int ID, int which, int val, bool abs=false);
|
void changePrimSkill(int ID, int which, int val, bool abs=false);
|
||||||
void changeSecSkill(int ID, int which, int val, bool abs=false);
|
void changeSecSkill(int ID, int which, int val, bool abs=false);
|
||||||
void showInfoDialog(InfoWindow *iw);
|
void showInfoDialog(InfoWindow *iw);
|
||||||
void showYesNoDialog(YesNoDialog *iw, const CFunctionList<void(ui32)> &callback);
|
void showBlockingDialog(BlockingDialog *iw, const CFunctionList<void(ui32)> &callback);
|
||||||
void showSelectionDialog(SelectionDialog *iw, const CFunctionList<void(ui32)> &callback); //returns question id
|
ui32 showBlockingDialog(BlockingDialog *iw); //synchronous version of above
|
||||||
void giveResource(int player, int which, int val);
|
void giveResource(int player, int which, int val);
|
||||||
void showCompInfo(ShowInInfobox * comp);
|
void showCompInfo(ShowInInfobox * comp);
|
||||||
void heroVisitCastle(int obj, int heroID);
|
void heroVisitCastle(int obj, int heroID);
|
||||||
@ -142,6 +142,7 @@ public:
|
|||||||
h & QID & states;
|
h & QID & states;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ui32 getQueryResult(ui8 player, int queryID);
|
||||||
void sendMessageToAll(const std::string &message);
|
void sendMessageToAll(const std::string &message);
|
||||||
void sendMessageTo(CConnection &c, const std::string &message);
|
void sendMessageTo(CConnection &c, const std::string &message);
|
||||||
void applyAndAsk(Query * sel, ui8 player, boost::function<void(ui32)> &callback);
|
void applyAndAsk(Query * sel, ui8 player, boost::function<void(ui32)> &callback);
|
||||||
|
Reference in New Issue
Block a user