mirror of
https://github.com/vcmi/vcmi.git
synced 2025-06-25 00:37:24 +02:00
added bonus type MANUAL_CONTROL
This commit is contained in:
@ -343,6 +343,12 @@
|
|||||||
"type" : "SECONDARY_SKILL_PREMY",
|
"type" : "SECONDARY_SKILL_PREMY",
|
||||||
"val" : 1,
|
"val" : 1,
|
||||||
"valueType" : "BASE_NUMBER"
|
"valueType" : "BASE_NUMBER"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subtype" : "creature.catapult",
|
||||||
|
"type" : "MANUAL_CONTROL",
|
||||||
|
"val" : 100,
|
||||||
|
"valueType" : "BASE_NUMBER"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -711,6 +717,12 @@
|
|||||||
"type" : "SECONDARY_SKILL_PREMY",
|
"type" : "SECONDARY_SKILL_PREMY",
|
||||||
"val" : 50,
|
"val" : 50,
|
||||||
"valueType" : "BASE_NUMBER"
|
"valueType" : "BASE_NUMBER"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subtype" : "creature.ballista",
|
||||||
|
"type" : "MANUAL_CONTROL",
|
||||||
|
"val" : 100,
|
||||||
|
"valueType" : "BASE_NUMBER"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -962,6 +974,12 @@
|
|||||||
"type" : "SECONDARY_SKILL_PREMY",
|
"type" : "SECONDARY_SKILL_PREMY",
|
||||||
"val" : 50,
|
"val" : 50,
|
||||||
"valueType" : "BASE_NUMBER"
|
"valueType" : "BASE_NUMBER"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"subtype" : "creature.firstAidTent",
|
||||||
|
"type" : "MANUAL_CONTROL",
|
||||||
|
"val" : 100,
|
||||||
|
"valueType" : "BASE_NUMBER"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -216,8 +216,10 @@ std::vector<std::shared_ptr<Bonus>> CSkillHandler::defaultBonus(SecondarySkill s
|
|||||||
std::vector<std::shared_ptr<Bonus>> result;
|
std::vector<std::shared_ptr<Bonus>> result;
|
||||||
|
|
||||||
// add bonus based on current values - useful for adding multiple bonuses easily
|
// add bonus based on current values - useful for adding multiple bonuses easily
|
||||||
auto addBonus = [=,&result](int bonusVal, Bonus::BonusType bonusType = Bonus::SECONDARY_SKILL_PREMY) {
|
auto addBonus = [=,&result](int bonusVal, Bonus::BonusType bonusType = Bonus::SECONDARY_SKILL_PREMY, int subtype = 0)
|
||||||
int subtype = (bonusType == Bonus::SECONDARY_SKILL_PREMY || bonusType == Bonus::SECONDARY_SKILL_VAL2) ? skill : 0;
|
{
|
||||||
|
if(bonusType == Bonus::SECONDARY_SKILL_PREMY || bonusType == Bonus::SECONDARY_SKILL_VAL2)
|
||||||
|
subtype = skill;
|
||||||
result.push_back(std::make_shared<Bonus>(Bonus::PERMANENT, bonusType, Bonus::SECONDARY_SKILL, bonusVal, skill, subtype, Bonus::BASE_NUMBER));
|
result.push_back(std::make_shared<Bonus>(Bonus::PERMANENT, bonusType, Bonus::SECONDARY_SKILL, bonusVal, skill, subtype, Bonus::BASE_NUMBER));
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -239,6 +241,10 @@ std::vector<std::shared_ptr<Bonus>> CSkillHandler::defaultBonus(SecondarySkill s
|
|||||||
addBonus(level, Bonus::MORALE); break;
|
addBonus(level, Bonus::MORALE); break;
|
||||||
case SecondarySkill::LUCK:
|
case SecondarySkill::LUCK:
|
||||||
addBonus(level, Bonus::LUCK); break;
|
addBonus(level, Bonus::LUCK); break;
|
||||||
|
case SecondarySkill::BALLISTICS:
|
||||||
|
addBonus(100, Bonus::MANUAL_CONTROL, CreatureID::CATAPULT);
|
||||||
|
addBonus(level);
|
||||||
|
break;
|
||||||
case SecondarySkill::EAGLE_EYE:
|
case SecondarySkill::EAGLE_EYE:
|
||||||
addBonus(30 + 10 * level);
|
addBonus(30 + 10 * level);
|
||||||
addBonus(1 + level, Bonus::SECONDARY_SKILL_VAL2);
|
addBonus(1 + level, Bonus::SECONDARY_SKILL_VAL2);
|
||||||
@ -257,9 +263,11 @@ std::vector<std::shared_ptr<Bonus>> CSkillHandler::defaultBonus(SecondarySkill s
|
|||||||
case SecondarySkill::TACTICS:
|
case SecondarySkill::TACTICS:
|
||||||
addBonus(1 + 2 * level); break;
|
addBonus(1 + 2 * level); break;
|
||||||
case SecondarySkill::ARTILLERY:
|
case SecondarySkill::ARTILLERY:
|
||||||
addBonus(25 + 25 * level); break;
|
addBonus(100, Bonus::MANUAL_CONTROL, CreatureID::BALLISTA);
|
||||||
|
addBonus(25 + 25 * level);
|
||||||
if(level > 1) // extra attack
|
if(level > 1) // extra attack
|
||||||
addBonus(1, Bonus::SECONDARY_SKILL_VAL2);
|
addBonus(1, Bonus::SECONDARY_SKILL_VAL2);
|
||||||
|
break;
|
||||||
case SecondarySkill::LEARNING:
|
case SecondarySkill::LEARNING:
|
||||||
addBonus(5 * level); break;
|
addBonus(5 * level); break;
|
||||||
case SecondarySkill::OFFENCE:
|
case SecondarySkill::OFFENCE:
|
||||||
@ -273,6 +281,7 @@ std::vector<std::shared_ptr<Bonus>> CSkillHandler::defaultBonus(SecondarySkill s
|
|||||||
case SecondarySkill::RESISTANCE:
|
case SecondarySkill::RESISTANCE:
|
||||||
addBonus(5 << (level-1)); break;
|
addBonus(5 << (level-1)); break;
|
||||||
case SecondarySkill::FIRST_AID:
|
case SecondarySkill::FIRST_AID:
|
||||||
|
addBonus(100, Bonus::MANUAL_CONTROL, CreatureID::FIRST_AID_TENT);
|
||||||
addBonus(25 + 25 * level); break;
|
addBonus(25 + 25 * level); break;
|
||||||
default:
|
default:
|
||||||
addBonus(level); break;
|
addBonus(level); break;
|
||||||
|
@ -236,6 +236,7 @@ private:
|
|||||||
BONUS_NAME(RANGED_RETALIATION) /*allows shooters to perform ranged retaliation*/\
|
BONUS_NAME(RANGED_RETALIATION) /*allows shooters to perform ranged retaliation*/\
|
||||||
BONUS_NAME(BLOCKS_RANGED_RETALIATION) /*disallows ranged retaliation for shooter unit, BLOCKS_RETALIATION bonus is for melee retaliation only*/\
|
BONUS_NAME(BLOCKS_RANGED_RETALIATION) /*disallows ranged retaliation for shooter unit, BLOCKS_RETALIATION bonus is for melee retaliation only*/\
|
||||||
BONUS_NAME(SECONDARY_SKILL_VAL2) /*for secondary skills that have multiple effects, like eagle eye (max level and chance)*/ \
|
BONUS_NAME(SECONDARY_SKILL_VAL2) /*for secondary skills that have multiple effects, like eagle eye (max level and chance)*/ \
|
||||||
|
BONUS_NAME(MANUAL_CONTROL) /* manually control warmachine with id = subtype, chance = val */ \
|
||||||
/* end of list */
|
/* end of list */
|
||||||
|
|
||||||
|
|
||||||
|
@ -5799,7 +5799,7 @@ void CGameHandler::runBattle()
|
|||||||
const CGHeroInstance * curOwner = battleGetOwnerHero(next);
|
const CGHeroInstance * curOwner = battleGetOwnerHero(next);
|
||||||
|
|
||||||
if ((next->position < 0 || next->getCreature()->idNumber == CreatureID::BALLISTA) //arrow turret or ballista
|
if ((next->position < 0 || next->getCreature()->idNumber == CreatureID::BALLISTA) //arrow turret or ballista
|
||||||
&& (!curOwner || curOwner->getSecSkillLevel(SecondarySkill::ARTILLERY) == 0)) //hero has no artillery
|
&& (!curOwner || getRandomGenerator().nextInt(99) >= curOwner->valOfBonuses(Bonus::MANUAL_CONTROL, CreatureID::BALLISTA)))
|
||||||
{
|
{
|
||||||
BattleAction attack;
|
BattleAction attack;
|
||||||
attack.actionType = Battle::SHOOT;
|
attack.actionType = Battle::SHOOT;
|
||||||
@ -5829,7 +5829,7 @@ void CGameHandler::runBattle()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!curOwner || curOwner->getSecSkillLevel(SecondarySkill::BALLISTICS) == 0)
|
if (!curOwner || getRandomGenerator().nextInt(99) >= curOwner->valOfBonuses(Bonus::MANUAL_CONTROL, CreatureID::CATAPULT))
|
||||||
{
|
{
|
||||||
BattleAction attack;
|
BattleAction attack;
|
||||||
attack.destinationTile = *RandomGeneratorUtil::nextItem(attackableBattleHexes,
|
attack.destinationTile = *RandomGeneratorUtil::nextItem(attackableBattleHexes,
|
||||||
@ -5857,7 +5857,7 @@ void CGameHandler::runBattle()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!curOwner || curOwner->getSecSkillLevel(SecondarySkill::FIRST_AID) == 0) //no hero or hero has no first aid
|
if (!curOwner || getRandomGenerator().nextInt(99) >= curOwner->valOfBonuses(Bonus::MANUAL_CONTROL, CreatureID::FIRST_AID_TENT))
|
||||||
{
|
{
|
||||||
RandomGeneratorUtil::randomShuffle(possibleStacks, getRandomGenerator());
|
RandomGeneratorUtil::randomShuffle(possibleStacks, getRandomGenerator());
|
||||||
const CStack * toBeHealed = possibleStacks.front();
|
const CStack * toBeHealed = possibleStacks.front();
|
||||||
|
Reference in New Issue
Block a user