1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-15 00:05:02 +02:00

* added support for archery, offence and armorer secondary abilities

* hero's primary skills account for damage dealt by creatures in battle
* magical hero are given spellbook at the beginning
* added initial secondary skills for heroes
* minor fixes and improvements
This commit is contained in:
mateuszb
2008-09-29 11:03:30 +00:00
parent 917be0693d
commit 538ffb1579
13 changed files with 290 additions and 29 deletions

View File

@ -349,11 +349,11 @@ void CGameHandler::startBattle(CCreatureSet army1, CCreatureSet army2, int3 tile
delete battleResult.data;
}
void prepareAttack(BattleAttack &bat, CStack *att, CStack *def)
void CGameHandler::prepareAttack(BattleAttack &bat, CStack *att, CStack *def, bool shooting)
{
bat.stackAttacking = att->ID;
bat.bsa.stackAttacked = def->ID;
bat.bsa.damageAmount = BattleInfo::calculateDmg(att, def);//counting dealt damage
bat.bsa.damageAmount = BattleInfo::calculateDmg(att, def, gs->getHero(att->attackerOwned ? gs->curB->hero1 : gs->curB->hero2), gs->getHero(def->attackerOwned ? gs->curB->hero1 : gs->curB->hero2), shooting);//counting dealt damage
//applying damages
bat.bsa.killedAmount = bat.bsa.damageAmount / def->creature->hitPoints;
@ -948,14 +948,14 @@ upgend:
return;
BattleAttack bat;
prepareAttack(bat,curStack,stackAtEnd);
prepareAttack(bat,curStack,stackAtEnd,false);
sendAndApply(&bat);
//counterattack
if(!vstd::contains(curStack->abilities,NO_ENEMY_RETALIATION)
&& stackAtEnd->alive()
&& stackAtEnd->counterAttacks ) //TODO: support for multiple retaliatons per turn
{
prepareAttack(bat,stackAtEnd,curStack);
prepareAttack(bat,stackAtEnd,curStack,false);
bat.flags |= 2;
sendAndApply(&bat);
}
@ -965,7 +965,7 @@ upgend:
&& stackAtEnd->alive() )
{
bat.flags = 0;
prepareAttack(bat,curStack,stackAtEnd);
prepareAttack(bat,curStack,stackAtEnd,false);
sendAndApply(&bat);
}
sendDataToClients(ui16(3008)); //end movement and attack
@ -981,13 +981,13 @@ upgend:
*destStack= gs->curB->getStackT(ba.destinationTile);
BattleAttack bat;
prepareAttack(bat,curStack,destStack);
prepareAttack(bat,curStack,destStack,true);
bat.flags |= 1;
if(vstd::contains(curStack->abilities,TWICE_ATTACK)
&& curStack->alive())
{
prepareAttack(bat,curStack,destStack);
prepareAttack(bat,curStack,destStack,true);
sendAndApply(&bat);
}