AI dont rely on power if bad effects

This commit is contained in:
DizzyEggg 2020-04-20 11:27:09 +02:00
parent ce28454461
commit d38e0d8ae5
6 changed files with 94 additions and 53 deletions

View File

@ -63,7 +63,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8
.4byte BattleScript_EffectRecoilIfMiss .4byte BattleScript_EffectRecoilIfMiss
.4byte BattleScript_EffectMist .4byte BattleScript_EffectMist
.4byte BattleScript_EffectFocusEnergy .4byte BattleScript_EffectFocusEnergy
.4byte BattleScript_EffectRecoil .4byte BattleScript_EffectRecoil25
.4byte BattleScript_EffectConfuse .4byte BattleScript_EffectConfuse
.4byte BattleScript_EffectAttackUp2 .4byte BattleScript_EffectAttackUp2
.4byte BattleScript_EffectDefenseUp2 .4byte BattleScript_EffectDefenseUp2
@ -213,7 +213,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8
.4byte BattleScript_EffectSnatch .4byte BattleScript_EffectSnatch
.4byte BattleScript_EffectLowKick .4byte BattleScript_EffectLowKick
.4byte BattleScript_EffectSecretPower .4byte BattleScript_EffectSecretPower
.4byte BattleScript_EffectDoubleEdge .4byte BattleScript_EffectRecoil33
.4byte BattleScript_EffectTeeterDance .4byte BattleScript_EffectTeeterDance
.4byte BattleScript_EffectHitEscape .4byte BattleScript_EffectHitEscape
.4byte BattleScript_EffectMudSport .4byte BattleScript_EffectMudSport
@ -2821,12 +2821,6 @@ BattleScript_EffectFocusEnergy:
waitmessage 0x40 waitmessage 0x40
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_EffectRecoil:
setmoveeffect MOVE_EFFECT_RECOIL_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit
incrementgamestat GAME_STAT_USED_STRUGGLE
goto BattleScript_EffectHit
BattleScript_EffectConfuse: BattleScript_EffectConfuse:
attackcanceler attackcanceler
attackstring attackstring
@ -4533,7 +4527,13 @@ BattleScript_EffectSecretPower::
getsecretpowereffect getsecretpowereffect
goto BattleScript_EffectHit goto BattleScript_EffectHit
BattleScript_EffectDoubleEdge:: BattleScript_EffectRecoil25:
setmoveeffect MOVE_EFFECT_RECOIL_25 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit
incrementgamestat GAME_STAT_USED_STRUGGLE
goto BattleScript_EffectHit
BattleScript_EffectRecoil33::
setmoveeffect MOVE_EFFECT_RECOIL_33 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN setmoveeffect MOVE_EFFECT_RECOIL_33 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
goto BattleScript_EffectHit goto BattleScript_EffectHit

View File

@ -49,7 +49,7 @@
#define EFFECT_RECOIL_IF_MISS 45 #define EFFECT_RECOIL_IF_MISS 45
#define EFFECT_MIST 46 #define EFFECT_MIST 46
#define EFFECT_FOCUS_ENERGY 47 #define EFFECT_FOCUS_ENERGY 47
#define EFFECT_RECOIL 48 #define EFFECT_RECOIL_25 48
#define EFFECT_CONFUSE 49 #define EFFECT_CONFUSE 49
#define EFFECT_ATTACK_UP_2 50 #define EFFECT_ATTACK_UP_2 50
#define EFFECT_DEFENSE_UP_2 51 #define EFFECT_DEFENSE_UP_2 51
@ -199,7 +199,7 @@
#define EFFECT_SNATCH 195 #define EFFECT_SNATCH 195
#define EFFECT_LOW_KICK 196 #define EFFECT_LOW_KICK 196
#define EFFECT_SECRET_POWER 197 #define EFFECT_SECRET_POWER 197
#define EFFECT_DOUBLE_EDGE 198 #define EFFECT_RECOIL_33 198
#define EFFECT_TEETER_DANCE 199 #define EFFECT_TEETER_DANCE 199
#define EFFECT_HIT_ESCAPE 200 #define EFFECT_HIT_ESCAPE 200
#define EFFECT_MUD_SPORT 201 #define EFFECT_MUD_SPORT 201

View File

@ -1378,8 +1378,8 @@ static void Cmd_get_considered_move_power(void)
gAIScriptPtr += 1; gAIScriptPtr += 1;
} }
// Checks if the move dealing less damage does not have worse effects. // Checks if one of the moves has side effects or perks
static bool32 CompareTwoMoves(u32 bestMove, u32 goodMove) static u32 WhichMoveBetter(u32 move1, u32 move2)
{ {
s32 defAbility = AI_GetAbility(gBattlerTarget, FALSE); s32 defAbility = AI_GetAbility(gBattlerTarget, FALSE);
@ -1388,31 +1388,52 @@ static bool32 CompareTwoMoves(u32 bestMove, u32 goodMove)
&& (BATTLE_HISTORY->itemEffects[gBattlerTarget] == HOLD_EFFECT_ROCKY_HELMET && (BATTLE_HISTORY->itemEffects[gBattlerTarget] == HOLD_EFFECT_ROCKY_HELMET
|| defAbility == ABILITY_IRON_BARBS || defAbility == ABILITY_ROUGH_SKIN)) || defAbility == ABILITY_IRON_BARBS || defAbility == ABILITY_ROUGH_SKIN))
{ {
if (IS_MOVE_PHYSICAL(goodMove) && !IS_MOVE_PHYSICAL(bestMove)) if (IS_MOVE_PHYSICAL(move1) && !IS_MOVE_PHYSICAL(move2))
return FALSE; return 1;
if (IS_MOVE_PHYSICAL(move2) && !IS_MOVE_PHYSICAL(move1))
return 0;
} }
// Check recoil // Check recoil
if (GetBattlerAbility(sBattler_AI) != ABILITY_ROCK_HEAD) if (GetBattlerAbility(sBattler_AI) != ABILITY_ROCK_HEAD)
{ {
if (((gBattleMoves[goodMove].effect == EFFECT_RECOIL if (((gBattleMoves[move1].effect == EFFECT_RECOIL_25
|| gBattleMoves[goodMove].effect == EFFECT_RECOIL_IF_MISS || gBattleMoves[move1].effect == EFFECT_RECOIL_IF_MISS
|| gBattleMoves[goodMove].effect == EFFECT_RECOIL_50 || gBattleMoves[move1].effect == EFFECT_RECOIL_50
|| gBattleMoves[goodMove].effect == EFFECT_RECOIL_33_STATUS) || gBattleMoves[move1].effect == EFFECT_RECOIL_33
&& (gBattleMoves[bestMove].effect != EFFECT_RECOIL || gBattleMoves[move1].effect == EFFECT_RECOIL_33_STATUS)
&& gBattleMoves[bestMove].effect != EFFECT_RECOIL_IF_MISS && (gBattleMoves[move2].effect != EFFECT_RECOIL_25
&& gBattleMoves[bestMove].effect != EFFECT_RECOIL_50 && gBattleMoves[move2].effect != EFFECT_RECOIL_IF_MISS
&& gBattleMoves[bestMove].effect != EFFECT_RECOIL_33_STATUS && gBattleMoves[move2].effect != EFFECT_RECOIL_50
&& gBattleMoves[bestMove].effect != EFFECT_RECHARGE))) && gBattleMoves[move2].effect != EFFECT_RECOIL_33
return FALSE; && gBattleMoves[move2].effect != EFFECT_RECOIL_33_STATUS
&& gBattleMoves[move2].effect != EFFECT_RECHARGE)))
return 1;
if (((gBattleMoves[move2].effect == EFFECT_RECOIL_25
|| gBattleMoves[move2].effect == EFFECT_RECOIL_IF_MISS
|| gBattleMoves[move2].effect == EFFECT_RECOIL_50
|| gBattleMoves[move2].effect == EFFECT_RECOIL_33
|| gBattleMoves[move2].effect == EFFECT_RECOIL_33_STATUS)
&& (gBattleMoves[move1].effect != EFFECT_RECOIL_25
&& gBattleMoves[move1].effect != EFFECT_RECOIL_IF_MISS
&& gBattleMoves[move1].effect != EFFECT_RECOIL_50
&& gBattleMoves[move1].effect != EFFECT_RECOIL_33
&& gBattleMoves[move1].effect != EFFECT_RECOIL_33_STATUS
&& gBattleMoves[move1].effect != EFFECT_RECHARGE)))
return 0;
} }
// Check recharge // Check recharge
if (gBattleMoves[goodMove].effect == EFFECT_RECHARGE && gBattleMoves[bestMove].effect != EFFECT_RECHARGE) if (gBattleMoves[move1].effect == EFFECT_RECHARGE && gBattleMoves[move2].effect != EFFECT_RECHARGE)
return FALSE; return 1;
if (gBattleMoves[move2].effect == EFFECT_RECHARGE && gBattleMoves[move1].effect != EFFECT_RECHARGE)
return 0;
// Check additional effect. // Check additional effect.
if (gBattleMoves[bestMove].effect != 0 && gBattleMoves[goodMove].effect == 0) if (gBattleMoves[move1].effect == 0 && gBattleMoves[move2].effect != 0)
return FALSE; return 1;
if (gBattleMoves[move2].effect == 0 && gBattleMoves[move1].effect != 0)
return 0;
return TRUE; return 2;
} }
static void Cmd_get_how_powerful_move_is(void) static void Cmd_get_how_powerful_move_is(void)
@ -1449,19 +1470,39 @@ static void Cmd_get_how_powerful_move_is(void)
} }
} }
for (bestId = 0, i = 0; i < MAX_MON_MOVES; i++) hp = gBattleMons[gBattlerTarget].hp + (20 * gBattleMons[gBattlerTarget].hp / 100); // 20 % add to make sure the battler is always fainted
// If a move can faint battler, it doesn't matter how much damage it does
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moveDmgs[i] > hp)
moveDmgs[i] = hp;
}
for (bestId = 0, i = 1; i < MAX_MON_MOVES; i++)
{ {
if (moveDmgs[i] > moveDmgs[bestId]) if (moveDmgs[i] > moveDmgs[bestId])
bestId = i; bestId = i;
if (moveDmgs[i] == moveDmgs[bestId])
{
switch (WhichMoveBetter(gBattleMons[sBattler_AI].moves[bestId], gBattleMons[sBattler_AI].moves[i]))
{
case 2:
if (Random() & 1)
break;
case 1:
bestId = i;
break;
}
}
} }
currId = AI_THINKING_STRUCT->movesetIndex; currId = AI_THINKING_STRUCT->movesetIndex;
hp = gBattleMons[gBattlerTarget].hp;
if (currId == bestId) if (currId == bestId)
AI_THINKING_STRUCT->funcResult = MOVE_POWER_BEST; AI_THINKING_STRUCT->funcResult = MOVE_POWER_BEST;
// Compare percentage difference. // Compare percentage difference.
else if ((moveDmgs[bestId] * 100 / hp) - (moveDmgs[currId] * 100 / hp) <= 10 else if ((moveDmgs[currId] >= hp || moveDmgs[bestId] < hp) // If current move can faint as well, or if neither can
&& CompareTwoMoves(gBattleMons[sBattler_AI].moves[bestId], gBattleMons[sBattler_AI].moves[currId])) && (moveDmgs[bestId] * 100 / hp) - (moveDmgs[currId] * 100 / hp) <= 30
&& WhichMoveBetter(gBattleMons[sBattler_AI].moves[bestId], gBattleMons[sBattler_AI].moves[currId]) != 0)
AI_THINKING_STRUCT->funcResult = MOVE_POWER_GOOD; AI_THINKING_STRUCT->funcResult = MOVE_POWER_GOOD;
else else
AI_THINKING_STRUCT->funcResult = MOVE_POWER_WEAK; AI_THINKING_STRUCT->funcResult = MOVE_POWER_WEAK;

View File

@ -2599,14 +2599,6 @@ void SetMoveEffect(bool32 primary, u32 certain)
} }
} }
break; break;
case MOVE_EFFECT_RECOIL_25: // 25% recoil
gBattleMoveDamage = (gHpDealt) / 4;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect];
break;
case MOVE_EFFECT_ATK_PLUS_1: case MOVE_EFFECT_ATK_PLUS_1:
case MOVE_EFFECT_DEF_PLUS_1: case MOVE_EFFECT_DEF_PLUS_1:
case MOVE_EFFECT_SPD_PLUS_1: case MOVE_EFFECT_SPD_PLUS_1:
@ -2812,7 +2804,15 @@ void SetMoveEffect(bool32 primary, u32 certain)
BattleScriptPush(gBattlescriptCurrInstr + 1); BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_DefSpDefDown; gBattlescriptCurrInstr = BattleScript_DefSpDefDown;
break; break;
case MOVE_EFFECT_RECOIL_33: // Double Edge case MOVE_EFFECT_RECOIL_25: // Take Down, 25% recoil
gBattleMoveDamage = (gHpDealt) / 4;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect];
break;
case MOVE_EFFECT_RECOIL_33: // Double Edge, 33 % recoil
gBattleMoveDamage = gHpDealt / 3; gBattleMoveDamage = gHpDealt / 3;
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1; gBattleMoveDamage = 1;
@ -2820,7 +2820,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
BattleScriptPush(gBattlescriptCurrInstr + 1); BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect]; gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect];
break; break;
case MOVE_EFFECT_RECOIL_50: // Head Smash case MOVE_EFFECT_RECOIL_50: // Head Smash, 50 % recoil
gBattleMoveDamage = gHpDealt / 2; gBattleMoveDamage = gHpDealt / 2;
if (gBattleMoveDamage == 0) if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1; gBattleMoveDamage = 1;

View File

@ -506,7 +506,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_TAKE_DOWN] = [MOVE_TAKE_DOWN] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_RECOIL_25,
.power = 90, .power = 90,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 85, .accuracy = 85,
@ -534,7 +534,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_DOUBLE_EDGE] = [MOVE_DOUBLE_EDGE] =
{ {
.effect = EFFECT_DOUBLE_EDGE, .effect = EFFECT_RECOIL_33,
.power = 120, .power = 120,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 100, .accuracy = 100,
@ -926,7 +926,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_SUBMISSION] = [MOVE_SUBMISSION] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_RECOIL_25,
.power = 80, .power = 80,
.type = TYPE_FIGHTING, .type = TYPE_FIGHTING,
.accuracy = 80, .accuracy = 80,
@ -2313,7 +2313,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_STRUGGLE] = [MOVE_STRUGGLE] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_RECOIL_25,
.power = 50, .power = 50,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 0, .accuracy = 0,
@ -5790,7 +5790,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_BRAVE_BIRD] = [MOVE_BRAVE_BIRD] =
{ {
.effect = EFFECT_DOUBLE_EDGE, .effect = EFFECT_RECOIL_33,
.power = 120, .power = 120,
.type = TYPE_FLYING, .type = TYPE_FLYING,
.accuracy = 100, .accuracy = 100,
@ -6339,7 +6339,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_WOOD_HAMMER] = [MOVE_WOOD_HAMMER] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_RECOIL_25,
.power = 120, .power = 120,
.type = TYPE_GRASS, .type = TYPE_GRASS,
.accuracy = 100, .accuracy = 100,
@ -7405,7 +7405,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_WILD_CHARGE] = [MOVE_WILD_CHARGE] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_RECOIL_25,
.power = 90, .power = 90,
.type = TYPE_ELECTRIC, .type = TYPE_ELECTRIC,
.accuracy = 100, .accuracy = 100,
@ -7615,7 +7615,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_HEAD_CHARGE] = [MOVE_HEAD_CHARGE] =
{ {
.effect = EFFECT_RECOIL, .effect = EFFECT_RECOIL_25,
.power = 120, .power = 120,
.type = TYPE_NORMAL, .type = TYPE_NORMAL,
.accuracy = 100, .accuracy = 100,

View File

@ -3218,7 +3218,7 @@ static const struct TrainerMonItemCustomMoves sParty_Sidney[] = {
.lvl = 46, .lvl = 46,
.species = SPECIES_MIGHTYENA, .species = SPECIES_MIGHTYENA,
.heldItem = ITEM_NONE, .heldItem = ITEM_NONE,
.moves = {MOVE_ROAR, MOVE_DOUBLE_EDGE, MOVE_SAND_ATTACK, MOVE_CRUNCH} .moves = {MOVE_TAKE_DOWN, MOVE_DOUBLE_EDGE, MOVE_BITE, MOVE_CRUNCH}
}, },
{ {
.iv = 250, .iv = 250,