diff --git a/AI/GeniusAI/BattleLogic.cpp b/AI/GeniusAI/BattleLogic.cpp index 8ca4baca6..4636d1345 100644 --- a/AI/GeniusAI/BattleLogic.cpp +++ b/AI/GeniusAI/BattleLogic.cpp @@ -16,6 +16,10 @@ using namespace geniusai::BattleAI; using namespace boost::lambda; using namespace std; +#if _MSC_VER >= 1600 +#define bind boost::lambda::bind +#endif + /* ui8 side; //who made this action: false - left, true - right player ui32 stackNumber;//stack ID, -1 left hero, -2 right hero, diff --git a/CGameInterface.h b/CGameInterface.h index 71675a9a2..63fc6c3fd 100644 --- a/CGameInterface.h +++ b/CGameInterface.h @@ -114,7 +114,7 @@ public: virtual void actionStarted(const BattleAction *action){};//occurs BEFORE every action taken by any stack or by the hero virtual BattleAction activeStack(int stackID)=0; //called when it's turn of that stack virtual void battleAttack(BattleAttack *ba){}; //called when stack is performing attack - virtual void battleStacksAttacked(std::set & bsa){}; //called when stack receives damage (after battleAttack()) + virtual void battleStacksAttacked(std::vector & bsa){}; //called when stack receives damage (after battleAttack()) virtual void battleEnd(BattleResult *br){}; virtual void battleResultsApplied(){}; //called when all effects of last battle are applied virtual void battleNewRound(int round){}; //called at the beggining of each turn, round=-1 is the tactic phase, round=0 is the first "normal" turn diff --git a/client/AdventureMapButton.cpp b/client/AdventureMapButton.cpp index 836585e86..9dad33d3b 100644 --- a/client/AdventureMapButton.cpp +++ b/client/AdventureMapButton.cpp @@ -151,7 +151,7 @@ void AdventureMapButton::clickRight(tribool down, bool previousState) { if(down && helpBox.size()) //there is no point to show window with nothing inside... if(LOCPLINT) - LOCPLINT->adventureInt->handleRightClick(helpBox,down,this); + adventureInt->handleRightClick(helpBox,down,this); else GH.pushInt(new CRClickPopupInt(CMessage::genWindow(helpBox, 0),true)); } @@ -268,6 +268,14 @@ void AdventureMapButton::setDef(const std::string & defName, bool playerColoredB } delete temp; } + +void AdventureMapButton::setPlayerColor(int player) +{ + for(int i =0; iblueToPlayersAdv(imgs[i][j],player); +} + void CHighlightableButton::select(bool on) { selected = on; diff --git a/client/AdventureMapButton.h b/client/AdventureMapButton.h index a6fe487c8..f9272084d 100644 --- a/client/AdventureMapButton.h +++ b/client/AdventureMapButton.h @@ -78,6 +78,7 @@ public: void init(const CFunctionList &Callback, const std::map &Name, const std::string &HelpBox, bool playerColoredButton, const std::string &defName, std::vector * add, int x, int y, int key ); void setDef(const std::string & defName, bool playerColoredButton); + void setPlayerColor(int player); }; class CHighlightableButton diff --git a/client/CAdvmapInterface.cpp b/client/CAdvmapInterface.cpp index 6cd0a972a..732703400 100644 --- a/client/CAdvmapInterface.cpp +++ b/client/CAdvmapInterface.cpp @@ -47,6 +47,8 @@ using namespace boost::logic; using namespace boost::assign; using namespace CSDL_Ext; +CAdvMapInt *adventureInt; + CMinimap::CMinimap(bool draw) { int3 mapSizes = LOCPLINT->cb->getMapSize(); @@ -123,7 +125,7 @@ void CMinimap::draw(SDL_Surface * to) { int3 mapSizes = LOCPLINT->cb->getMapSize(); //draw terrain - blitAt(map[LOCPLINT->adventureInt->position.z],0,0,temps); + blitAt(map[adventureInt->position.z],0,0,temps); //draw heroes std::vector hh = LOCPLINT->cb->getHeroesInfo(false); @@ -133,7 +135,7 @@ void CMinimap::draw(SDL_Surface * to) for (size_t i=0; i < hh.size(); ++i) { int3 hpos = hh[i]->getPosition(false); - if(hpos.z!=LOCPLINT->adventureInt->position.z) + if(hpos.z!=adventureInt->position.z) continue; //float zawx = ((float)hpos.x/CGI->mh->sizes.x), zawy = ((float)hpos.y/CGI->mh->sizes.y); int3 maplgp ( (hpos.x*mw)/mapSizes.x, (hpos.y*mh)/mapSizes.y, hpos.z ); @@ -147,13 +149,13 @@ void CMinimap::draw(SDL_Surface * to) } } - blitAt(flObjs[LOCPLINT->adventureInt->position.z],0,0,temps); + blitAt(flObjs[adventureInt->position.z],0,0,temps); - blitAt(FoW[LOCPLINT->adventureInt->position.z],0,0,temps); + blitAt(FoW[adventureInt->position.z],0,0,temps); //draw radar - int bx = (((float)LOCPLINT->adventureInt->position.x)/(((float)mapSizes.x)))*pos.w, - by = (((float)LOCPLINT->adventureInt->position.y)/(((float)mapSizes.y)))*pos.h; + int bx = (((float)adventureInt->position.x)/(((float)mapSizes.x)))*pos.w, + by = (((float)adventureInt->position.y)/(((float)mapSizes.y)))*pos.h; blitAt(radar,bx,by,temps); blitAt(temps,pos.x,pos.y,to); } @@ -270,7 +272,7 @@ void CMinimap::updateRadar() void CMinimap::clickRight(tribool down, bool previousState) { - LOCPLINT->adventureInt->handleRightClick(rcText,down,this); + adventureInt->handleRightClick(rcText,down,this); } void CMinimap::clickLeft(tribool down, bool previousState) @@ -292,17 +294,17 @@ void CMinimap::clickLeft(tribool down, bool previousState) int3 newCPos; newCPos.x = (CGI->mh->sizes.x*dx); newCPos.y = (CGI->mh->sizes.y*dy); - newCPos.z = LOCPLINT->adventureInt->position.z; - LOCPLINT->adventureInt->centerOn(newCPos); + newCPos.z = adventureInt->position.z; + adventureInt->centerOn(newCPos); } void CMinimap::hover (bool on) { //Hoverable::hover(on); if (on) - LOCPLINT->adventureInt->statusbar.print(statusbarTxt); - else if (LOCPLINT->adventureInt->statusbar.current==statusbarTxt) - LOCPLINT->adventureInt->statusbar.clear(); + adventureInt->statusbar.print(statusbarTxt); + else if (adventureInt->statusbar.current==statusbarTxt) + adventureInt->statusbar.clear(); } void CMinimap::mouseMoved (const SDL_MouseMotionEvent & sEvent) @@ -478,7 +480,7 @@ void CTerrainRect::clickLeft(tribool down, bool previousState) std::vector < const CGObjectInstance * > bobjs = LOCPLINT->cb->getBlockingObjs(mp), //blocking objects at tile vobjs = LOCPLINT->cb->getVisitableObjs(mp); //visitable objects - if (LOCPLINT->adventureInt->selection->ID != HEROI_TYPE) //hero is not selected (presumably town) + if (adventureInt->selection->ID != HEROI_TYPE) //hero is not selected (presumably town) { if(currentPath) { @@ -491,16 +493,16 @@ void CTerrainRect::clickLeft(tribool down, bool previousState) { if(bobjs[i]->ID == TOWNI_TYPE && bobjs[i]->getOwner() == LOCPLINT->playerID) //our town clicked { - if(LOCPLINT->adventureInt->selection == (bobjs[i])) //selected town clicked + if(adventureInt->selection == (bobjs[i])) //selected town clicked LOCPLINT->openTownWindow(static_cast(bobjs[i])); else - LOCPLINT->adventureInt->select(static_cast(bobjs[i])); + adventureInt->select(static_cast(bobjs[i])); return; } else if(bobjs[i]->ID == HEROI_TYPE && bobjs[i]->tempOwner == LOCPLINT->playerID) //hero clicked - select him { - LOCPLINT->adventureInt->select(static_cast(bobjs[i])); + adventureInt->select(static_cast(bobjs[i])); return; } } @@ -509,7 +511,7 @@ void CTerrainRect::clickLeft(tribool down, bool previousState) else //hero is selected { bool townEntrance = false; //town entrance tile has been clicked? - const CGHeroInstance * currentHero = static_cast(LOCPLINT->adventureInt->selection); + const CGHeroInstance * currentHero = static_cast(adventureInt->selection); for(size_t i=0; i < vobjs.size(); ++i) { @@ -527,7 +529,7 @@ void CTerrainRect::clickLeft(tribool down, bool previousState) || o->ID == TOWNI_TYPE) //or town && o->tempOwner == LOCPLINT->playerID) //but must belong to us { - LOCPLINT->adventureInt->select(static_cast(o)); + adventureInt->select(static_cast(o)); return; } else if(o->ID == HEROI_TYPE //it's a hero @@ -555,10 +557,10 @@ void CTerrainRect::clickLeft(tribool down, bool previousState) else if(mp.z == currentHero->pos.z) //remove old path and find a new one if we clicked on the map level on which hero is present { int3 bufpos = currentHero->getPosition(false); - CGPath &path = LOCPLINT->adventureInt->paths[currentHero]; + CGPath &path = LOCPLINT->paths[currentHero]; currentPath = &path; if(!LOCPLINT->cb->getPath2(mp, path)) - LOCPLINT->adventureInt->eraseCurrentPathOf(currentHero); + LOCPLINT->eraseCurrentPathOf(currentHero); } } //end of hero is selected "case" } @@ -675,7 +677,7 @@ void CTerrainRect::clickRight(tribool down, bool previousState) } default: { - LOCPLINT->adventureInt->handleRightClick(obj->getHoverText(),down,this); + adventureInt->handleRightClick(obj->getHoverText(),down,this); break; } } @@ -683,7 +685,7 @@ void CTerrainRect::clickRight(tribool down, bool previousState) void CTerrainRect::mouseMoved (const SDL_MouseMotionEvent & sEvent) { int3 tHovered = whichTileIsIt(sEvent.x,sEvent.y); - int3 pom = LOCPLINT->adventureInt->verifyPos(tHovered); + int3 pom = adventureInt->verifyPos(tHovered); if(tHovered != pom) //tile outside the map { @@ -700,11 +702,11 @@ void CTerrainRect::mouseMoved (const SDL_MouseMotionEvent & sEvent) if (temp.size()) { boost::replace_all(temp.back(),"\n"," "); - LOCPLINT->adventureInt->statusbar.print(temp.back()); + adventureInt->statusbar.print(temp.back()); } else { - LOCPLINT->adventureInt->statusbar.clear(); + adventureInt->statusbar.clear(); } const CGPathNode *pnode = LOCPLINT->cb->getPathInfo(pom); @@ -715,9 +717,9 @@ void CTerrainRect::mouseMoved (const SDL_MouseMotionEvent & sEvent) int turns = pnode->turns; amin(turns, 3); - if(LOCPLINT->adventureInt->selection) + if(adventureInt->selection) { - if(LOCPLINT->adventureInt->selection->ID == TOWNI_TYPE) + if(adventureInt->selection->ID == TOWNI_TYPE) { if(obj && obj->tempOwner == LOCPLINT->playerID) { @@ -735,9 +737,9 @@ void CTerrainRect::mouseMoved (const SDL_MouseMotionEvent & sEvent) CGI->curh->changeGraphic(0, 0); } } - else if(LOCPLINT->adventureInt->selection->ID == HEROI_TYPE) + else if(adventureInt->selection->ID == HEROI_TYPE) { - const CGHeroInstance *h = static_cast(LOCPLINT->adventureInt->selection); + const CGHeroInstance *h = static_cast(adventureInt->selection); if(obj) { if(obj->ID == HEROI_TYPE) @@ -751,7 +753,7 @@ void CTerrainRect::mouseMoved (const SDL_MouseMotionEvent & sEvent) } else //our hero { - if(LOCPLINT->adventureInt->selection == obj) + if(adventureInt->selection == obj) CGI->curh->changeGraphic(0, 2); else if(accessible) CGI->curh->changeGraphic(0, 8 + turns*6); @@ -855,7 +857,7 @@ void CTerrainRect::hover(bool on) { if (!on) { - LOCPLINT->adventureInt->statusbar.clear(); + adventureInt->statusbar.clear(); CGI->curh->changeGraphic(0,0); } //Hoverable::hover(on); @@ -867,8 +869,8 @@ void CTerrainRect::showPath(const SDL_Rect * extRect, SDL_Surface * to) int pn=-1;//number of picture if (i==0) //last tile { - int x = 32*(currentPath->nodes[i].coord.x-LOCPLINT->adventureInt->position.x)+CGI->mh->offsetX + pos.x, - y = 32*(currentPath->nodes[i].coord.y-LOCPLINT->adventureInt->position.y)+CGI->mh->offsetY + pos.y; + int x = 32*(currentPath->nodes[i].coord.x-adventureInt->position.x)+CGI->mh->offsetX + pos.x, + y = 32*(currentPath->nodes[i].coord.y-adventureInt->position.y)+CGI->mh->offsetY + pos.y; if (x<0 || y<0 || x>pos.w || y>pos.h) continue; pn=0; @@ -1129,8 +1131,8 @@ void CTerrainRect::showPath(const SDL_Rect * extRect, SDL_Surface * to) pn+=25; if (pn>=0) { - int x = 32*(currentPath->nodes[i].coord.x-LOCPLINT->adventureInt->position.x)+CGI->mh->offsetX + pos.x, - y = 32*(currentPath->nodes[i].coord.y-LOCPLINT->adventureInt->position.y)+CGI->mh->offsetY + pos.y; + int x = 32*(currentPath->nodes[i].coord.x-adventureInt->position.x)+CGI->mh->offsetX + pos.x, + y = 32*(currentPath->nodes[i].coord.y-adventureInt->position.y)+CGI->mh->offsetY + pos.y; if (x<0 || y<0 || x>pos.w || y>pos.h) continue; int hvx = (x+arrows->ourImages[pn].bitmap->w)-(pos.x+pos.w), @@ -1199,18 +1201,18 @@ void CTerrainRect::show(SDL_Surface * to) { if(ADVOPT.smoothMove) CGI->mh->terrainRect - (LOCPLINT->adventureInt->position, LOCPLINT->adventureInt->anim, - &LOCPLINT->cb->getVisibilityMap(), true, LOCPLINT->adventureInt->heroAnim, + (adventureInt->position, adventureInt->anim, + &LOCPLINT->cb->getVisibilityMap(), true, adventureInt->heroAnim, to, &pos, moveX, moveY, false); else CGI->mh->terrainRect - (LOCPLINT->adventureInt->position, LOCPLINT->adventureInt->anim, - &LOCPLINT->cb->getVisibilityMap(), true, LOCPLINT->adventureInt->heroAnim, + (adventureInt->position, adventureInt->anim, + &LOCPLINT->cb->getVisibilityMap(), true, adventureInt->heroAnim, to, &pos, 0, 0, false); //SDL_BlitSurface(teren,&genRect(pos.h,pos.w,0,0),screen,&genRect(547,594,7,6)); //SDL_FreeSurface(teren); - if (currentPath && LOCPLINT->adventureInt->position.z==currentPath->startPos().z) //drawing path + if (currentPath && adventureInt->position.z==currentPath->startPos().z) //drawing path { showPath(&pos, to); } @@ -1219,9 +1221,9 @@ void CTerrainRect::show(SDL_Surface * to) int3 CTerrainRect::whichTileIsIt(const int & x, const int & y) { int3 ret; - ret.x = LOCPLINT->adventureInt->position.x + ((GH.current->motion.x-CGI->mh->offsetX-pos.x)/32); - ret.y = LOCPLINT->adventureInt->position.y + ((GH.current->motion.y-CGI->mh->offsetY-pos.y)/32); - ret.z = LOCPLINT->adventureInt->position.z; + ret.x = adventureInt->position.x + ((GH.current->motion.x-CGI->mh->offsetX-pos.x)/32); + ret.y = adventureInt->position.y + ((GH.current->motion.y-CGI->mh->offsetY-pos.y)/32); + ret.z = adventureInt->position.z; return ret; } int3 CTerrainRect::whichTileIsIt() @@ -1333,10 +1335,10 @@ void CInfoBar::draw(SDL_Surface * to, const CGObjectInstance * specific) else if (mode==5) { mode = -1; - draw(to,LOCPLINT->adventureInt->selection); + draw(to,adventureInt->selection); } if (!specific) - specific = LOCPLINT->adventureInt->selection; + specific = adventureInt->selection; if(!specific) return; @@ -1483,9 +1485,8 @@ void CInfoBar::deactivate() deactivateTimer(); } -CAdvMapInt::CAdvMapInt(int Player) -:player(Player), -statusbar(ADVOPT.statusbarX,ADVOPT.statusbarY,ADVOPT.statusbarG), +CAdvMapInt::CAdvMapInt() +:statusbar(ADVOPT.statusbarX,ADVOPT.statusbarY,ADVOPT.statusbarG), kingOverview(CGI->generaltexth->zelp[293].first,CGI->generaltexth->zelp[293].second, boost::bind(&CAdvMapInt::fshowOverview,this),&ADVOPT.kingOverview, SDLK_k), @@ -1519,14 +1520,14 @@ endTurn(CGI->generaltexth->zelp[302].first,CGI->generaltexth->zelp[302].second, heroList(ADVOPT.hlistSize), townList(ADVOPT.tlistSize,ADVOPT.tlistX,ADVOPT.tlistY,ADVOPT.tlistAU,ADVOPT.tlistAD)//(5,&genRect(192,48,747,196),747,196,747,372), { + player = 0; pos.x = pos.y = 0; pos.w = screen->w; pos.h = screen->h; selection = NULL; townList.fun = boost::bind(&CAdvMapInt::selectionChanged,this); - LOCPLINT->adventureInt=this; + adventureInt=this; bg = BitmapHandler::loadBitmap(ADVOPT.mainGraphic); - graphics->blueToPlayersAdv(bg,player); scrollingDir = 0; updateScreen = false; anim=0; @@ -1593,7 +1594,7 @@ void CAdvMapInt::fmoveHero() return; LOCPLINT->pim->unlock(); - LOCPLINT->moveHero(static_cast(LOCPLINT->adventureInt->selection),*terrain.currentPath); + LOCPLINT->moveHero(static_cast(adventureInt->selection),*terrain.currentPath); LOCPLINT->pim->lock(); } @@ -1603,7 +1604,7 @@ void CAdvMapInt::fshowSpellbok() return; - CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, (conf.cc.resx - 620)/2, (conf.cc.resy - 595)/2), (static_cast(LOCPLINT->adventureInt->selection)), false); + CSpellWindow * spellWindow = new CSpellWindow(genRect(595, 620, (conf.cc.resx - 620)/2, (conf.cc.resy - 595)/2), (static_cast(adventureInt->selection)), false); GH.pushInt(spellWindow); } @@ -1637,6 +1638,7 @@ void CAdvMapInt::fnextHero() void CAdvMapInt::fendTurn() { + LOCPLINT->cingconsole->deactivate(); LOCPLINT->makingTurn = false; LOCPLINT->cb->endTurn(); } @@ -1694,13 +1696,14 @@ void CAdvMapInt::deactivate() terrain.deactivate(); infoBar.deactivate(); infoBar.mode=-1; - - LOCPLINT->cingconsole->deactivate(); } void CAdvMapInt::showAll(SDL_Surface *to) { blitAt(bg,0,0,to); + if(state != INGAME) + return; + kingOverview.show(to); underground.show(to); questlog.show(to); @@ -1727,6 +1730,9 @@ void CAdvMapInt::showAll(SDL_Surface *to) } void CAdvMapInt::show(SDL_Surface *to) { + if(state != INGAME) + return; + ++animValHitCount; //for animations if(animValHitCount == 8) { @@ -1794,8 +1800,8 @@ void CAdvMapInt::centerOn(int3 on) on = LOCPLINT->repairScreenPos(on); - LOCPLINT->adventureInt->position = on; - LOCPLINT->adventureInt->updateScreen=true; + adventureInt->position = on; + adventureInt->updateScreen=true; updateMinimap=true; underground.curimg = on.z; //change underground switch button image if(GH.topInt() == this) @@ -1902,7 +1908,7 @@ void CAdvMapInt::keyPressed(const SDL_KeyboardEvent & key) int3 dir = directions[k]; - CGPath &path = paths[h]; + CGPath &path = LOCPLINT->paths[h]; terrain.currentPath = &path; if(!LOCPLINT->cb->getPath2(h->getPosition(false) + dir, path)) { @@ -1977,24 +1983,7 @@ void CAdvMapInt::select(const CArmedInstance *sel ) heroList.fixPos(); } - if(vstd::contains(paths,h)) //hero has assigned path - { - CGPath &path = paths[h]; - if(!path.nodes.size()) - { - tlog3 << "Warning: empty path found...\n"; - paths.erase(h); - } - else - { - assert(h->getPosition(false) == path.startPos()); - //update the hero path in case of something has changed on map - if(LOCPLINT->cb->getPath2(path.endPos(), path)) - terrain.currentPath = &path; - else - paths.erase(h); - } - } + terrain.currentPath = LOCPLINT->getAndVerifyPath(h); } townList.draw(screen); heroList.draw(screen); @@ -2046,13 +2035,36 @@ bool CAdvMapInt::isActive() return active & ~CIntObject::KEYBOARD; } -void CAdvMapInt::eraseCurrentPathOf( const CGHeroInstance * ho ) +void CAdvMapInt::startHotSeatWait(int Player) { - assert(vstd::contains(paths, ho)); - assert(ho == selection); + setPlayer(Player); + state = WAITING; +} - paths.erase(ho); - terrain.currentPath = NULL; +void CAdvMapInt::setPlayer(int Player) +{ + player = Player; + graphics->blueToPlayersAdv(bg,player); + + kingOverview.setPlayerColor(player); + underground.setPlayerColor(player); + questlog.setPlayerColor(player); + sleepWake.setPlayerColor(player); + moveHero.setPlayerColor(player); + spellbook.setPlayerColor(player); + sysOptions.setPlayerColor(player); + advOptions.setPlayerColor(player); + nextHero.setPlayerColor(player); + endTurn.setPlayerColor(player); + graphics->blueToPlayersAdv(resdatabar.bg,player); + + heroList.updateHList(); + townList.genList(); +} + +void CAdvMapInt::startTurn() +{ + state = INGAME; } CAdventureOptions::CAdventureOptions() diff --git a/client/CAdvmapInterface.h b/client/CAdvmapInterface.h index 69c620b1a..9b3a3cf2a 100644 --- a/client/CAdvmapInterface.h +++ b/client/CAdvmapInterface.h @@ -133,7 +133,7 @@ public: class CAdvMapInt : public CIntObject //adventure map interface { public: - CAdvMapInt(int Player); + CAdvMapInt(); ~CAdvMapInt(); int3 position; //top left corner of visible map part @@ -143,6 +143,8 @@ public: enum{LEFT=1, RIGHT=2, UP=4, DOWN=8}; ui8 scrollingDir; //uses enum: LEFT RIGHT, UP, DOWN + enum{NA, INGAME, WAITING} state; + bool updateScreen, updateMinimap ; unsigned char anim, animValHitCount; //animation frame unsigned char heroAnim, heroAnimValHitCount; //animation frame @@ -174,7 +176,6 @@ public: CHeroWindow * heroWindow; const CArmedInstance *selection; //currently selected town/hero - std::map paths; //maps hero => selected path in adventure map //functions bound to buttons void fshowOverview(); @@ -202,6 +203,12 @@ public: void keyPressed(const SDL_KeyboardEvent & key); void mouseMoved (const SDL_MouseMotionEvent & sEvent); bool isActive(); - void eraseCurrentPathOf( const CGHeroInstance * ho ); + + void setPlayer(int Player); + void startHotSeatWait(int Player); + void startTurn(); }; + +extern CAdvMapInt *adventureInt; + #endif // __CADVMAPINTERFACE_H__ diff --git a/client/CBattleInterface.cpp b/client/CBattleInterface.cpp index 98ba9ffef..2d999c270 100644 --- a/client/CBattleInterface.cpp +++ b/client/CBattleInterface.cpp @@ -2671,7 +2671,7 @@ void CBattleInterface::spellCast(SpellCast * sc) void CBattleInterface::battleStacksEffectsSet(const SetStackEffect & sse) { - for(std::set::const_iterator ci = sse.stacks.begin(); ci!=sse.stacks.end(); ++ci) + for(std::vector::const_iterator ci = sse.stacks.begin(); ci!=sse.stacks.end(); ++ci) { displayEffect(CGI->spellh->spells[sse.effect.id].mainEffectAnim, curInt->cb->battleGetStackByID(*ci)->position); } diff --git a/client/CCastleInterface.cpp b/client/CCastleInterface.cpp index b5ac1221d..a4ea63663 100644 --- a/client/CCastleInterface.cpp +++ b/client/CCastleInterface.cpp @@ -532,9 +532,9 @@ CCastleInterface::~CCastleInterface() void CCastleInterface::close() { if(town->visitingHero) - LOCPLINT->adventureInt->select(town->visitingHero); + adventureInt->select(town->visitingHero); else - LOCPLINT->adventureInt->select(town); + adventureInt->select(town); LOCPLINT->castleInt = NULL; GH.popIntTotally(this); CGI->musich->stopMusic(5000); @@ -761,7 +761,7 @@ void CCastleInterface::showAll( SDL_Surface * to/*=NULL*/) { blitAt(cityBg,pos,to); blitAt(townInt,pos.x,pos.y+374,to); - LOCPLINT->adventureInt->resdatabar.draw(to); + adventureInt->resdatabar.draw(to); townlist->draw(to); statusbar->show(to); resdatabar->draw(to); @@ -937,11 +937,7 @@ void CCastleInterface::recreateBuildings() { delete buildings[itpb]; buildings.erase(buildings.begin() + itpb); - #ifndef __GNUC__ - obecny->second = st->ID; //XXX look closer! - #else *(const_cast(&(obecny->second))) = st->ID; - #endif buildings.push_back(new CBuildingRect(st)); } } diff --git a/client/CKingdomInterface.cpp b/client/CKingdomInterface.cpp index 44448b86d..0221d9ebc 100644 --- a/client/CKingdomInterface.cpp +++ b/client/CKingdomInterface.cpp @@ -241,7 +241,7 @@ void CKingdomInterface::updateAllGarrisons() void CKingdomInterface::showAll( SDL_Surface * to/*=NULL*/) { - LOCPLINT->adventureInt->resdatabar.draw(to); + adventureInt->resdatabar.draw(to); blitAt(bg,pos,to); resdatabar->draw(to); toTowns->show(to); diff --git a/client/CMT.cpp b/client/CMT.cpp index f0393e434..8d86c8684 100644 --- a/client/CMT.cpp +++ b/client/CMT.cpp @@ -193,7 +193,6 @@ int main(int argc, char** argv) playIntro(); SDL_FillRect(screen,NULL,0); SDL_Flip(screen); - SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); loading.join(); tlog0<<"Initialization of VCMI (together): "<activate(); break; case 1: - LOCPLINT->adventureInt->activate(); + adventureInt->activate(); break; case 2: LOCPLINT->castleInt->activate(); @@ -416,6 +415,7 @@ static void setScreenRes(int w, int h, int bpp, bool fullscreen) SDL_EnableUNICODE(1); SDL_WM_SetCaption(NAME.c_str(),""); //set window title SDL_ShowCursor(SDL_DISABLE); + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); #ifdef _WIN32 SDL_SysWMinfo wm; diff --git a/client/CMessage.cpp b/client/CMessage.cpp index 341974f28..5a7c21782 100644 --- a/client/CMessage.cpp +++ b/client/CMessage.cpp @@ -127,7 +127,7 @@ std::vector * CMessage::breakText(std::string text, size_t maxLineS unsigned int braces = 0; bool opened = false; - while((text[z] != 0) && (text[z] != 0x0a) && (z < maxLineSize+braces)) + while(z < text.length() && (text[z] != 0x0a) && (z < maxLineSize+braces)) { /* We don't count braces in string length. */ if (text[z] == '{') @@ -144,7 +144,7 @@ std::vector * CMessage::breakText(std::string text, size_t maxLineS z++; } - if ((text[z] != 0) && (text[z] != 0x0a)) + if (z < text.length() && (text[z] != 0x0a)) { /* We have a long line. Try to do a nice line break, if * possible. We backtrack on the line until we find a @@ -185,7 +185,7 @@ std::vector * CMessage::breakText(std::string text, size_t maxLineS ret->push_back(""); //add empty string, no extra actions needed } - if (text[0] == 0x0a) + if (text.length() && text[0] == 0x0a) { /* Braces do not carry over lines. The map author forgot * to close it. */ @@ -292,14 +292,14 @@ std::vector > * CMessage::drawText(std::vector > * CMessage::drawText(std::vector #include #include +#include "../StartInfo.h" #ifdef min #undef min @@ -75,6 +76,9 @@ CBattleInterface * CPlayerInterface::battleInt; enum EMoveState {STOP_MOVE, WAITING_MOVE, CONTINUE_MOVE, DURING_MOVE}; CondSh stillMoveHero; //used during hero movement +int howManyPeople = 0; + + struct OCM_HLP_CGIN { bool inline operator ()(const std::pair & a, const std::pair & b) const @@ -87,6 +91,7 @@ struct OCM_HLP_CGIN CPlayerInterface::CPlayerInterface(int Player, int serial) { + howManyPeople++; GH.defActionsDef = 0; LOCPLINT = this; curAction = NULL; @@ -94,7 +99,6 @@ CPlayerInterface::CPlayerInterface(int Player, int serial) serialID=serial; human=true; castleInt = NULL; - adventureInt = NULL; battleInt = NULL; pim = new boost::recursive_mutex; makingTurn = false; @@ -112,6 +116,7 @@ CPlayerInterface::CPlayerInterface(int Player, int serial) } CPlayerInterface::~CPlayerInterface() { + howManyPeople--; delete pim; delete showingDialog; delete mainFPSmng; @@ -133,7 +138,9 @@ CPlayerInterface::~CPlayerInterface() void CPlayerInterface::init(ICallback * CB) { cb = dynamic_cast(CB); - adventureInt = new CAdvMapInt(playerID); + if(!adventureInt) + adventureInt = new CAdvMapInt(); + std::vector tt = cb->getTownsInfo(false); for(int i=0;i un(*pim); - boost::unique_lock lock(eventsM); //block handling events until interface is ready - - LOCPLINT = this; - makingTurn = true; - - if(firstCall) { - autosaveCount = getLastIndex("Autosave_"); - GH.pushInt(adventureInt); - adventureInt->activateKeys(); - if(firstCall > 0) //new game, not laoded + boost::unique_lock un(*pim); + boost::unique_lock lock(eventsM); //block handling events until interface is ready + + LOCPLINT = this; + makingTurn = true; + GH.curInt = this; + + if(firstCall) { - int index = getLastIndex("Newgame_Autosave_"); - index %= SAVES_COUNT; - cb->save("Newgame_Autosave_" + boost::lexical_cast(index + 1)); + if(howManyPeople == 1) + adventureInt->setPlayer(playerID); + + autosaveCount = getLastIndex("Autosave_"); + + if(!GH.listInt.size()) + { + GH.pushInt(adventureInt); + adventureInt->activateKeys(); + } + + if(firstCall > 0) //new game, not loaded + { + int index = getLastIndex("Newgame_Autosave_"); + index %= SAVES_COUNT; + cb->save("Newgame_Autosave_" + boost::lexical_cast(index + 1)); + } + firstCall = 0; } - firstCall = 0; - } - else - { - LOCPLINT->cb->save("Autosave_" + boost::lexical_cast(autosaveCount++ + 1)); - autosaveCount %= 5; + else + { + LOCPLINT->cb->save("Autosave_" + boost::lexical_cast(autosaveCount++ + 1)); + autosaveCount %= 5; + } + + if(howManyPeople > 1) //hot seat message + { + adventureInt->startHotSeatWait(playerID); + std::string msg = CGI->generaltexth->allTexts[13]; + boost::replace_first(msg, "%s", cb->getStartInfo()->playerInfos[serialID].name); + std::vector cmp; + cmp.push_back(new SComponent(SComponent::flag, playerID, 0)); + showInfoDialog(msg, cmp); + } + else + adventureInt->startTurn(); } - for(std::map::iterator i=graphics->heroWins.begin(); i!=graphics->heroWins.end();i++) //redraw hero infoboxes - SDL_FreeSurface(i->second); - graphics->heroWins.clear(); - std::vector hh = cb->getHeroesInfo(false); - for(int i=0;iheroWins.insert(std::pair(hh[i]->subID,pom)); - } - - /* TODO: This isn't quite right. First day in game should play - * NEWDAY. And we don't play NEWMONTH. */ - int day = cb->getDate(1); - if (day != 1) - CGI->soundh->playSound(soundBase::newDay); - else - CGI->soundh->playSound(soundBase::newWeek); - - adventureInt->infoBar.newDay(day); - - //select first hero if available. - //TODO: check if hero is slept - if(wanderingHeroes.size()) - adventureInt->select(wanderingHeroes[0]); - else - adventureInt->select(adventureInt->townList.items[0]); - - adventureInt->showAll(screen); - - GH.curInt = this; + acceptTurn(); } inline void subRect(const int & x, const int & y, const int & z, const SDL_Rect & r, const int & hid) @@ -224,6 +225,8 @@ inline void delObjRect(const int & x, const int & y, const int & z, const int & } void CPlayerInterface::heroMoved(const TryMoveHero & details) { + if(LOCPLINT != this) + return; boost::unique_lock un(*pim); const CGHeroInstance * ho = cb->getHeroInfo(details.id); //object representing this hero int3 hp = details.start; @@ -238,21 +241,21 @@ void CPlayerInterface::heroMoved(const TryMoveHero & details) if(details.result == TryMoveHero::TELEPORTATION || details.start == details.end) { if(adventureInt->terrain.currentPath) - adventureInt->eraseCurrentPathOf(ho); + eraseCurrentPathOf(ho); return; //teleport - no fancy moving animation //TODO: smooth disappear / appear effect } if (details.result != TryMoveHero::SUCCESS && details.result != TryMoveHero::FAILED) //hero didn't change tile but visit succeeded { - adventureInt->eraseCurrentPathOf(ho); + eraseCurrentPathOf(ho); } else if(adventureInt->terrain.currentPath && details.result == TryMoveHero::SUCCESS) //&& hero is moving { //remove one node from the path (the one we went) adventureInt->terrain.currentPath->nodes.erase(adventureInt->terrain.currentPath->nodes.end()-1); if(!adventureInt->terrain.currentPath->nodes.size()) //if it was the last one, remove entire path - adventureInt->eraseCurrentPathOf(ho); + eraseCurrentPathOf(ho); } } @@ -377,10 +380,10 @@ int3 CPlayerInterface::repairScreenPos(int3 pos) pos.x = -CGI->mh->frameW; if(pos.y<-CGI->mh->frameH) pos.y = -CGI->mh->frameH; - if(pos.x>CGI->mh->map->width - this->adventureInt->terrain.tilesw + CGI->mh->frameW) - pos.x = CGI->mh->map->width - this->adventureInt->terrain.tilesw + CGI->mh->frameW; - if(pos.y>CGI->mh->map->height - this->adventureInt->terrain.tilesh + CGI->mh->frameH) - pos.y = CGI->mh->map->height - this->adventureInt->terrain.tilesh + CGI->mh->frameH; + if(pos.x>CGI->mh->map->width - adventureInt->terrain.tilesw + CGI->mh->frameW) + pos.x = CGI->mh->map->width - adventureInt->terrain.tilesw + CGI->mh->frameW; + if(pos.y>CGI->mh->map->height - adventureInt->terrain.tilesh + CGI->mh->frameH) + pos.y = CGI->mh->map->height - adventureInt->terrain.tilesh + CGI->mh->frameH; return pos; } void CPlayerInterface::heroPrimarySkillChanged(const CGHeroInstance * hero, int which, si64 val) @@ -733,7 +736,7 @@ void CPlayerInterface::battleStacksEffectsSet(SetStackEffect & sse) boost::unique_lock un(*pim); battleInt->battleStacksEffectsSet(sse); } -void CPlayerInterface::battleStacksAttacked(std::set & bsa) +void CPlayerInterface::battleStacksAttacked(std::vector & bsa) { if(LOCPLINT != this) { //another local interface should do this @@ -746,7 +749,7 @@ void CPlayerInterface::battleStacksAttacked(std::set & bsa) std::vector arg; - for(std::set::iterator i = bsa.begin(); i != bsa.end(); i++) + for(std::vector::iterator i = bsa.begin(); i != bsa.end(); i++) { if(i->isEffect() && i->effect != 12) //and not armageddon { @@ -788,7 +791,7 @@ void CPlayerInterface::battleAttack(BattleAttack *ba) if(ba->shot()) { - for(std::set::iterator i = ba->bsa.begin(); i != ba->bsa.end(); i++) + for(std::vector::iterator i = ba->bsa.begin(); i != ba->bsa.end(); i++) battleInt->stackIsShooting(ba->stackAttacking,cb->battleGetPos(i->stackAttacked), i->stackAttacked); } else @@ -1169,7 +1172,7 @@ void CPlayerInterface::newObject( const CGObjectInstance * obj ) void CPlayerInterface::centerView (int3 pos, int focusTime) { - LOCPLINT->adventureInt->centerOn (pos); + adventureInt->centerOn (pos); if(focusTime) { bool activeAdv = (GH.topInt() == adventureInt && adventureInt->isActive()); @@ -1789,3 +1792,74 @@ SystemOptions::SystemOptions() printMouseShadow = true; showQueue = true; } + +void CPlayerInterface::eraseCurrentPathOf( const CGHeroInstance * ho ) +{ + assert(vstd::contains(paths, ho)); + assert(ho == adventureInt->selection); + + paths.erase(ho); + adventureInt->terrain.currentPath = NULL; +} + +CGPath * CPlayerInterface::getAndVerifyPath(const CGHeroInstance * h) +{ + if(vstd::contains(paths,h)) //hero has assigned path + { + CGPath &path = paths[h]; + if(!path.nodes.size()) + { + tlog3 << "Warning: empty path found...\n"; + paths.erase(h); + } + else + { + assert(h->getPosition(false) == path.startPos()); + //update the hero path in case of something has changed on map + if(LOCPLINT->cb->getPath2(path.endPos(), path)) + return &path; + else + paths.erase(h); + } + } + + return NULL; +} + +void CPlayerInterface::acceptTurn() +{ + waitWhileDialog(); + + if(howManyPeople > 1) + adventureInt->startTurn(); + + boost::unique_lock un(*pim); + for(std::map::iterator i=graphics->heroWins.begin(); i!=graphics->heroWins.end();i++) //redraw hero infoboxes + SDL_FreeSurface(i->second); + graphics->heroWins.clear(); + std::vector hh = cb->getHeroesInfo(false); + for(int i=0;iheroWins.insert(std::pair(hh[i]->subID,pom)); + } + + /* TODO: This isn't quite right. First day in game should play + * NEWDAY. And we don't play NEWMONTH. */ + int day = cb->getDate(1); + if (day != 1) + CGI->soundh->playSound(soundBase::newDay); + else + CGI->soundh->playSound(soundBase::newWeek); + + adventureInt->infoBar.newDay(day); + + //select first hero if available. + //TODO: check if hero is slept + if(wanderingHeroes.size()) + adventureInt->select(wanderingHeroes[0]); + else + adventureInt->select(adventureInt->townList.items[0]); + + adventureInt->showAll(screen); +} \ No newline at end of file diff --git a/client/CPlayerInterface.h b/client/CPlayerInterface.h index 641eee64d..5f36075f2 100644 --- a/client/CPlayerInterface.h +++ b/client/CPlayerInterface.h @@ -121,7 +121,6 @@ public: SystemOptions sysOpts; - CAdvMapInt * adventureInt; CCastleInterface * castleInt; //NULL if castle window isn't opened static CBattleInterface * battleInt; //NULL if no battle FPSmanager * mainFPSmng; //to keep const framerate @@ -134,6 +133,7 @@ public: std::vector wanderingHeroes; //our heroes on the adventure map (not the garrisoned ones) + std::map paths; //maps hero => selected path in adventure map void update(); void recreateWanderingHeroes(); @@ -186,7 +186,7 @@ public: void battleStackMoved(int ID, int dest, int distance, bool end); void battleSpellCast(SpellCast *sc); void battleStacksEffectsSet(SetStackEffect & sse); //called when a specific effect is set to stacks - void battleStacksAttacked(std::set & bsa); + void battleStacksAttacked(std::vector & bsa); 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 obstacles); //called when battlefield is prepared, prior the battle beginning void battleStacksHealedRes(const std::vector > & healedStacks); //called when stacks are healed / resurrected @@ -209,10 +209,14 @@ public: int3 repairScreenPos(int3 pos); //returns position closest to pos we can center screen on void showInfoDialog(const std::string &text, const std::vector & components = std::vector(), int soundID = 0); void showYesNoDialog(const std::string &text, const std::vector & components, CFunctionList onYes, CFunctionList onNo, bool DelComps); //deactivateCur - whether current main interface should be deactivated; delComps - if components will be deleted on window close + bool moveHero(const CGHeroInstance *h, CGPath path); void initMovement(const TryMoveHero &details, const CGHeroInstance * ho, const int3 &hp );//initializing objects and performing first step of move void movementPxStep( const TryMoveHero &details, int i, const int3 &hp, const CGHeroInstance * ho );//performing step of movement void finishMovement( const TryMoveHero &details, const int3 &hp, const CGHeroInstance * ho ); //finish movement + void eraseCurrentPathOf( const CGHeroInstance * ho ); + CGPath *getAndVerifyPath( const CGHeroInstance * h ); + void acceptTurn(); //used during hot seat after your turn message is closed CPlayerInterface(int Player, int serial);//c-tor ~CPlayerInterface();//d-tor diff --git a/client/CPreGame.cpp b/client/CPreGame.cpp index daf735d40..7db2690d4 100644 --- a/client/CPreGame.cpp +++ b/client/CPreGame.cpp @@ -46,6 +46,12 @@ namespace fs = boost::filesystem; using boost::bind; using boost::ref; + +#if _MSC_VER >= 1600 + #define bind boost::bind + #define ref boost::ref +#endif + void startGame(StartInfo * options); CGPreGame * CGP; @@ -2090,7 +2096,7 @@ CBonusSelection::CBonusSelection( const CCampaign * _ourCampaign, int _whichMap blitAt(panel, 456, 6, background); startB = new AdventureMapButton("", "", 0 /*cb*/, 475, 536, "SCNRBEG.DEF", SDLK_RETURN); - backB = new AdventureMapButton("", "", boost::bind(&CBonusSelection::goBack, this), 624, 536, "SCNRBACK.DEF", SDLK_ESCAPE); + backB = new AdventureMapButton("", "", bind(&CBonusSelection::goBack, this), 624, 536, "SCNRBACK.DEF", SDLK_ESCAPE); //campaign name if (ourCampaign->header.name.length()) diff --git a/client/CSpellWindow.cpp b/client/CSpellWindow.cpp index 8ea212c05..5bae0d019 100644 --- a/client/CSpellWindow.cpp +++ b/client/CSpellWindow.cpp @@ -51,7 +51,7 @@ void SpellbookInteractiveArea::clickLeft(tribool down, bool previousState) void SpellbookInteractiveArea::clickRight(tribool down, bool previousState) { - myInt->adventureInt->handleRightClick(textOnRclick, down, this); + adventureInt->handleRightClick(textOnRclick, down, this); } void SpellbookInteractiveArea::hover(bool on) diff --git a/client/Client.cpp b/client/Client.cpp index f891d5eca..138095baa 100644 --- a/client/Client.cpp +++ b/client/Client.cpp @@ -91,6 +91,7 @@ public: void CClient::init() { + hotSeat = false; connectionHandler = NULL; pathInfo = NULL; applier = new CCLApplier; @@ -196,6 +197,7 @@ void CClient::endGame() GH.topInt()->deactivate(); GH.listInt.clear(); GH.objsToBlit.clear(); + GH.statusbar = NULL; tlog0 << "Removed GUI." << std::endl; delete CGI->mh; @@ -301,25 +303,6 @@ void CClient::loadGame( const std::string & fname ) CLoadFile lf(fname + ".vcgm1"); lf >> *this; } - //for (size_t i=0; iscenarioOps->playerInfos.size();++i) //initializing interfaces for players - //{ - // ui8 color = gs->scenarioOps->playerInfos[i].color; - // CCallback *cb = new CCallback(gs,color,this); - // if(!gs->scenarioOps->playerInfos[i].human) { - // playerint[color] = static_cast(CAIHandler::getNewAI(cb,conf.cc.defaultAI)); - // } - // else { - // playerint[color] = new CPlayerInterface(color,i); - // } - // gs->currentPlayer = color; - // playerint[color]->init(cb); - // tlog0 <<"Setting up interface for player "<< (int)color <<": "<init(new CCallback(gs,255,this)); - //tlog0 <<"Setting up interface for neutral \"player\"" << tmh.getDif() << std::endl; - - } int CClient::getCurrentPlayer() @@ -416,19 +399,26 @@ void CClient::newGame( CConnection *con, StartInfo *si ) pathInfo = new CPathsInfo(int3(mapa->width, mapa->height, mapa->twoLevel+1)); tlog0 <<"Initializing mapHandler (together): "<scenarioOps->playerInfos.size();++i) //initializing interfaces for players { ui8 color = gs->scenarioOps->playerInfos[i].color; CCallback *cb = new CCallback(gs,color,this); - if(!gs->scenarioOps->playerInfos[i].human) { + if(!gs->scenarioOps->playerInfos[i].human) + { playerint[color] = static_cast(CAIHandler::getNewAI(cb,conf.cc.defaultAI)); } - else { + else + { playerint[color] = new CPlayerInterface(color,i); + humanPlayers++; } gs->currentPlayer = color; playerint[color]->init(cb); } + + hotSeat = (humanPlayers > 1); + playerint[255] = CAIHandler::getNewAI(cb,conf.cc.defaultAI); playerint[255]->init(new CCallback(gs,255,this)); } @@ -451,6 +441,7 @@ void CClient::waitForServer() template void CClient::serialize( Handler &h, const int version ) { + h & hotSeat; if(h.saving) { ui8 players = playerint.size(); diff --git a/client/Client.h b/client/Client.h index 29bd1a868..bce947a07 100644 --- a/client/Client.h +++ b/client/Client.h @@ -36,6 +36,7 @@ public: CCallback *cb; std::set callbacks; //callbacks given to player interfaces std::map playerint; + bool hotSeat; CConnection *serv; SharedMem *shared; BattleAction *curbaction; diff --git a/client/GUIClasses.cpp b/client/GUIClasses.cpp index 99eb1948a..74e3dc0da 100644 --- a/client/GUIClasses.cpp +++ b/client/GUIClasses.cpp @@ -953,7 +953,7 @@ SDL_Surface * SComponent::getImg() void SComponent::clickRight(tribool down, bool previousState) { if(description.size()) - LOCPLINT->adventureInt->handleRightClick(description,down,this); + adventureInt->handleRightClick(description,down,this); } void SComponent::activate() { @@ -1159,7 +1159,7 @@ void CStatusBar::print(const std::string & text) if(LOCPLINT->cingconsole->enteredText == "" || text == LOCPLINT->cingconsole->enteredText) //for appropriate support for in-game console { current=text; - show(GH.topInt()==LOCPLINT->adventureInt ? screen : screen2); //if there are now windows opened, update statusbar on screen, else to cache surface + show(GH.topInt()==adventureInt ? screen : screen2); //if there are now windows opened, update statusbar on screen, else to cache surface } } @@ -1217,7 +1217,7 @@ void CList::fixPos() } CHeroList::CHeroList(int Size) -:CList(Size), heroes(LOCPLINT->wanderingHeroes) +:CList(Size) { arrup = CDefHandler::giveDef(conf.go()->ac.hlistAU); arrdo = CDefHandler::giveDef(conf.go()->ac.hlistAD); @@ -1248,7 +1248,7 @@ void CHeroList::init() { int w = pos.w+1, h = pos.h+4; bg = CSDL_Ext::newSurface(w,h,screen); - SDL_BlitSurface(LOCPLINT->adventureInt->bg,&genRect(w,h,pos.x,pos.y),bg,&genRect(w,h,0,0)); + SDL_BlitSurface(adventureInt->bg,&genRect(w,h,pos.x,pos.y),bg,&genRect(w,h,0,0)); } void CHeroList::genList() @@ -1267,16 +1267,16 @@ void CHeroList::select(int which) if (which<0) { selected = which; - LOCPLINT->adventureInt->selection = NULL; - LOCPLINT->adventureInt->terrain.currentPath = NULL; + adventureInt->selection = NULL; + adventureInt->terrain.currentPath = NULL; draw(screen); - LOCPLINT->adventureInt->infoBar.draw(screen); + adventureInt->infoBar.draw(screen); } - if (which>=heroes.size()) + if (which>=LOCPLINT->wanderingHeroes.size()) return; selected = which; - LOCPLINT->adventureInt->select(heroes[which]); + adventureInt->select(LOCPLINT->wanderingHeroes[which]); } void CHeroList::clickLeft(tribool down, bool previousState) @@ -1295,7 +1295,7 @@ void CHeroList::clickLeft(tribool down, bool previousState) } else if(isItIn(&arrdop,GH.current->motion.x,GH.current->motion.y)) { - if(heroes.size()-from>SIZE) + if(LOCPLINT->wanderingHeroes.size()-from>SIZE) { blitAt(arrdo->ourImages[1].bitmap,arrdop.x,arrdop.y); pressed = false; @@ -1309,8 +1309,8 @@ void CHeroList::clickLeft(tribool down, bool previousState) int ny = hy/32; if (ny>=SIZE || ny<0) return; - if ( (ny+from)==selected && (LOCPLINT->adventureInt->selection->ID == HEROI_TYPE)) - LOCPLINT->openHeroWindow(heroes[selected]);//print hero screen + if ( (ny+from)==selected && (adventureInt->selection->ID == HEROI_TYPE)) + LOCPLINT->openHeroWindow(LOCPLINT->wanderingHeroes[selected]);//print hero screen select(ny+from); } else @@ -1353,17 +1353,17 @@ void CHeroList::mouseMoved (const SDL_MouseMotionEvent & sEvent) if(isItIn(&arrupp,GH.current->motion.x,GH.current->motion.y)) { if (from>0) - LOCPLINT->adventureInt->statusbar.print(CGI->generaltexth->zelp[303].first); + adventureInt->statusbar.print(CGI->generaltexth->zelp[303].first); else - LOCPLINT->adventureInt->statusbar.clear(); + adventureInt->statusbar.clear(); return; } else if(isItIn(&arrdop,GH.current->motion.x,GH.current->motion.y)) { - if ((heroes.size()-from) > SIZE) - LOCPLINT->adventureInt->statusbar.print(CGI->generaltexth->zelp[304].first); + if ((LOCPLINT->wanderingHeroes.size()-from) > SIZE) + adventureInt->statusbar.print(CGI->generaltexth->zelp[304].first); else - LOCPLINT->adventureInt->statusbar.clear(); + adventureInt->statusbar.clear(); return; } //if not buttons then heroes @@ -1371,15 +1371,15 @@ void CHeroList::mouseMoved (const SDL_MouseMotionEvent & sEvent) hx-=pos.x; hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h; int ny = hy/32; - if ((ny>SIZE || ny<0) || (from+ny>=heroes.size())) + if ((ny>SIZE || ny<0) || (from+ny>=LOCPLINT->wanderingHeroes.size())) { - LOCPLINT->adventureInt->statusbar.clear(); + adventureInt->statusbar.clear(); return; } std::vector temp; - temp.push_back(heroes[from+ny]->name); - temp.push_back(heroes[from+ny]->type->heroClass->name); - LOCPLINT->adventureInt->statusbar.print( processStr(CGI->generaltexth->allTexts[15],temp) ); + temp.push_back(LOCPLINT->wanderingHeroes[from+ny]->name); + temp.push_back(LOCPLINT->wanderingHeroes[from+ny]->type->heroClass->name); + adventureInt->statusbar.print( processStr(CGI->generaltexth->allTexts[15],temp) ); //select(ny+from); } @@ -1390,11 +1390,11 @@ void CHeroList::clickRight(tribool down, bool previousState) /***************************ARROWS*****************************************/ if(isItIn(&arrupp,GH.current->motion.x,GH.current->motion.y) && from>0) { - LOCPLINT->adventureInt->handleRightClick(CGI->generaltexth->zelp[303].second,down,this); + adventureInt->handleRightClick(CGI->generaltexth->zelp[303].second,down,this); } - else if(isItIn(&arrdop,GH.current->motion.x,GH.current->motion.y) && (heroes.size()-from>5)) + else if(isItIn(&arrdop,GH.current->motion.x,GH.current->motion.y) && (LOCPLINT->wanderingHeroes.size()-from>5)) { - LOCPLINT->adventureInt->handleRightClick(CGI->generaltexth->zelp[304].second,down,this); + adventureInt->handleRightClick(CGI->generaltexth->zelp[304].second,down,this); } else { @@ -1403,23 +1403,23 @@ void CHeroList::clickRight(tribool down, bool previousState) hx-=pos.x; hy-=pos.y; hy-=arrup->ourImages[0].bitmap->h; int ny = hy/32; - if ((ny>SIZE || ny<0) || (from+ny>=heroes.size())) + if ((ny>SIZE || ny<0) || (from+ny>=LOCPLINT->wanderingHeroes.size())) { return; } //show popup - CInfoPopup * ip = new CInfoPopup(graphics->heroWins[heroes[from+ny]->subID], - GH.current->motion.x-graphics->heroWins[heroes[from+ny]->subID]->w, - GH.current->motion.y-graphics->heroWins[heroes[from+ny]->subID]->h, + CInfoPopup * ip = new CInfoPopup(graphics->heroWins[LOCPLINT->wanderingHeroes[from+ny]->subID], + GH.current->motion.x-graphics->heroWins[LOCPLINT->wanderingHeroes[from+ny]->subID]->w, + GH.current->motion.y-graphics->heroWins[LOCPLINT->wanderingHeroes[from+ny]->subID]->h, false); GH.pushInt(ip); } } else { - LOCPLINT->adventureInt->handleRightClick(CGI->generaltexth->zelp[303].second,down,this); - LOCPLINT->adventureInt->handleRightClick(CGI->generaltexth->zelp[304].second,down,this); + adventureInt->handleRightClick(CGI->generaltexth->zelp[303].second,down,this); + adventureInt->handleRightClick(CGI->generaltexth->zelp[304].second,down,this); } } @@ -1434,18 +1434,18 @@ void CHeroList::keyPressed (const SDL_KeyboardEvent & key) void CHeroList::updateHList(const CGHeroInstance *toRemove) { if(toRemove) //remove specific hero - heroes -= toRemove; + LOCPLINT->wanderingHeroes -= toRemove; else LOCPLINT->recreateWanderingHeroes(); - if(selected >= heroes.size()) - select(heroes.size()-1); + if(selected >= LOCPLINT->wanderingHeroes.size()) + select(LOCPLINT->wanderingHeroes.size()-1); if(toRemove) { - if(heroes.size() == 0) - LOCPLINT->adventureInt->townList.select(0); + if(LOCPLINT->wanderingHeroes.size() == 0) + adventureInt->townList.select(0); else select(selected); } @@ -1454,8 +1454,8 @@ void CHeroList::updateHList(const CGHeroInstance *toRemove) void CHeroList::updateMove(const CGHeroInstance* which) //draws move points bar { int ser = -1; - for(int i=0; isubID == which->subID) + for(int i=0; iwanderingHeroes.size() && ser<0; i++) + if(LOCPLINT->wanderingHeroes[i]->subID == which->subID) ser = i; ser -= from; if(ser<0 || ser >= SIZE) return; @@ -1468,14 +1468,14 @@ void CHeroList::draw(SDL_Surface * to) for (int iT=0+from;iT=heroes.size()) + if (iT>=LOCPLINT->wanderingHeroes.size()) { blitAt(mobile->ourImages[0].bitmap,posmobx,posmoby+i*32,to); blitAt(mana->ourImages[0].bitmap,posmanx,posmany+i*32,to); blitAt(empty,posporx,pospory+i*32,to); continue; } - const CGHeroInstance *cur = heroes[iT]; + const CGHeroInstance *cur = LOCPLINT->wanderingHeroes[iT]; int pom = cur->movement / 100; if (pom>25) pom=25; if (pom<0) pom=0; @@ -1486,7 +1486,7 @@ void CHeroList::draw(SDL_Surface * to) blitAt(mana->ourImages[pom].bitmap,posmanx,posmany+i*32,to); //mana SDL_Surface * temp = graphics->portraitSmall[cur->portrait]; blitAt(temp,posporx,pospory+i*32,to); - if ((selected == iT) && (LOCPLINT->adventureInt->selection->ID == HEROI_TYPE)) + if ((selected == iT) && (adventureInt->selection->ID == HEROI_TYPE)) { blitAt(selection,posporx,pospory+i*32,to); } @@ -1497,7 +1497,7 @@ void CHeroList::draw(SDL_Surface * to) else blitAt(arrup->ourImages[2].bitmap,arrupp.x,arrupp.y,to); - if (heroes.size()-from > SIZE) + if (LOCPLINT->wanderingHeroes.size()-from > SIZE) blitAt(arrdo->ourImages[0].bitmap,arrdop.x,arrdop.y,to); else blitAt(arrdo->ourImages[2].bitmap,arrdop.x,arrdop.y,to); @@ -1505,7 +1505,7 @@ void CHeroList::draw(SDL_Surface * to) int CHeroList::getPosOfHero(const CGHeroInstance* h) { - return vstd::findPos(heroes, h, std::equal_to()); + return vstd::findPos(LOCPLINT->wanderingHeroes, h, std::equal_to()); } void CHeroList::show( SDL_Surface * to ) @@ -1515,7 +1515,7 @@ void CHeroList::show( SDL_Surface * to ) int CHeroList::size() { - return heroes.size(); + return LOCPLINT->wanderingHeroes.size(); } CTownList::~CTownList() @@ -1634,9 +1634,9 @@ void CTownList::clickLeft(tribool down, bool previousState) int ny = hy/32; if (ny>=SIZE || ny<0) return; - if(GH.topInt() == LOCPLINT->adventureInt + if(GH.topInt() == adventureInt && (ny+from)==selected - && LOCPLINT->adventureInt->selection->ID == TOWNI_TYPE + && adventureInt->selection->ID == TOWNI_TYPE ) LOCPLINT->openTownWindow(items[selected]);//print town screen else @@ -1685,11 +1685,11 @@ void CTownList::clickRight(tribool down, bool previousState) /***************************ARROWS*****************************************/ if(isItIn(&arrupp,GH.current->motion.x,GH.current->motion.y) && from>0) { - LOCPLINT->adventureInt->handleRightClick(CGI->generaltexth->zelp[306].second,down,this); + adventureInt->handleRightClick(CGI->generaltexth->zelp[306].second,down,this); } else if(isItIn(&arrdop,GH.current->motion.x,GH.current->motion.y) && (items.size()-from>5)) { - LOCPLINT->adventureInt->handleRightClick(CGI->generaltexth->zelp[307].second,down,this); + adventureInt->handleRightClick(CGI->generaltexth->zelp[307].second,down,this); } //if not buttons then towns int hx = GH.current->motion.x, hy = GH.current->motion.y; @@ -1711,8 +1711,8 @@ void CTownList::clickRight(tribool down, bool previousState) } else { - LOCPLINT->adventureInt->handleRightClick(CGI->generaltexth->zelp[306].second,down,this); - LOCPLINT->adventureInt->handleRightClick(CGI->generaltexth->zelp[307].second,down,this); + adventureInt->handleRightClick(CGI->generaltexth->zelp[306].second,down,this); + adventureInt->handleRightClick(CGI->generaltexth->zelp[307].second,down,this); } } @@ -1737,7 +1737,7 @@ void CTownList::draw(SDL_Surface * to) blitAt(graphics->getPic(items[iT]->subID,items[iT]->hasFort(),items[iT]->builded),posporx,pospory+i*32,to); - if ((selected == iT) && (LOCPLINT->adventureInt->selection->ID == TOWNI_TYPE)) + if ((selected == iT) && (adventureInt->selection->ID == TOWNI_TYPE)) { blitAt(graphics->getPic(-2),posporx,pospory+i*32,to); } @@ -3220,8 +3220,8 @@ void CTavernWindow::HeroPortrait::clickRight(tribool down, bool previousState) { if(down) { - LOCPLINT->adventureInt->heroWindow->setHero(h); - GH.pushInt(new CRClickPopupInt(LOCPLINT->adventureInt->heroWindow,false)); + adventureInt->heroWindow->setHero(h); + GH.pushInt(new CRClickPopupInt(adventureInt->heroWindow,false)); } } @@ -3433,7 +3433,7 @@ void CInGameConsole::keyPressed (const SDL_KeyboardEvent & key) void CInGameConsole::startEnteringText() { enteredText = "_"; - if(GH.topInt() == LOCPLINT->adventureInt) + if(GH.topInt() == adventureInt) { GH.statusbar->print(enteredText); } @@ -3454,7 +3454,7 @@ void CInGameConsole::endEnteringText(bool printEnteredText) print(txt); } enteredText = ""; - if(GH.topInt() == LOCPLINT->adventureInt) + if(GH.topInt() == adventureInt) { GH.statusbar->clear(); } @@ -3467,7 +3467,7 @@ void CInGameConsole::endEnteringText(bool printEnteredText) void CInGameConsole::refreshEnteredText() { - if(GH.topInt() == LOCPLINT->adventureInt) + if(GH.topInt() == adventureInt) { GH.statusbar->print(enteredText); } @@ -3558,8 +3558,8 @@ CRClickPopupInt::~CRClickPopupInt() { //workaround for hero window issue - if it's our interface, call dispose to properly reset it's state //TODO? it might be better to rewrite hero window so it will bee newed/deleted on opening / closing (not effort-worthy now, but on some day...?) - if(LOCPLINT && inner == LOCPLINT->adventureInt->heroWindow) - LOCPLINT->adventureInt->heroWindow->dispose(); + if(LOCPLINT && inner == adventureInt->heroWindow) + adventureInt->heroWindow->dispose(); if(delInner) delete inner; @@ -3880,7 +3880,7 @@ void LRClickableAreaWText::clickLeft(tribool down, bool previousState) } void LRClickableAreaWText::clickRight(tribool down, bool previousState) { - LOCPLINT->adventureInt->handleRightClick(text, down, this); + adventureInt->handleRightClick(text, down, this); } void LRClickableAreaWText::activate() { @@ -3918,7 +3918,7 @@ void LRClickableAreaWTextComp::clickLeft(tribool down, bool previousState) } void LRClickableAreaWTextComp::clickRight(tribool down, bool previousState) { - LOCPLINT->adventureInt->handleRightClick(text, down, this); + adventureInt->handleRightClick(text, down, this); } void LRClickableAreaWTextComp::activate() { @@ -4751,8 +4751,8 @@ CPuzzleWindow::CPuzzleWindow(const int3 &grailPos, float discoveredRatio) //printing necessary things to background int3 moveInt = int3(8, 9, 0); CGI->mh->terrainRect - (grailPos - moveInt, LOCPLINT->adventureInt->anim, - &LOCPLINT->cb->getVisibilityMap(), true, LOCPLINT->adventureInt->heroAnim, + (grailPos - moveInt, adventureInt->anim, + &LOCPLINT->cb->getVisibilityMap(), true, adventureInt->heroAnim, background, &genRect(544, 591, 8, 8), 0, 0, true); //printing X sign diff --git a/client/GUIClasses.h b/client/GUIClasses.h index 34b26717f..072ebd491 100644 --- a/client/GUIClasses.h +++ b/client/GUIClasses.h @@ -358,7 +358,6 @@ public: CDefHandler *mobile, *mana; //mana and movement indicators int posmobx, posporx, posmanx, posmoby, pospory, posmany; - std::vector &heroes; //points to LOCPLINT->wandering heroes CHeroList(int Size); //c-tor int getPosOfHero(const CGHeroInstance* h); //hero's position on list void genList(); diff --git a/client/Graphics.cpp b/client/Graphics.cpp index 666a0a2aa..3f80a5f4a 100644 --- a/client/Graphics.cpp +++ b/client/Graphics.cpp @@ -525,8 +525,8 @@ SDL_Surface * Graphics::getPic(int ID, bool fort, bool builded) void Graphics::blueToPlayersAdv(SDL_Surface * sur, int player) { - if(player==1) //it is actually blue... - return; +// if(player==1) //it is actually blue... +// return; if(sur->format->BitsPerPixel == 8) { SDL_Color *palette = NULL; diff --git a/client/NetPacksClient.cpp b/client/NetPacksClient.cpp index 3f0d2000c..e50aa1340 100644 --- a/client/NetPacksClient.cpp +++ b/client/NetPacksClient.cpp @@ -469,8 +469,8 @@ void BattleStackMoved::applyFirstCl( CClient *cl ) void BattleStackAttacked::applyCl( CClient *cl ) { - std::set bsa; - bsa.insert(*this); + std::vector bsa; + bsa.push_back(*this); INTERFACE_CALL_IF_PRESENT(GS(cl)->curB->side1,battleStacksAttacked,bsa); INTERFACE_CALL_IF_PRESENT(GS(cl)->curB->side2,battleStacksAttacked,bsa); diff --git a/hch/CArtHandler.cpp b/hch/CArtHandler.cpp index e6d7949b6..279e4d902 100644 --- a/hch/CArtHandler.cpp +++ b/hch/CArtHandler.cpp @@ -164,7 +164,7 @@ void CArtHandler::loadArtifacts(bool onlyTxt) for(int j=0;jsecond.second; boost::algorithm::trim(str); - if(str[0] == '"' && str[str.size()-1] == '"') - str = str.substr(1,str.size()-2); + trimQuotation(str); } } @@ -521,7 +520,7 @@ void CGeneralTextHandler::load() do //dump comments and empty lines { loadToIt(nameBuf, buf, it, 3); - } while (nameBuf[0] != '/'); + } while (!nameBuf.size() || nameBuf[0] != '/'); do //actual names { loadToIt(nameBuf, buf, it, 3); diff --git a/hch/CMusicHandler.cpp b/hch/CMusicHandler.cpp index 9c9f4c4ed..e9f6bd726 100644 --- a/hch/CMusicHandler.cpp +++ b/hch/CMusicHandler.cpp @@ -164,7 +164,7 @@ void CSoundHandler::initCreaturesSounds(std::vector &creatures) str >> cname >> attack >> defend >> killed >> move >> shoot >> wince >> ext1 >> ext2; - if (cname[0] == '#') + if (!line.size() || cname[0] == '#') // That's a comment. Discard. continue; diff --git a/hch/CSpellHandler.cpp b/hch/CSpellHandler.cpp index 998275d2b..e519aac5e 100644 --- a/hch/CSpellHandler.cpp +++ b/hch/CSpellHandler.cpp @@ -189,6 +189,11 @@ std::set CSpell::rangeInHexes(unsigned int centralHex, ui8 schoolLvl ) con return ret; } +static bool startsWithX(const std::string &s) +{ + return s.size() && s[0] == 'x'; +} + void CSpellHandler::loadSpells() { std::string buf = bitmaph->getTextFile("SPTRAITS.TXT"), pom; @@ -224,15 +229,14 @@ void CSpellHandler::loadSpells() loadToIt(nsp.abbName,buf,i,4); loadToIt(nsp.level,buf,i,4); - loadToIt(pom,buf,i,4); - nsp.earth = pom[0]=='x' ? true : false; + nsp.earth = startsWithX(pom); loadToIt(pom,buf,i,4); - nsp.water = pom[0]=='x' ? true : false; + nsp.water = startsWithX(pom); loadToIt(pom,buf,i,4); - nsp.fire = pom[0]=='x' ? true : false; + nsp.fire = startsWithX(pom); loadToIt(pom,buf,i,4); - nsp.air = pom[0]=='x' ? true : false; + nsp.air = startsWithX(pom); nsp.costs.resize(4); for (int z = 0; z < 4 ; z++) diff --git a/lib/NetPacks.h b/lib/NetPacks.h index 57f7b9279..42f5a22db 100644 --- a/lib/NetPacks.h +++ b/lib/NetPacks.h @@ -930,7 +930,7 @@ struct BattleAttack : public CPackForClient//3006 DLL_EXPORT void applyGs(CGameState *gs); void applyCl(CClient *cl); - std::set bsa; + std::vector bsa; ui32 stackAttacking; ui8 flags; @@ -1010,7 +1010,7 @@ struct SetStackEffect : public CPackForClient //3010 DLL_EXPORT void applyGs(CGameState *gs); void applyCl(CClient *cl); - std::set stacks; //affected stacks (IDs) + std::vector stacks; //affected stacks (IDs) CStack::StackEffect effect; //type of effect template void serialize(Handler &h, const int version) { @@ -1024,7 +1024,7 @@ struct StacksInjured : public CPackForClient //3011 DLL_EXPORT void applyGs(CGameState *gs); void applyCl(CClient *cl); - std::set stacks; + std::vector stacks; template void serialize(Handler &h, const int version) { h & stacks; diff --git a/lib/NetPacksLib.cpp b/lib/NetPacksLib.cpp index d207bf91f..91021c208 100644 --- a/lib/NetPacksLib.cpp +++ b/lib/NetPacksLib.cpp @@ -775,7 +775,7 @@ DLL_EXPORT void BattleAttack::applyGs( CGameState *gs ) } } - for(std::set::const_iterator it = bsa.begin(); it != bsa.end(); ++it) + for(std::vector::const_iterator it = bsa.begin(); it != bsa.end(); ++it) { CStack * stack = gs->curB->getStack(it->stackAttacked, false); diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index f39d128fa..8a4115e45 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -588,13 +588,8 @@ void CGameHandler::prepareAttack(BattleAttack &bat, const CStack *att, const CSt { bat.bsa.clear(); bat.stackAttacking = att->ID; - std::set::iterator i = bat.bsa.insert(BattleStackAttacked()).first; - #ifdef __GNUC__ - BattleStackAttacked *bsa = (BattleStackAttacked *)&*i; - #else - BattleStackAttacked *bsa = &*i; - #endif - + bat.bsa.push_back(BattleStackAttacked()); + BattleStackAttacked *bsa = &bat.bsa.back(); bsa->stackAttacked = def->ID; bsa->attackerID = att->ID; bsa->damageAmount = BattleInfo::calculateDmg(att, def, gs->battleGetOwner(att->ID), gs->battleGetOwner(def->ID), bat.shot(), distance);//counting dealt damage @@ -3403,7 +3398,7 @@ bool CGameHandler::makeCustomAction( BattleAction &ba ) bsa.stackAttacked = (*it)->ID; bsa.attackerID = -1; prepareAttacked(bsa,*it); - si.stacks.insert(bsa); + si.stacks.push_back(bsa); } if(!si.stacks.empty()) sendAndApply(&si); @@ -3443,7 +3438,7 @@ bool CGameHandler::makeCustomAction( BattleAction &ba ) { if(vstd::contains(sc.resisted, (*it)->ID)) //this creature resisted the spell continue; - sse.stacks.insert((*it)->ID); + sse.stacks.push_back((*it)->ID); } sse.effect.id = ba.additionalInfo; sse.effect.level = h->getSpellSchoolLevel(s);