diff --git a/CBattleInterface.cpp b/CBattleInterface.cpp index 5be2aaac6..4953235d5 100644 --- a/CBattleInterface.cpp +++ b/CBattleInterface.cpp @@ -39,7 +39,7 @@ public: } cmpst2 ; CBattleInterface::CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, CGHeroInstance *hero1, CGHeroInstance *hero2) -: printCellBorders(true), attackingHeroInstance(hero1), defendingHeroInstance(hero2), animCount(0), activeStack(-1), givenCommand(NULL), attackingInfo(NULL), myTurn(false), resWindow(NULL), showStackQueue(false) +: printCellBorders(true), attackingHeroInstance(hero1), defendingHeroInstance(hero2), animCount(0), activeStack(-1), givenCommand(NULL), attackingInfo(NULL), myTurn(false), resWindow(NULL), showStackQueue(false), animSpeed(1) { givenCommand = new CondSh(NULL); //initializing armies @@ -345,7 +345,7 @@ void CBattleInterface::show(SDL_Surface * to) { for(int v=0; vnextFrame(to, creAnims[stackDeadByHex[b][v]]->pos.x, creAnims[stackDeadByHex[b][v]]->pos.y, creDir[stackDeadByHex[b][v]], (animCount%4==0 || creAnims[stackDeadByHex[b][v]]->getType()!=2) && stacks[stackDeadByHex[b][v]].alive(), stackDeadByHex[b][v]==activeStack); //increment always when moving, never if stack died + creAnims[stackDeadByHex[b][v]]->nextFrame(to, creAnims[stackDeadByHex[b][v]]->pos.x, creAnims[stackDeadByHex[b][v]]->pos.y, creDir[stackDeadByHex[b][v]], (animCount%(4/animSpeed)==0 || creAnims[stackDeadByHex[b][v]]->getType()!=2) && stacks[stackDeadByHex[b][v]].alive(), stackDeadByHex[b][v]==activeStack); //increment always when moving, never if stack died //printing amount if(stacks[stackDeadByHex[b][v]].amount > 0) //don't print if stack is not alive { @@ -362,7 +362,7 @@ void CBattleInterface::show(SDL_Surface * to) { for(int v=0; vnextFrame(to, creAnims[stackAliveByHex[b][v]]->pos.x, creAnims[stackAliveByHex[b][v]]->pos.y, creDir[stackAliveByHex[b][v]], (animCount%4==0) && creAnims[stackAliveByHex[b][v]]->getType()!=0 && creAnims[stackAliveByHex[b][v]]->getType()!=20 && creAnims[stackAliveByHex[b][v]]->getType()!=21, stackAliveByHex[b][v]==activeStack); //increment always when moving, never if stack died + creAnims[stackAliveByHex[b][v]]->nextFrame(to, creAnims[stackAliveByHex[b][v]]->pos.x, creAnims[stackAliveByHex[b][v]]->pos.y, creDir[stackAliveByHex[b][v]], (animCount%(4/animSpeed)==0) && creAnims[stackAliveByHex[b][v]]->getType()!=0 && creAnims[stackAliveByHex[b][v]]->getType()!=20 && creAnims[stackAliveByHex[b][v]]->getType()!=21, stackAliveByHex[b][v]==activeStack); //increment always when moving, never if stack died //printing amount if(stacks[stackAliveByHex[b][v]].amount > 0) //don't print if stack is not alive { @@ -449,7 +449,7 @@ bool CBattleInterface::reverseCreature(int number, int hex, bool wideTrick) show(); CSDL_Ext::update(); SDL_framerateDelay(LOCPLINT->mainFPSmng); - if((animCount+1)%4==0) + if((animCount+1)%(4/animSpeed)==0) creAnims[number]->incrementFrame(); } creDir[number] = !creDir[number]; @@ -479,6 +479,12 @@ bool CBattleInterface::reverseCreature(int number, int hex, bool wideTrick) void CBattleInterface::bOptionsf() { + CGI->curh->changeGraphic(0,0); + LOCPLINT->curint->deactivate(); + + CBattleOptionsWindow * optionsWin = new CBattleOptionsWindow(genRect(431, 481, 160, 84), this); + optionsWin->activate(); + LOCPLINT->objsToBlit.push_back(optionsWin); } void CBattleInterface::bSurrenderf() @@ -583,7 +589,7 @@ void CBattleInterface::stackKilled(int ID, int dmg, int killed, int IDby, bool b creAnims[ID]->setType(5); //death for(int i=0; iframesInGroup(5)*3+1; ++i) { - if((animCount%4)==0) + if((animCount%(4/animSpeed))==0) creAnims[ID]->incrementFrame(); show(); CSDL_Ext::update(); @@ -619,7 +625,18 @@ void CBattleInterface::stackMoved(int number, int destHex, bool startMoving, boo { //a few useful variables int curStackPos = LOCPLINT->cb->battleGetPos(number); - int steps = creAnims[number]->framesInGroup(0)*3.5; + int steps; + switch(animSpeed) + { + case 1: + steps = creAnims[number]->framesInGroup(0)*3.5; + break; + case 2: + steps = creAnims[number]->framesInGroup(0)*2.2; + break; + case 4: + steps = creAnims[number]->framesInGroup(0); + } int hexWbase = 44, hexHbase = 42; bool twoTiles = LOCPLINT->cb->battleGetCreature(number).isDoubleWide(); @@ -634,7 +651,7 @@ void CBattleInterface::stackMoved(int number, int destHex, bool startMoving, boo show(); CSDL_Ext::update(); SDL_framerateDelay(LOCPLINT->mainFPSmng); - if((animCount+1)%4==0) + if((animCount+1)%(4/animSpeed)==0) creAnims[number]->incrementFrame(); } } @@ -696,7 +713,7 @@ void CBattleInterface::stackMoved(int number, int destHex, bool startMoving, boo show(); CSDL_Ext::update(); SDL_framerateDelay(LOCPLINT->mainFPSmng); - if((animCount+1)%4==0) + if((animCount+1)%(4/animSpeed)==0) creAnims[number]->incrementFrame(); } } @@ -711,7 +728,7 @@ void CBattleInterface::stackMoved(int number, int destHex, bool startMoving, boo show(); CSDL_Ext::update(); SDL_framerateDelay(LOCPLINT->mainFPSmng); - if((animCount+1)%4==0) + if((animCount+1)%(4/animSpeed)==0) creAnims[number]->incrementFrame(); } } @@ -771,7 +788,7 @@ void CBattleInterface::stackIsAttacked(int ID, int dmg, int killed, int IDby, bo show(); CSDL_Ext::update(); SDL_framerateDelay(LOCPLINT->mainFPSmng); - /*if((animCount+1)%4==0) + /*if((animCount+1)%(4/animSpeed)==0) creAnims[ID]->incrementFrame();*/ } creAnims[ID]->setType(2); @@ -1233,7 +1250,7 @@ void CBattleInterface::attackingShowHelper() if(attackingInfo) { attackingInfo->hitCount++; - if(attackingInfo->hitCount%4 == 0) + if(attackingInfo->hitCount%(4/animSpeed) == 0) attackingInfo->frame++; } } @@ -1787,3 +1804,96 @@ void CBattleReslutWindow::bExitf() { LOCPLINT->battleResultQuited(); } + +CBattleOptionsWindow::CBattleOptionsWindow(SDL_Rect & position, CBattleInterface *owner): myInt(owner) +{ + pos = position; + background = BitmapHandler::loadBitmap("comopbck.bmp", true); + graphics->blueToPlayersAdv(background, LOCPLINT->playerID); + + check = CDefHandler::giveDef("SYSOPCHK.DEF"); + + setToDefault = new AdventureMapButton (std::string(), std::string(), boost::bind(&CBattleOptionsWindow::bDefaultf,this), 405, 443, "codefaul.def", false, NULL, false); + std::swap(setToDefault->imgs[0][0], setToDefault->imgs[0][1]); + exit = new AdventureMapButton (std::string(), std::string(), boost::bind(&CBattleOptionsWindow::bExitf,this), 516, 443, "soretrn.def", false, NULL, false); + std::swap(exit->imgs[0][0], exit->imgs[0][1]); + + //printing texts to background + CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[392], 240, 32, GEOR16, tytulowy, background); //window title + CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[393], 122, 211, GEOR16, tytulowy, background); //animation speed + CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[394], 122, 292, GEOR16, tytulowy, background); //music volume + CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[395], 122, 358, GEOR16, tytulowy, background); //effects' volume + CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[396], 353, 64, GEOR16, tytulowy, background); //auto - combat options + CSDL_Ext::printAtMiddle(CGI->generaltexth->allTexts[397], 353, 264, GEOR16, tytulowy, background); //creature info + + //auto - combat options + CSDL_Ext::printAt(CGI->generaltexth->allTexts[398], 283, 87, GEOR16, zwykly, background); //creatures + CSDL_Ext::printAt(CGI->generaltexth->allTexts[399], 283, 117, GEOR16, zwykly, background); //spells + CSDL_Ext::printAt(CGI->generaltexth->allTexts[400], 283, 147, GEOR16, zwykly, background); //catapult + CSDL_Ext::printAt(CGI->generaltexth->allTexts[151], 283, 177, GEOR16, zwykly, background); //ballista + CSDL_Ext::printAt(CGI->generaltexth->allTexts[401], 283, 207, GEOR16, zwykly, background); //first aid tent + + //creature info + CSDL_Ext::printAt(CGI->generaltexth->allTexts[402], 283, 286, GEOR16, zwykly, background); //all stats + CSDL_Ext::printAt(CGI->generaltexth->allTexts[403], 283, 316, GEOR16, zwykly, background); //spells only + + //general options + CSDL_Ext::printAt(CGI->generaltexth->allTexts[404], 61, 58, GEOR16, zwykly, background); //hex grid + CSDL_Ext::printAt(CGI->generaltexth->allTexts[405], 61, 91, GEOR16, zwykly, background); //movement shadow + CSDL_Ext::printAt(CGI->generaltexth->allTexts[406], 61, 124, GEOR16, zwykly, background); //cursor shadow + CSDL_Ext::printAt(CGI->generaltexth->allTexts[577], 61, 157, GEOR16, zwykly, background); //spellbook animation + //texts printed +} + +CBattleOptionsWindow::~CBattleOptionsWindow() +{ + SDL_FreeSurface(background); + + delete setToDefault; + delete exit; + delete check; +} + +void CBattleOptionsWindow::activate() +{ + setToDefault->activate(); + exit->activate(); +} + +void CBattleOptionsWindow::deactivate() +{ + setToDefault->deactivate(); + exit->deactivate(); +} + +void CBattleOptionsWindow::show(SDL_Surface *to) +{ + if(!to) //"evaluating" to + to = screen; + + SDL_BlitSurface(background, NULL, to, &pos); + + setToDefault->show(to); + exit->show(to); +} + +void CBattleOptionsWindow::bDefaultf() +{ +} + +void CBattleOptionsWindow::bExitf() +{ + deactivate(); + + for(int g=0; gobjsToBlit.size(); ++g) + { + if(dynamic_cast(LOCPLINT->objsToBlit[g])) + { + LOCPLINT->objsToBlit.erase(LOCPLINT->objsToBlit.begin()+g); + break; + } + } + + delete this; + LOCPLINT->curint->activate(); +} diff --git a/CBattleInterface.h b/CBattleInterface.h index 5f28f3b95..744fb5aec 100644 --- a/CBattleInterface.h +++ b/CBattleInterface.h @@ -90,6 +90,25 @@ public: void show(SDL_Surface * to = 0); }; +class CBattleOptionsWindow : public IShowable, public CIntObject, public IActivable +{ +private: + CBattleInterface * myInt; + SDL_Surface * background; + AdventureMapButton * setToDefault, * exit; + CDefHandler * check; +public: + CBattleOptionsWindow(SDL_Rect & position, CBattleInterface * owner); //c-tor + ~CBattleOptionsWindow(); //d-tor + + void bDefaultf(); + void bExitf(); + + void activate(); + void deactivate(); + void show(SDL_Surface * to = 0); +}; + class CBattleInterface : public CMainInterface { private: @@ -107,6 +126,7 @@ private: int activeStack; //number of active stack; -1 - no one std::vector shadedHexes; //hexes available for active stack void showRange(SDL_Surface * to, int ID); //show helper funtion ot mark range of a unit + int animSpeed; //speed of animation; 1 - slowest, 2 - medium, 4 - fastest class CAttHelper {