mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 11:44:17 +01:00
ai tweaks
This commit is contained in:
parent
1ad76ff3d2
commit
3a220d0733
@ -683,6 +683,13 @@
|
|||||||
.byte \battler
|
.byte \battler
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro if_has_move_with_accuracy_lt battler:req, value:req, ptr:req
|
||||||
|
.byte 0x79
|
||||||
|
.byte \battler
|
||||||
|
.byte \value
|
||||||
|
.4byte \ptr
|
||||||
|
.endm
|
||||||
|
|
||||||
@ useful script macros
|
@ useful script macros
|
||||||
.macro if_has_physical_move battler:req, ptr:req
|
.macro if_has_physical_move battler:req, ptr:req
|
||||||
if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr
|
if_has_move_with_split \battler, SPLIT_PHYSICAL, \ptr
|
||||||
|
@ -268,6 +268,18 @@ AI_CheckBadMove_CheckEffect: @ 82DC045
|
|||||||
if_effect EFFECT_TRICK_ROOM, AI_CBM_TrickRoom
|
if_effect EFFECT_TRICK_ROOM, AI_CBM_TrickRoom
|
||||||
if_effect EFFECT_WONDER_ROOM, AI_CBM_WonderRoom
|
if_effect EFFECT_WONDER_ROOM, AI_CBM_WonderRoom
|
||||||
if_effect EFFECT_MAGIC_ROOM, AI_CBM_MagicRoom
|
if_effect EFFECT_MAGIC_ROOM, AI_CBM_MagicRoom
|
||||||
|
if_effect EFFECT_SOAK, AI_CBM_Soak
|
||||||
|
if_effect EFFECT_LOCK_ON, AI_CBM_LockOn
|
||||||
|
end
|
||||||
|
|
||||||
|
AI_CBM_LockOn:
|
||||||
|
if_status3 AI_TARGET, STATUS3_ALWAYS_HITS, Score_Minus10
|
||||||
|
if_ability AI_TARGET, ABILITY_NO_GUARD, Score_Minus10
|
||||||
|
if_ability AI_USER, ABILITY_NO_GUARD, Score_Minus10
|
||||||
|
end
|
||||||
|
|
||||||
|
AI_CBM_Soak:
|
||||||
|
if_type AI_TARGET, TYPE_WATER, Score_Minus10
|
||||||
end
|
end
|
||||||
|
|
||||||
AI_CBM_TrickRoom:
|
AI_CBM_TrickRoom:
|
||||||
@ -1122,6 +1134,7 @@ AI_CheckViability:
|
|||||||
if_effect EFFECT_MIRROR_COAT, AI_CV_MirrorCoat
|
if_effect EFFECT_MIRROR_COAT, AI_CV_MirrorCoat
|
||||||
if_effect EFFECT_SKULL_BASH, AI_CV_ChargeUpMove
|
if_effect EFFECT_SKULL_BASH, AI_CV_ChargeUpMove
|
||||||
if_effect EFFECT_SOLARBEAM, AI_CV_ChargeUpMove
|
if_effect EFFECT_SOLARBEAM, AI_CV_ChargeUpMove
|
||||||
|
if_effect EFFECT_GEOMANCY, AI_CV_Geomancy
|
||||||
if_effect EFFECT_SEMI_INVULNERABLE, AI_CV_SemiInvulnerable
|
if_effect EFFECT_SEMI_INVULNERABLE, AI_CV_SemiInvulnerable
|
||||||
if_effect EFFECT_SOFTBOILED, AI_CV_Heal
|
if_effect EFFECT_SOFTBOILED, AI_CV_Heal
|
||||||
if_effect EFFECT_FAKE_OUT, AI_CV_FakeOut
|
if_effect EFFECT_FAKE_OUT, AI_CV_FakeOut
|
||||||
@ -1970,6 +1983,7 @@ AI_CV_Rest_End:
|
|||||||
end
|
end
|
||||||
|
|
||||||
AI_CV_OneHitKO:
|
AI_CV_OneHitKO:
|
||||||
|
if_status3 AI_TARGET, STATUS3_ALWAYS_HITS, Score_Plus5
|
||||||
end
|
end
|
||||||
|
|
||||||
AI_CV_SuperFang:
|
AI_CV_SuperFang:
|
||||||
@ -2034,6 +2048,9 @@ AI_CV_FocusEnergy2:
|
|||||||
goto AI_CV_FocusEnergy3
|
goto AI_CV_FocusEnergy3
|
||||||
|
|
||||||
AI_CV_Swagger:
|
AI_CV_Swagger:
|
||||||
|
if_doesnt_have_move_with_effect AI_USER, EFFECT_FOUL_PLAY, AI_CV_Swagger2
|
||||||
|
score +1
|
||||||
|
AI_CV_Swagger2:
|
||||||
if_has_move AI_USER, MOVE_PSYCH_UP, AI_CV_SwaggerHasPsychUp
|
if_has_move AI_USER, MOVE_PSYCH_UP, AI_CV_SwaggerHasPsychUp
|
||||||
|
|
||||||
AI_CV_Flatter:
|
AI_CV_Flatter:
|
||||||
@ -2386,10 +2403,32 @@ AI_CV_PainSplit_ScoreDown1:
|
|||||||
|
|
||||||
AI_CV_PainSplit_End:
|
AI_CV_PainSplit_End:
|
||||||
end
|
end
|
||||||
|
|
||||||
|
AI_EncourageIfHasOHKO:
|
||||||
|
if_level_cond 1, AI_EncourageIfHasOHKORet
|
||||||
|
if_has_move_with_effect AI_USER, EFFECT_OHKO, Score_Plus3
|
||||||
|
AI_EncourageIfHasOHKORet:
|
||||||
|
end
|
||||||
|
|
||||||
|
AI_EncourageIfHasLowAccuracyMove:
|
||||||
|
if_ability AI_USER, ABILITY_COMPOUND_EYES, AI_EncourageIfHasVeryLowAccuracyMove
|
||||||
|
get_hold_effect AI_USER
|
||||||
|
if_equal HOLD_EFFECT_WIDE_LENS, AI_EncourageIfHasVeryLowAccuracyMove
|
||||||
|
if_equal HOLD_EFFECT_ZOOM_LENS, AI_EncourageIfHasVeryLowAccuracyMove
|
||||||
|
if_has_move_with_accuracy_lt AI_USER, 86, Score_Plus3
|
||||||
|
if_has_move_with_accuracy_lt AI_USER, 91, Score_Plus1
|
||||||
|
goto Score_Minus1
|
||||||
|
AI_EncourageIfHasVeryLowAccuracyMove:
|
||||||
|
if_has_move_with_accuracy_lt AI_USER, 81, Score_Plus3
|
||||||
|
if_has_move_with_accuracy_lt AI_USER, 86, Score_Plus1
|
||||||
|
goto Score_Minus1
|
||||||
|
|
||||||
AI_CV_LockOn:
|
AI_CV_LockOn:
|
||||||
|
call AI_EncourageIfHasOHKO
|
||||||
|
call AI_EncourageIfHasLowAccuracyMove
|
||||||
|
AI_CV_LockOn2:
|
||||||
if_random_less_than 128, AI_CV_LockOn_End
|
if_random_less_than 128, AI_CV_LockOn_End
|
||||||
score +2
|
score +1
|
||||||
|
|
||||||
AI_CV_LockOn_End:
|
AI_CV_LockOn_End:
|
||||||
end
|
end
|
||||||
@ -2854,8 +2893,15 @@ AI_CV_MirrorCoat_ScoreDown1:
|
|||||||
|
|
||||||
AI_CV_MirrorCoat_End:
|
AI_CV_MirrorCoat_End:
|
||||||
end
|
end
|
||||||
|
|
||||||
|
AI_CV_Geomancy:
|
||||||
|
get_hold_effect AI_USER
|
||||||
|
if_equal HOLD_EFFECT_POWER_HERB, AI_CV_ChargeUpMove_ScoreUp2
|
||||||
|
end
|
||||||
|
|
||||||
AI_CV_ChargeUpMove:
|
AI_CV_ChargeUpMove:
|
||||||
|
get_hold_effect AI_USER
|
||||||
|
if_equal HOLD_EFFECT_POWER_HERB, AI_CV_ChargeUpMove_ScoreUp2
|
||||||
if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_ChargeUpMove_ScoreDown2
|
if_type_effectiveness AI_EFFECTIVENESS_x0_25, AI_CV_ChargeUpMove_ScoreDown2
|
||||||
if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_ChargeUpMove_ScoreDown2
|
if_type_effectiveness AI_EFFECTIVENESS_x0_5, AI_CV_ChargeUpMove_ScoreDown2
|
||||||
if_has_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_ChargeUpMove_ScoreDown2
|
if_has_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_ChargeUpMove_ScoreDown2
|
||||||
@ -2868,8 +2914,13 @@ AI_CV_ChargeUpMove_ScoreDown2:
|
|||||||
|
|
||||||
AI_CV_ChargeUpMove_End:
|
AI_CV_ChargeUpMove_End:
|
||||||
end
|
end
|
||||||
|
AI_CV_ChargeUpMove_ScoreUp2:
|
||||||
|
score +2
|
||||||
|
goto AI_CV_ChargeUpMove_End
|
||||||
|
|
||||||
AI_CV_SemiInvulnerable:
|
AI_CV_SemiInvulnerable:
|
||||||
|
get_hold_effect AI_USER
|
||||||
|
if_equal HOLD_EFFECT_POWER_HERB, AI_CV_ChargeUpMove_ScoreUp2
|
||||||
if_doesnt_have_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_SemiInvulnerable2
|
if_doesnt_have_move_with_effect AI_TARGET, EFFECT_PROTECT, AI_CV_SemiInvulnerable2
|
||||||
score -1
|
score -1
|
||||||
goto AI_CV_SemiInvulnerable_End
|
goto AI_CV_SemiInvulnerable_End
|
||||||
|
@ -179,6 +179,7 @@ static void Cmd_get_considered_move_split(void);
|
|||||||
static void Cmd_get_considered_move_target(void);
|
static void Cmd_get_considered_move_target(void);
|
||||||
static void Cmd_compare_speeds(void);
|
static void Cmd_compare_speeds(void);
|
||||||
static void Cmd_is_wakeup_turn(void);
|
static void Cmd_is_wakeup_turn(void);
|
||||||
|
static void Cmd_if_has_move_with_accuracy_lt(void);
|
||||||
|
|
||||||
// ewram
|
// ewram
|
||||||
EWRAM_DATA const u8 *gAIScriptPtr = NULL;
|
EWRAM_DATA const u8 *gAIScriptPtr = NULL;
|
||||||
@ -310,6 +311,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
|
|||||||
Cmd_get_considered_move_target, // 0x76
|
Cmd_get_considered_move_target, // 0x76
|
||||||
Cmd_compare_speeds, // 0x77
|
Cmd_compare_speeds, // 0x77
|
||||||
Cmd_is_wakeup_turn, // 0x78
|
Cmd_is_wakeup_turn, // 0x78
|
||||||
|
Cmd_if_has_move_with_accuracy_lt, // 0x79
|
||||||
};
|
};
|
||||||
|
|
||||||
static const u16 sDiscouragedPowerfulMoveEffects[] =
|
static const u16 sDiscouragedPowerfulMoveEffects[] =
|
||||||
@ -2591,15 +2593,18 @@ static void Cmd_if_cant_use_last_resort(void)
|
|||||||
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
|
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u16 *GetMovesArray(u32 battler)
|
||||||
|
{
|
||||||
|
if (IsBattlerAIControlled(battler) || IsBattlerAIControlled(BATTLE_PARTNER(battler)))
|
||||||
|
return gBattleMons[battler].moves;
|
||||||
|
else
|
||||||
|
return gBattleResources->battleHistory->usedMoves[battler];
|
||||||
|
}
|
||||||
|
|
||||||
static bool32 HasMoveWithSplit(u32 battler, u32 split)
|
static bool32 HasMoveWithSplit(u32 battler, u32 split)
|
||||||
{
|
{
|
||||||
s32 i;
|
s32 i;
|
||||||
u16 *moves;
|
u16 *moves = GetMovesArray(battler);
|
||||||
|
|
||||||
if (IsBattlerAIControlled(battler) || IsBattlerAIControlled(BATTLE_PARTNER(battler)))
|
|
||||||
moves = gBattleMons[battler].moves;
|
|
||||||
else
|
|
||||||
moves = gBattleResources->battleHistory->usedMoves[battler];
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_MON_MOVES; i++)
|
for (i = 0; i < MAX_MON_MOVES; i++)
|
||||||
{
|
{
|
||||||
@ -2631,14 +2636,9 @@ static void Cmd_if_has_no_move_with_split(void)
|
|||||||
static bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split)
|
static bool32 MovesWithSplitUnusable(u32 attacker, u32 target, u32 split)
|
||||||
{
|
{
|
||||||
s32 i, moveType;
|
s32 i, moveType;
|
||||||
u16 *moves;
|
|
||||||
u32 usable = 0;
|
u32 usable = 0;
|
||||||
u32 unusable = CheckMoveLimitations(attacker, 0, 0xFF);
|
u32 unusable = CheckMoveLimitations(attacker, 0, 0xFF);
|
||||||
|
u16 *moves = GetMovesArray(attacker);
|
||||||
if (IsBattlerAIControlled(attacker))
|
|
||||||
moves = gBattleMons[attacker].moves;
|
|
||||||
else
|
|
||||||
moves = gBattleResources->battleHistory->usedMoves[attacker];
|
|
||||||
|
|
||||||
for (i = 0; i < MAX_MON_MOVES; i++)
|
for (i = 0; i < MAX_MON_MOVES; i++)
|
||||||
{
|
{
|
||||||
@ -2698,12 +2698,7 @@ static void Cmd_if_cant_use_belch(void)
|
|||||||
static void Cmd_if_has_move_with_type(void)
|
static void Cmd_if_has_move_with_type(void)
|
||||||
{
|
{
|
||||||
u32 i, moveType, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
|
u32 i, moveType, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
|
||||||
u16 *moves;
|
u16 *moves = GetMovesArray(battler);
|
||||||
|
|
||||||
if (IsBattlerAIControlled(battler))
|
|
||||||
moves = gBattleMons[battler].moves;
|
|
||||||
else
|
|
||||||
moves = BATTLE_HISTORY->usedMoves[battler];
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
@ -2725,12 +2720,7 @@ static void Cmd_if_has_move_with_type(void)
|
|||||||
static void Cmd_if_has_move_with_flag(void)
|
static void Cmd_if_has_move_with_flag(void)
|
||||||
{
|
{
|
||||||
u32 i, flag, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
|
u32 i, flag, battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
|
||||||
u16 *moves;
|
u16 *moves = GetMovesArray(battler);
|
||||||
|
|
||||||
if (IsBattlerAIControlled(battler))
|
|
||||||
moves = gBattleMons[battler].moves;
|
|
||||||
else
|
|
||||||
moves = BATTLE_HISTORY->usedMoves[battler];
|
|
||||||
|
|
||||||
flag = T1_READ_32(gAIScriptPtr + 2);
|
flag = T1_READ_32(gAIScriptPtr + 2);
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
@ -2858,3 +2848,25 @@ static void Cmd_is_wakeup_turn(void)
|
|||||||
|
|
||||||
gAIScriptPtr += 2;
|
gAIScriptPtr += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Cmd_if_has_move_with_accuracy_lt(void)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
u32 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
|
||||||
|
u32 toCmp = gAIScriptPtr[2];
|
||||||
|
u16 *moves = GetMovesArray(battler);
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_MON_MOVES; i++)
|
||||||
|
{
|
||||||
|
if (moves[i] != MOVE_NONE
|
||||||
|
&& gBattleMoves[moves[i]].effect != EFFECT_OHKO
|
||||||
|
&& gBattleMoves[moves[i]].accuracy > 1
|
||||||
|
&& gBattleMoves[moves[i]].accuracy < toCmp)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == MAX_MON_MOVES)
|
||||||
|
gAIScriptPtr += 7;
|
||||||
|
else
|
||||||
|
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user