1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

* support for Wait command (to be tested)

This commit is contained in:
Michał W. Urbańczyk 2008-11-15 15:26:08 +00:00
parent 32505ec161
commit bb5819f4df
5 changed files with 64 additions and 6 deletions

View File

@ -170,7 +170,7 @@ CBattleInterface::CBattleInterface(CCreatureSet * army1, CCreatureSet * army2, C
}
//prepairing graphic with cell borders
//preparing graphic with cell borders
cellBorders = CSDL_Ext::newSurface(background->w, background->h, cellBorder);
//copying palette
for(int g=0; g<cellBorder->format->palette->ncolors; ++g) //we assume that cellBorders->format->palette->ncolors == 256
@ -708,6 +708,7 @@ void CBattleInterface::bSpellf()
void CBattleInterface::bWaitf()
{
giveCommand(8,0,activeStack);
}
void CBattleInterface::bDefencef()
@ -793,6 +794,7 @@ void CBattleInterface::stackActivated(int number)
activeStack = number;
myTurn = true;
redrawBackgroundWithHexes(number);
bWait->block(vstd::contains(LOCPLINT->cb->battleGetStackByID(number)->state,WAITING)); //block waiting button if stack has been already waiting
}
void CBattleInterface::stackMoved(int number, int destHex, bool endMoving)

View File

@ -686,7 +686,13 @@ void CGameState::applyNL(IPack * pack)
BattleNextRound *ns = static_cast<BattleNextRound*>(pack);
curB->round = ns->round;
for(int i=0; i<curB->stacks.size();i++)
{
curB->stacks[i]->state -= DEFENDING;
curB->stacks[i]->state -= WAITING;
curB->stacks[i]->state -= MOVED;
curB->stacks[i]->state -= HAD_MORALE;
curB->stacks[i]->counterAttacks = 1;
}
break;
}
case 3002:
@ -734,6 +740,24 @@ void CGameState::applyNL(IPack * pack)
applyNL(&br->bsa);
break;
}
case 3007:
{
StartAction *br = static_cast<StartAction*>(pack);
CStack *st = curB->getStack(br->ba.stackNumber);
switch(br->ba.actionType)
{
case 3:
st->state.insert(DEFENDING);
break;
case 8:
st->state.insert(WAITING);
break;
case 2: case 6: case 7: case 9: case 10:
st->state.insert(MOVED);
break;
}
break;
}
case 3009:
{
SpellCasted *sc = static_cast<SpellCasted*>(pack);
@ -1581,4 +1605,31 @@ void BattleInfo::calculateCasualties( std::set<std::pair<ui32,si32> > *casualtie
casualties[!stacks[i]->attackerOwned].insert(std::pair<ui32,si32>(stacks[i]->creature->idNumber,stacks[i]->baseAmount - stacks[i]->amount));
}
}
}
CStack * BattleInfo::getNextStack()
{
CStack *current = getStack(activeStack);
for (int i = 0; i < stacks.size(); i++) //find fastest not moved/waited stack (stacks vector is sorted by speed)
{
if(vstd::contains(stacks[i]->state,DEFENDING)
||vstd::contains(stacks[i]->state,WAITING)
||vstd::contains(stacks[i]->state,MOVED)
||!stacks[i]->alive()
||stacks[i] == current
)
continue;
return stacks[i];
}
for (int i = stacks.size() - 1; i >= 0 ; i--) //find slowest waiting stack
{
if(vstd::contains(stacks[i]->state,DEFENDING)
||vstd::contains(stacks[i]->state,MOVED)
||!stacks[i]->alive()
||stacks[i] == current
)
continue;
return stacks[i];
}
return NULL; //all stacks moved or defending!
}

View File

@ -66,6 +66,7 @@ struct DLL_EXPORT BattleInfo
{
h & side1 & side2 & round & activeStack & siege & tile & stacks & army1 & army2 & hero1 & hero2;
}
CStack * getNextStack(); //which stack will have turn after current one
CStack * getStack(int stackID);
CStack * getStackT(int tileID);
void getAccessibilityMap(bool *accessibility, int stackToOmmit=-1); //send pointer to at least 187 allocated bytes

View File

@ -613,6 +613,7 @@ void CClient::process(int what)
playerint[gs->curB->side1]->actionStarted(&curbaction);
if(playerint.find(gs->curB->side2) != playerint.end())
playerint[gs->curB->side2]->actionStarted(&curbaction);
gs->apply(&StartAction(curbaction));
break;
}
case 3008:

View File

@ -307,11 +307,11 @@ void CGameHandler::startBattle(CCreatureSet army1, CCreatureSet army2, int3 tile
const BattleInfo & curB = *gs->curB;
//stack loop
for(unsigned i=0;i<stacks.size() && !battleResult.get();i++)
CStack *next;
while(!battleResult.get() && (next=gs->curB->getNextStack()))
{
if(!stacks[i]->alive()) continue;//indicates imposiibility of making action for this dead unit
BattleSetActiveStack sas;
sas.stack = stacks[i]->ID;
sas.stack = next->ID;
sendAndApply(&sas);
boost::unique_lock<boost::mutex> lock(battleMadeAction.mx);
while(!battleMadeAction.data && !battleResult.get()) //active stack hasn't made its action and battle is still going
@ -1080,18 +1080,21 @@ upgend:
{
sendAndApply(&StartAction(ba)); //start movement
moveStack(ba.stackNumber,ba.destinationTile); //move
sendDataToClients(ui16(3008)); //endmovement
sendDataToClients(ui16(3008)); //end movement
break;
}
case 3: //defend
case 8: //wait
{
sendAndApply(&StartAction(ba));
sendDataToClients(ui16(3008));
break;
}
case 4: //retreat/flee
{
//TODO: check if fleeing is possible (e.g. enemy may have Shackles of War)
//TODO: calculate casualties
//TODO: remove retreating hero from map and place it in recrutation list
//TODO: remove retreating hero from map and place it in recruitment list
BattleResult *br = new BattleResult;
br->result = 1;
br->winner = !ba.side; //fleeing side loses