|
@@ -3967,30 +3967,38 @@ bool CGameHandler::makeBattleAction(BattleAction &ba)
|
|
|
}
|
|
}
|
|
|
case EActionType::DEFEND:
|
|
case EActionType::DEFEND:
|
|
|
{
|
|
{
|
|
|
- //defensive stance
|
|
|
|
|
|
|
+ //defensive stance, TODO: filter out spell boosts from bonus (stone skin etc.)
|
|
|
SetStackEffect sse;
|
|
SetStackEffect sse;
|
|
|
- Bonus bonus1(Bonus::STACK_GETS_TURN, Bonus::PRIMARY_SKILL, Bonus::OTHER, 20, -1, PrimarySkill::DEFENSE, Bonus::PERCENT_TO_ALL);
|
|
|
|
|
|
|
+ Bonus defenseBonusToAdd(Bonus::STACK_GETS_TURN, Bonus::PRIMARY_SKILL, Bonus::OTHER, 20, -1, PrimarySkill::DEFENSE, Bonus::PERCENT_TO_ALL);
|
|
|
Bonus bonus2(Bonus::STACK_GETS_TURN, Bonus::PRIMARY_SKILL, Bonus::OTHER, stack->valOfBonuses(Bonus::DEFENSIVE_STANCE),
|
|
Bonus bonus2(Bonus::STACK_GETS_TURN, Bonus::PRIMARY_SKILL, Bonus::OTHER, stack->valOfBonuses(Bonus::DEFENSIVE_STANCE),
|
|
|
-1, PrimarySkill::DEFENSE, Bonus::ADDITIVE_VALUE);
|
|
-1, PrimarySkill::DEFENSE, Bonus::ADDITIVE_VALUE);
|
|
|
|
|
+ Bonus alternativeWeakCreatureBonus(Bonus::STACK_GETS_TURN, Bonus::PRIMARY_SKILL, Bonus::OTHER, 1, -1, PrimarySkill::DEFENSE, Bonus::ADDITIVE_VALUE);
|
|
|
|
|
+
|
|
|
BonusList defence = *stack->getBonuses(Selector::typeSubtype(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE));
|
|
BonusList defence = *stack->getBonuses(Selector::typeSubtype(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE));
|
|
|
int oldDefenceValue = defence.totalValue();
|
|
int oldDefenceValue = defence.totalValue();
|
|
|
|
|
|
|
|
- defence.push_back(std::make_shared<Bonus>(bonus1));
|
|
|
|
|
|
|
+ defence.push_back(std::make_shared<Bonus>(defenseBonusToAdd));
|
|
|
defence.push_back(std::make_shared<Bonus>(bonus2));
|
|
defence.push_back(std::make_shared<Bonus>(bonus2));
|
|
|
|
|
|
|
|
int difference = defence.totalValue() - oldDefenceValue;
|
|
int difference = defence.totalValue() - oldDefenceValue;
|
|
|
|
|
+ std::vector<Bonus> buffer;
|
|
|
|
|
+ if(difference == 0) //give replacement bonus for creatures not reaching 5 defense points (20% of def becomes 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ difference = 1;
|
|
|
|
|
+ buffer.push_back(alternativeWeakCreatureBonus);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ buffer.push_back(defenseBonusToAdd);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ buffer.push_back(bonus2);
|
|
|
|
|
|
|
|
MetaString text;
|
|
MetaString text;
|
|
|
stack->addText(text, MetaString::GENERAL_TXT, 120);
|
|
stack->addText(text, MetaString::GENERAL_TXT, 120);
|
|
|
stack->addNameReplacement(text);
|
|
stack->addNameReplacement(text);
|
|
|
text.addReplacement(difference);
|
|
text.addReplacement(difference);
|
|
|
-
|
|
|
|
|
sse.battleLog.push_back(text);
|
|
sse.battleLog.push_back(text);
|
|
|
-
|
|
|
|
|
- std::vector<Bonus> buffer;
|
|
|
|
|
- buffer.push_back(bonus1);
|
|
|
|
|
- buffer.push_back(bonus2);
|
|
|
|
|
-
|
|
|
|
|
sse.toUpdate.push_back(std::make_pair(ba.stackNumber, buffer));
|
|
sse.toUpdate.push_back(std::make_pair(ba.stackNumber, buffer));
|
|
|
sendAndApply(&sse);
|
|
sendAndApply(&sse);
|
|
|
|
|
|