1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-05 13:04:54 +02:00

* stack queue in battle (shows when 'c' key is pressed)

* minor fix of cursor image
This commit is contained in:
mateuszb 2008-09-09 11:25:21 +00:00
parent 5e0986f9d8
commit b256f0ff43
3 changed files with 81 additions and 1 deletions

View File

@ -28,8 +28,17 @@ extern SDL_Surface * screen;
extern TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM, *GEOR16;
extern SDL_Color zwykly;
class CMP_stack2
{
public:
bool operator ()(const CStack& a, const CStack& b)
{
return (a.creature->speed)>(b.creature->speed);
}
} 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)
: printCellBorders(true), attackingHeroInstance(hero1), defendingHeroInstance(hero2), animCount(0), activeStack(-1), givenCommand(NULL), attackingInfo(NULL), myTurn(false), resWindow(NULL), showStackQueue(false)
{
givenCommand = new CondSh<BattleAction *>(NULL);
//initializing armies
@ -360,6 +369,59 @@ void CBattleInterface::show(SDL_Surface * to)
//units shown
projectileShowHelper(to);//showing projectiles
//showing queue of stacks
if(showStackQueue)
{
int xPos = 400 - ( stacks.size() * 42 )/2;
int yPos = 10;
std::vector<CStack> stacksSorted;
for(int v=0; v<stacks.size(); ++v)
{
stacksSorted.push_back(stacks[v]);
}
std::stable_sort(stacksSorted.begin(), stacksSorted.end(), cmpst2);
int startFrom = -1;
for(int n=0; n<stacksSorted.size(); ++n)
{
if(stacksSorted[n].ID == activeStack)
{
startFrom = n;
break;
}
}
if(startFrom != -1)
{
for(int b=startFrom; b<stacksSorted.size()+startFrom; ++b)
{
SDL_BlitSurface(graphics->smallImgs[-2], NULL, to, &genRect(32, 32, xPos, yPos));
//printing colored border
for(int xFrom = xPos-1; xFrom<xPos+33; ++xFrom)
{
for(int yFrom = yPos-1; yFrom<yPos+33; ++yFrom)
{
if(xFrom == xPos-1 || xFrom == xPos+32 || yFrom == yPos-1 || yFrom == yPos+32)
{
SDL_Color pc;
if(stacksSorted[b % stacksSorted.size()].owner != 255)
{
pc = graphics->playerColors[stacksSorted[b % stacksSorted.size()].owner];
}
else
{
pc = *graphics->neutralColor;
}
CSDL_Ext::SDL_PutPixel(to, xFrom, yFrom, pc.r, pc.g, pc.b);
}
}
}
//colored border printed
SDL_BlitSurface(graphics->smallImgs[stacksSorted[b % stacksSorted.size()].creature->idNumber], NULL, to, &genRect(32, 32, xPos, yPos));
xPos += 42;
}
}
}
//showing window with result of battle
if(resWindow)
{
@ -886,6 +948,7 @@ void CBattleInterface::stackIsShooting(int ID, int dest)
void CBattleInterface::battleFinished(const BattleResult& br)
{
deactivate();
CGI->curh->changeGraphic(0,0);
SDL_Rect temp_rect = genRect(561, 470, 165, 19);
resWindow = new CBattleReslutWindow(br, temp_rect, this);

View File

@ -142,6 +142,7 @@ public:
CondSh<BattleAction *> *givenCommand; //data != NULL if we have i.e. moved current unit
bool myTurn; //if true, interface is active (commands can be ordered
CBattleReslutWindow * resWindow; //window of end of battle
bool showStackQueue; //if true, queue of stacks will be shown
//button handle funcs:
void bOptionsf();

View File

@ -1676,6 +1676,14 @@ void CPlayerInterface::handleKeyUp(SDL_Event *sEvent)
adventureInt->endTurn.clickLeft(false);
break;
}
case (SDLK_c):
{
if( dynamic_cast<CBattleInterface*> (curint) )
{
dynamic_cast<CBattleInterface*> (curint)->showStackQueue = false;
}
break;
}
}
}
void CPlayerInterface::handleKeyDown(SDL_Event *sEvent)
@ -1723,6 +1731,14 @@ void CPlayerInterface::handleKeyDown(SDL_Event *sEvent)
adventureInt->endTurn.clickLeft(true);
break;
}
case (SDLK_c):
{
if( dynamic_cast<CBattleInterface*> (curint) )
{
dynamic_cast<CBattleInterface*> (curint)->showStackQueue = true;
}
break;
}
}
}
void CPlayerInterface::handleEvent(SDL_Event *sEvent)