AI learns abilities which halve/double damage

This commit is contained in:
DizzyEggg 2020-07-12 10:09:23 +02:00
parent 1b56216d7c
commit 3e27de72fa

View File

@ -1575,7 +1575,11 @@ u8 DoBattlerEndTurnEffects(void)
gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8); gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / (B_BURN_DAMAGE >= GEN_7 ? 16 : 8);
if (ability == ABILITY_HEATPROOF) if (ability == ABILITY_HEATPROOF)
{
if (gBattleMoveDamage > (gBattleMoveDamage / 2) + 1) // Record ability if the burn takes less damage than it normally would.
RecordAbilityBattle(gActiveBattler, ABILITY_HEATPROOF);
gBattleMoveDamage /= 2; gBattleMoveDamage /= 2;
}
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1; gBattleMoveDamage = 1;
BattleScriptExecute(BattleScript_BurnTurnDmg); BattleScriptExecute(BattleScript_BurnTurnDmg);
@ -5804,7 +5808,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef)
static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 updateFlags) static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 updateFlags)
{ {
u32 i; u32 i, ability;
u32 holdEffectAtk, holdEffectParamAtk; u32 holdEffectAtk, holdEffectParamAtk;
u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef); u16 basePower = CalcMoveBasePower(move, battlerAtk, battlerDef);
u16 holdEffectModifier; u16 holdEffectModifier;
@ -5921,12 +5925,17 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
} }
// target's abilities // target's abilities
switch (GetBattlerAbility(battlerDef)) ability = GetBattlerAbility(battlerDef);
switch (ability)
{ {
case ABILITY_HEATPROOF: case ABILITY_HEATPROOF:
case ABILITY_WATER_BUBBLE: case ABILITY_WATER_BUBBLE:
if (moveType == TYPE_FIRE) if (moveType == TYPE_FIRE)
{
MulModifier(&modifier, UQ_4_12(0.5)); MulModifier(&modifier, UQ_4_12(0.5));
if (updateFlags)
RecordAbilityBattle(battlerDef, ability);
}
break; break;
case ABILITY_DRY_SKIN: case ABILITY_DRY_SKIN:
if (moveType == TYPE_FIRE) if (moveType == TYPE_FIRE)
@ -5934,7 +5943,11 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
break; break;
case ABILITY_FLUFFY: case ABILITY_FLUFFY:
if (IsMoveMakingContact(move, battlerAtk)) if (IsMoveMakingContact(move, battlerAtk))
{
MulModifier(&modifier, UQ_4_12(0.5)); MulModifier(&modifier, UQ_4_12(0.5));
if (updateFlags)
RecordAbilityBattle(battlerDef, ability);
}
if (moveType == TYPE_FIRE) if (moveType == TYPE_FIRE)
MulModifier(&modifier, UQ_4_12(2.0)); MulModifier(&modifier, UQ_4_12(2.0));
break; break;
@ -6065,7 +6078,7 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
return ApplyModifier(modifier, basePower); return ApplyModifier(modifier, basePower);
} }
static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit, bool32 updateFlags)
{ {
u8 atkStage; u8 atkStage;
u32 atkStat; u32 atkStat;
@ -6179,7 +6192,11 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b
{ {
case ABILITY_THICK_FAT: case ABILITY_THICK_FAT:
if (moveType == TYPE_FIRE || moveType == TYPE_ICE) if (moveType == TYPE_FIRE || moveType == TYPE_ICE)
{
MulModifier(&modifier, UQ_4_12(0.5)); MulModifier(&modifier, UQ_4_12(0.5));
if (updateFlags)
RecordAbilityBattle(battlerDef, ABILITY_THICK_FAT);
}
break; break;
} }
@ -6235,7 +6252,7 @@ static bool32 CanEvolve(u32 species)
return FALSE; return FALSE;
} }
static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit) static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, bool32 isCrit, bool32 updateFlags)
{ {
bool32 usesDefStat; bool32 usesDefStat;
u8 defStage; u8 defStage;
@ -6287,15 +6304,27 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType,
{ {
case ABILITY_MARVEL_SCALE: case ABILITY_MARVEL_SCALE:
if (gBattleMons[battlerDef].status1 & STATUS1_ANY && usesDefStat) if (gBattleMons[battlerDef].status1 & STATUS1_ANY && usesDefStat)
{
MulModifier(&modifier, UQ_4_12(1.5)); MulModifier(&modifier, UQ_4_12(1.5));
if (updateFlags)
RecordAbilityBattle(battlerDef, ABILITY_MARVEL_SCALE);
}
break; break;
case ABILITY_FUR_COAT: case ABILITY_FUR_COAT:
if (usesDefStat) if (usesDefStat)
{
MulModifier(&modifier, UQ_4_12(2.0)); MulModifier(&modifier, UQ_4_12(2.0));
if (updateFlags)
RecordAbilityBattle(battlerDef, ABILITY_FUR_COAT);
}
break; break;
case ABILITY_GRASS_PELT: case ABILITY_GRASS_PELT:
if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat) if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN && usesDefStat)
{
MulModifier(&modifier, UQ_4_12(1.5)); MulModifier(&modifier, UQ_4_12(1.5));
if (updateFlags)
RecordAbilityBattle(battlerDef, ABILITY_GRASS_PELT);
}
break; break;
case ABILITY_FLOWER_GIFT: case ABILITY_FLOWER_GIFT:
if (gBattleMons[battlerDef].species == SPECIES_CHERRIM && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && !usesDefStat) if (gBattleMons[battlerDef].species == SPECIES_CHERRIM && WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY && !usesDefStat)
@ -6514,8 +6543,8 @@ s32 CalculateMoveDamage(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, s32
// long dmg basic formula // long dmg basic formula
dmg = ((gBattleMons[battlerAtk].level * 2) / 5) + 2; dmg = ((gBattleMons[battlerAtk].level * 2) / 5) + 2;
dmg *= gBattleMovePower; dmg *= gBattleMovePower;
dmg *= CalcAttackStat(move, battlerAtk, battlerDef, moveType, isCrit); dmg *= CalcAttackStat(move, battlerAtk, battlerDef, moveType, isCrit, updateFlags);
dmg /= CalcDefenseStat(move, battlerAtk, battlerDef, moveType, isCrit); dmg /= CalcDefenseStat(move, battlerAtk, battlerDef, moveType, isCrit, updateFlags);
dmg = (dmg / 50) + 2; dmg = (dmg / 50) + 2;
// Calculate final modifiers. // Calculate final modifiers.