summaryrefslogtreecommitdiff
path: root/src/battle_ai_script_commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/battle_ai_script_commands.c')
-rw-r--r--src/battle_ai_script_commands.c98
1 files changed, 54 insertions, 44 deletions
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index b7679429c..b72875036 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -95,16 +95,16 @@ static void Cmd_if_equal_(void);
static void Cmd_if_not_equal_(void);
static void Cmd_if_user_goes(void);
static void Cmd_if_user_doesnt_go(void);
-static void Cmd_nullsub_2A(void);
-static void Cmd_nullsub_2B(void);
+static void Cmd_nop_2A(void);
+static void Cmd_nop_2B(void);
static void Cmd_count_usable_party_mons(void);
static void Cmd_get_considered_move(void);
static void Cmd_get_considered_move_effect(void);
static void Cmd_get_ability(void);
static void Cmd_get_highest_type_effectiveness(void);
static void Cmd_if_type_effectiveness(void);
-static void Cmd_nullsub_32(void);
-static void Cmd_nullsub_33(void);
+static void Cmd_nop_32(void);
+static void Cmd_nop_33(void);
static void Cmd_if_status_in_party(void);
static void Cmd_if_status_not_in_party(void);
static void Cmd_get_weather(void);
@@ -135,12 +135,12 @@ static void Cmd_get_move_type_from_result(void);
static void Cmd_get_move_power_from_result(void);
static void Cmd_get_move_effect_from_result(void);
static void Cmd_get_protect_count(void);
-static void Cmd_nullsub_52(void);
-static void Cmd_nullsub_53(void);
-static void Cmd_nullsub_54(void);
-static void Cmd_nullsub_55(void);
-static void Cmd_nullsub_56(void);
-static void Cmd_nullsub_57(void);
+static void Cmd_nop_52(void);
+static void Cmd_nop_53(void);
+static void Cmd_nop_54(void);
+static void Cmd_nop_55(void);
+static void Cmd_nop_56(void);
+static void Cmd_nop_57(void);
static void Cmd_call(void);
static void Cmd_goto(void);
static void Cmd_end(void);
@@ -204,16 +204,16 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
Cmd_if_not_equal_, // 0x27
Cmd_if_user_goes, // 0x28
Cmd_if_user_doesnt_go, // 0x29
- Cmd_nullsub_2A, // 0x2A
- Cmd_nullsub_2B, // 0x2B
+ Cmd_nop_2A, // 0x2A
+ Cmd_nop_2B, // 0x2B
Cmd_count_usable_party_mons, // 0x2C
Cmd_get_considered_move, // 0x2D
Cmd_get_considered_move_effect, // 0x2E
Cmd_get_ability, // 0x2F
Cmd_get_highest_type_effectiveness, // 0x30
Cmd_if_type_effectiveness, // 0x31
- Cmd_nullsub_32, // 0x32
- Cmd_nullsub_33, // 0x33
+ Cmd_nop_32, // 0x32
+ Cmd_nop_33, // 0x33
Cmd_if_status_in_party, // 0x34
Cmd_if_status_not_in_party, // 0x35
Cmd_get_weather, // 0x36
@@ -244,12 +244,12 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
Cmd_get_move_power_from_result, // 0x4F
Cmd_get_move_effect_from_result, // 0x50
Cmd_get_protect_count, // 0x51
- Cmd_nullsub_52, // 0x52
- Cmd_nullsub_53, // 0x53
- Cmd_nullsub_54, // 0x54
- Cmd_nullsub_55, // 0x55
- Cmd_nullsub_56, // 0x56
- Cmd_nullsub_57, // 0x57
+ Cmd_nop_52, // 0x52
+ Cmd_nop_53, // 0x53
+ Cmd_nop_54, // 0x54
+ Cmd_nop_55, // 0x55
+ Cmd_nop_56, // 0x56
+ Cmd_nop_57, // 0x57
Cmd_call, // 0x58
Cmd_goto, // 0x59
Cmd_end, // 0x5A
@@ -293,7 +293,7 @@ void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves)
if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
&& !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER
| BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_SECRET_BASE | BATTLE_TYPE_FRONTIER
- | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_x2000000)
+ | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_RECORDED_LINK)
)
)
{
@@ -1278,11 +1278,11 @@ static void Cmd_if_user_doesnt_go(void)
gAIScriptPtr += 6;
}
-static void Cmd_nullsub_2A(void)
+static void Cmd_nop_2A(void)
{
}
-static void Cmd_nullsub_2B(void)
+static void Cmd_nop_2B(void)
{
}
@@ -1539,11 +1539,11 @@ static void Cmd_if_type_effectiveness(void)
gAIScriptPtr += 6;
}
-static void Cmd_nullsub_32(void)
+static void Cmd_nop_32(void)
{
}
-static void Cmd_nullsub_33(void)
+static void Cmd_nop_33(void)
{
}
@@ -1761,7 +1761,11 @@ static void Cmd_if_cant_faint(void)
gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;
- // This macro is missing the damage 0 = 1 assumption.
+#ifdef BUGFIX
+ // Moves always do at least 1 damage.
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+#endif
if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage)
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
@@ -1877,9 +1881,14 @@ static void Cmd_if_has_move_with_effect(void)
case AI_TARGET_PARTNER:
for (i = 0; i < MAX_MON_MOVES; i++)
{
- // UB: checks sBattler_AI instead of gBattlerTarget.
+ // BUG: checks sBattler_AI instead of gBattlerTarget.
+ #ifndef BUGFIX
if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
break;
+ #else
+ if (gBattleMons[gBattlerTarget].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
+ break;
+ #endif
}
if (i == MAX_MON_MOVES)
gAIScriptPtr += 7;
@@ -2014,18 +2023,24 @@ static void Cmd_if_holds_item(void)
{
u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
u16 item;
- u8 var1, var2;
+ u8 itemLo, itemHi;
if ((battlerId & BIT_SIDE) == (sBattler_AI & BIT_SIDE))
item = gBattleMons[battlerId].item;
else
item = BATTLE_HISTORY->itemEffects[battlerId];
- // UB: doesn't properly read an unaligned u16
- var2 = gAIScriptPtr[2];
- var1 = gAIScriptPtr[3];
+ itemHi = gAIScriptPtr[2];
+ itemLo = gAIScriptPtr[3];
- if ((var1 | var2) == item)
+#ifdef BUGFIX
+ // This bug doesn't affect the vanilla game because this script command
+ // is only used to check ITEM_PERSIM_BERRY, whose high byte happens to
+ // be 0.
+ if (((itemHi << 8) | itemLo) == item)
+#else
+ if ((itemLo | itemHi) == item)
+#endif
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
@@ -2089,12 +2104,7 @@ static void Cmd_get_used_held_item(void)
else
battlerId = gBattlerTarget;
- // This is likely a leftover from Ruby's code and its ugly ewram access.
- #ifdef NONMATCHING
- AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId];
- #else
- AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (battlerId * 2));
- #endif // NONMATCHING
+ AI_THINKING_STRUCT->funcResult = *(u8 *)&gBattleStruct->usedHeldItems[battlerId];
gAIScriptPtr += 2;
}
@@ -2134,27 +2144,27 @@ static void Cmd_get_protect_count(void)
gAIScriptPtr += 2;
}
-static void Cmd_nullsub_52(void)
+static void Cmd_nop_52(void)
{
}
-static void Cmd_nullsub_53(void)
+static void Cmd_nop_53(void)
{
}
-static void Cmd_nullsub_54(void)
+static void Cmd_nop_54(void)
{
}
-static void Cmd_nullsub_55(void)
+static void Cmd_nop_55(void)
{
}
-static void Cmd_nullsub_56(void)
+static void Cmd_nop_56(void)
{
}
-static void Cmd_nullsub_57(void)
+static void Cmd_nop_57(void)
{
}