match two functions

This commit is contained in:
DizzyEggg
2018-02-28 19:37:48 +01:00
parent 5162393c16
commit 305a4fa744
4 changed files with 247 additions and 571 deletions
+1 -1
View File
@@ -92,6 +92,6 @@
#define ATK48_STAT_NEGATIVE 0x1 #define ATK48_STAT_NEGATIVE 0x1
#define ATK48_STAT_BY_TWO 0x2 #define ATK48_STAT_BY_TWO 0x2
#define ATK48_BIT_x4 0x4 #define ATK48_BIT_x4 0x4
#define ATK48_LOWER_FAIL_CHECK 0x8 #define ATK48_DONT_CHECK_LOWER 0x8
#endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H #endif // GUARD_CONSTANTS_BATTLE_SCRIPT_COMMANDS_H
+166 -166
View File
@@ -346,7 +346,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
} }
gBattleResources->AI_ScriptsStack->size = 0; gBattleResources->AI_ScriptsStack->size = 0;
sBattler_AI = gActiveBattler; sBattler_AI = gActiveBattler;
// decide a random target bank in doubles // decide a random target battlerId in doubles
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{ {
gBattlerTarget = (Random() & BIT_FLANK) + (GetBattlerSide(gActiveBattler) ^ BIT_SIDE); gBattlerTarget = (Random() & BIT_FLANK) + (GetBattlerSide(gActiveBattler) ^ BIT_SIDE);
@@ -620,32 +620,32 @@ static void RecordLastUsedMoveByTarget(void)
} }
} }
void ClearBattlerMoveHistory(u8 bank) void ClearBattlerMoveHistory(u8 battlerId)
{ {
s32 i; s32 i;
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
gBattleResources->battleHistory->usedMoves[bank].moves[i] = 0; gBattleResources->battleHistory->usedMoves[battlerId].moves[i] = 0;
} }
void RecordAbilityBattle(u8 bank, u8 abilityId) void RecordAbilityBattle(u8 battlerId, u8 abilityId)
{ {
gBattleResources->battleHistory->abilities[bank] = abilityId; gBattleResources->battleHistory->abilities[battlerId] = abilityId;
} }
void ClearBattlerAbilityHistory(u8 bank) void ClearBattlerAbilityHistory(u8 battlerId)
{ {
gBattleResources->battleHistory->abilities[bank] = 0; gBattleResources->battleHistory->abilities[battlerId] = 0;
} }
void RecordItemEffectBattle(u8 bank, u8 itemEffect) void RecordItemEffectBattle(u8 battlerId, u8 itemEffect)
{ {
gBattleResources->battleHistory->itemEffects[bank] = itemEffect; gBattleResources->battleHistory->itemEffects[battlerId] = itemEffect;
} }
void ClearBankItemEffectHistory(u8 bank) void ClearBankItemEffectHistory(u8 battlerId)
{ {
gBattleResources->battleHistory->itemEffects[bank] = 0; gBattleResources->battleHistory->itemEffects[battlerId] = 0;
} }
static void BattleAICmd_if_random_less_than(void) static void BattleAICmd_if_random_less_than(void)
@@ -700,14 +700,14 @@ static void BattleAICmd_score(void)
static void BattleAICmd_if_hp_less_than(void) static void BattleAICmd_if_hp_less_than(void)
{ {
u16 bank; u16 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) < gAIScriptPtr[2]) if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) < gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else else
gAIScriptPtr += 7; gAIScriptPtr += 7;
@@ -715,14 +715,14 @@ static void BattleAICmd_if_hp_less_than(void)
static void BattleAICmd_if_hp_more_than(void) static void BattleAICmd_if_hp_more_than(void)
{ {
u16 bank; u16 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) > gAIScriptPtr[2]) if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) > gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else else
gAIScriptPtr += 7; gAIScriptPtr += 7;
@@ -730,14 +730,14 @@ static void BattleAICmd_if_hp_more_than(void)
static void BattleAICmd_if_hp_equal(void) static void BattleAICmd_if_hp_equal(void)
{ {
u16 bank; u16 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) == gAIScriptPtr[2]) if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) == gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else else
gAIScriptPtr += 7; gAIScriptPtr += 7;
@@ -745,14 +745,14 @@ static void BattleAICmd_if_hp_equal(void)
static void BattleAICmd_if_hp_not_equal(void) static void BattleAICmd_if_hp_not_equal(void)
{ {
u16 bank; u16 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) != gAIScriptPtr[2]) if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) != gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else else
gAIScriptPtr += 7; gAIScriptPtr += 7;
@@ -760,17 +760,17 @@ static void BattleAICmd_if_hp_not_equal(void)
static void BattleAICmd_if_status(void) static void BattleAICmd_if_status(void)
{ {
u16 bank; u16 battlerId;
u32 status; u32 status;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2); status = AIScriptRead32(gAIScriptPtr + 2);
if ((gBattleMons[bank].status1 & status) != 0) if ((gBattleMons[battlerId].status1 & status) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else else
gAIScriptPtr += 10; gAIScriptPtr += 10;
@@ -778,17 +778,17 @@ static void BattleAICmd_if_status(void)
static void BattleAICmd_if_not_status(void) static void BattleAICmd_if_not_status(void)
{ {
u16 bank; u16 battlerId;
u32 status; u32 status;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2); status = AIScriptRead32(gAIScriptPtr + 2);
if ((gBattleMons[bank].status1 & status) == 0) if ((gBattleMons[battlerId].status1 & status) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else else
gAIScriptPtr += 10; gAIScriptPtr += 10;
@@ -796,17 +796,17 @@ static void BattleAICmd_if_not_status(void)
static void BattleAICmd_if_status2(void) static void BattleAICmd_if_status2(void)
{ {
u16 bank; u16 battlerId;
u32 status; u32 status;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2); status = AIScriptRead32(gAIScriptPtr + 2);
if ((gBattleMons[bank].status2 & status) != 0) if ((gBattleMons[battlerId].status2 & status) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else else
gAIScriptPtr += 10; gAIScriptPtr += 10;
@@ -814,17 +814,17 @@ static void BattleAICmd_if_status2(void)
static void BattleAICmd_if_not_status2(void) static void BattleAICmd_if_not_status2(void)
{ {
u16 bank; u16 battlerId;
u32 status; u32 status;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2); status = AIScriptRead32(gAIScriptPtr + 2);
if ((gBattleMons[bank].status2 & status) == 0) if ((gBattleMons[battlerId].status2 & status) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else else
gAIScriptPtr += 10; gAIScriptPtr += 10;
@@ -832,17 +832,17 @@ static void BattleAICmd_if_not_status2(void)
static void BattleAICmd_if_status3(void) static void BattleAICmd_if_status3(void)
{ {
u16 bank; u16 battlerId;
u32 status; u32 status;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2); status = AIScriptRead32(gAIScriptPtr + 2);
if ((gStatuses3[bank] & status) != 0) if ((gStatuses3[battlerId] & status) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else else
gAIScriptPtr += 10; gAIScriptPtr += 10;
@@ -850,17 +850,17 @@ static void BattleAICmd_if_status3(void)
static void BattleAICmd_if_not_status3(void) static void BattleAICmd_if_not_status3(void)
{ {
u16 bank; u16 battlerId;
u32 status; u32 status;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2); status = AIScriptRead32(gAIScriptPtr + 2);
if ((gStatuses3[bank] & status) == 0) if ((gStatuses3[battlerId] & status) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else else
gAIScriptPtr += 10; gAIScriptPtr += 10;
@@ -868,15 +868,15 @@ static void BattleAICmd_if_not_status3(void)
static void BattleAICmd_if_side_affecting(void) static void BattleAICmd_if_side_affecting(void)
{ {
u16 bank; u16 battlerId;
u32 side, status; u32 side, status;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
side = GET_BATTLER_SIDE(bank); side = GET_BATTLER_SIDE(battlerId);
status = AIScriptRead32(gAIScriptPtr + 2); status = AIScriptRead32(gAIScriptPtr + 2);
if ((gSideStatuses[side] & status) != 0) if ((gSideStatuses[side] & status) != 0)
@@ -887,15 +887,15 @@ static void BattleAICmd_if_side_affecting(void)
static void BattleAICmd_if_not_side_affecting(void) static void BattleAICmd_if_not_side_affecting(void)
{ {
u16 bank; u16 battlerId;
u32 side, status; u32 side, status;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
side = GET_BATTLER_SIDE(bank); side = GET_BATTLER_SIDE(battlerId);
status = AIScriptRead32(gAIScriptPtr + 2); status = AIScriptRead32(gAIScriptPtr + 2);
if ((gSideStatuses[side] & status) == 0) if ((gSideStatuses[side] & status) == 0)
@@ -1123,9 +1123,9 @@ static void BattleAICmd_get_type(void)
gAIScriptPtr += 2; gAIScriptPtr += 2;
} }
static u8 BattleAI_GetWantedBank(u8 bank) static u8 BattleAI_GetWantedBank(u8 battlerId)
{ {
switch (bank) switch (battlerId)
{ {
case AI_USER: case AI_USER:
return sBattler_AI; return sBattler_AI;
@@ -1141,9 +1141,9 @@ static u8 BattleAI_GetWantedBank(u8 bank)
static void BattleAICmd_is_of_type(void) static void BattleAICmd_is_of_type(void)
{ {
u8 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]); u8 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]);
if(gBattleMons[bank].type1 == gAIScriptPtr[2] || gBattleMons[bank].type2 == gAIScriptPtr[2]) if(gBattleMons[battlerId].type1 == gAIScriptPtr[2] || gBattleMons[battlerId].type2 == gAIScriptPtr[2])
{ {
AI_THINKING_STRUCT->funcResult = TRUE; AI_THINKING_STRUCT->funcResult = TRUE;
} }
@@ -1277,7 +1277,7 @@ static void BattleAICmd_nullsub_2B(void)
static void BattleAICmd_count_usable_party_mons(void) static void BattleAICmd_count_usable_party_mons(void)
{ {
u8 bank; u8 battlerId;
u8 bankOnField1, bankOnField2; u8 bankOnField1, bankOnField2;
struct Pokemon *party; struct Pokemon *party;
int i; int i;
@@ -1285,11 +1285,11 @@ static void BattleAICmd_count_usable_party_mons(void)
AI_THINKING_STRUCT->funcResult = 0; AI_THINKING_STRUCT->funcResult = 0;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if (GetBattlerSide(bank) == B_SIDE_PLAYER) if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
party = gPlayerParty; party = gPlayerParty;
else else
party = gEnemyParty; party = gEnemyParty;
@@ -1297,14 +1297,14 @@ static void BattleAICmd_count_usable_party_mons(void)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{ {
u32 position; u32 position;
bankOnField1 = gBattlerPartyIndexes[bank]; bankOnField1 = gBattlerPartyIndexes[battlerId];
position = GetBattlerPosition(bank) ^ BIT_FLANK; position = GetBattlerPosition(battlerId) ^ BIT_FLANK;
bankOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)]; bankOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)];
} }
else // in singles there's only one bank by side else // in singles there's only one battlerId by side
{ {
bankOnField1 = gBattlerPartyIndexes[bank]; bankOnField1 = gBattlerPartyIndexes[battlerId];
bankOnField2 = gBattlerPartyIndexes[bank]; bankOnField2 = gBattlerPartyIndexes[battlerId];
} }
for (i = 0; i < PARTY_SIZE; i++) for (i = 0; i < PARTY_SIZE; i++)
@@ -1335,110 +1335,110 @@ static void BattleAICmd_get_considered_move_effect(void)
static void BattleAICmd_get_ability(void) static void BattleAICmd_get_ability(void)
{ {
u8 bank; u8 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if (gActiveBattler != bank) if (gActiveBattler != battlerId)
{ {
if (BATTLE_HISTORY->abilities[bank] != 0) if (BATTLE_HISTORY->abilities[battlerId] != 0)
{ {
AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[bank]; AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[battlerId];
gAIScriptPtr += 2; gAIScriptPtr += 2;
return; return;
} }
// abilities that prevent fleeing. // abilities that prevent fleeing.
if (gBattleMons[bank].ability == ABILITY_SHADOW_TAG if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG
|| gBattleMons[bank].ability == ABILITY_MAGNET_PULL || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL
|| gBattleMons[bank].ability == ABILITY_ARENA_TRAP) || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP)
{ {
AI_THINKING_STRUCT->funcResult = gBattleMons[bank].ability; AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability;
gAIScriptPtr += 2; gAIScriptPtr += 2;
return; return;
} }
if (gBaseStats[gBattleMons[bank].species].ability1 != ABILITY_NONE) if (gBaseStats[gBattleMons[battlerId].species].ability1 != ABILITY_NONE)
{ {
if (gBaseStats[gBattleMons[bank].species].ability2 != ABILITY_NONE) if (gBaseStats[gBattleMons[battlerId].species].ability2 != ABILITY_NONE)
{ {
// AI has no knowledge of opponent, so it guesses which ability. // AI has no knowledge of opponent, so it guesses which ability.
if (Random() & 1) if (Random() & 1)
{ {
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[bank].species].ability1; AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability1;
} }
else else
{ {
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[bank].species].ability2; AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability2;
} }
} }
else else
{ {
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[bank].species].ability1; // it's definitely ability 1. AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability1; // it's definitely ability 1.
} }
} }
else else
{ {
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[bank].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability. AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
} }
} }
else else
{ {
// The AI knows its own ability. // The AI knows its own ability.
AI_THINKING_STRUCT->funcResult = gBattleMons[bank].ability; AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability;
} }
gAIScriptPtr += 2; gAIScriptPtr += 2;
} }
static void BattleAICmd_check_ability(void) static void BattleAICmd_check_ability(void)
{ {
u32 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]); u32 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]);
u32 ability = gAIScriptPtr[2]; u32 ability = gAIScriptPtr[2];
if (gAIScriptPtr[1] == AI_TARGET || gAIScriptPtr[1] == AI_TARGET_PARTNER) if (gAIScriptPtr[1] == AI_TARGET || gAIScriptPtr[1] == AI_TARGET_PARTNER)
{ {
if (BATTLE_HISTORY->abilities[bank] != 0) if (BATTLE_HISTORY->abilities[battlerId] != 0)
{ {
ability = BATTLE_HISTORY->abilities[bank]; ability = BATTLE_HISTORY->abilities[battlerId];
AI_THINKING_STRUCT->funcResult = ability; AI_THINKING_STRUCT->funcResult = ability;
} }
// abilities that prevent fleeing. // abilities that prevent fleeing.
else if (gBattleMons[bank].ability == ABILITY_SHADOW_TAG else if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG
|| gBattleMons[bank].ability == ABILITY_MAGNET_PULL || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL
|| gBattleMons[bank].ability == ABILITY_ARENA_TRAP) || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP)
{ {
ability = gBattleMons[bank].ability; ability = gBattleMons[battlerId].ability;
} }
else if (gBaseStats[gBattleMons[bank].species].ability1 != ABILITY_NONE) else if (gBaseStats[gBattleMons[battlerId].species].ability1 != ABILITY_NONE)
{ {
if (gBaseStats[gBattleMons[bank].species].ability2 != ABILITY_NONE) if (gBaseStats[gBattleMons[battlerId].species].ability2 != ABILITY_NONE)
{ {
u8 abilityDummyVariable = ability; // needed to match u8 abilityDummyVariable = ability; // needed to match
if (gBaseStats[gBattleMons[bank].species].ability1 != abilityDummyVariable if (gBaseStats[gBattleMons[battlerId].species].ability1 != abilityDummyVariable
&& gBaseStats[gBattleMons[bank].species].ability2 != abilityDummyVariable) && gBaseStats[gBattleMons[battlerId].species].ability2 != abilityDummyVariable)
{ {
ability = gBaseStats[gBattleMons[bank].species].ability1; ability = gBaseStats[gBattleMons[battlerId].species].ability1;
} }
else else
ability = 0; ability = 0;
} }
else else
{ {
ability = gBaseStats[gBattleMons[bank].species].ability1; ability = gBaseStats[gBattleMons[battlerId].species].ability1;
} }
} }
else else
{ {
ability = gBaseStats[gBattleMons[bank].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability. ability = gBaseStats[gBattleMons[battlerId].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
} }
} }
else else
{ {
// The AI knows its own or partner's ability. // The AI knows its own or partner's ability.
ability = gBattleMons[bank].ability; ability = gBattleMons[battlerId].ability;
} }
if (ability == 0) if (ability == 0)
{ {
@@ -1546,19 +1546,19 @@ static void BattleAICmd_if_status_in_party(void)
struct Pokemon *party; struct Pokemon *party;
int i; int i;
u32 statusToCompareTo; u32 statusToCompareTo;
u8 bank; u8 battlerId;
switch(gAIScriptPtr[1]) switch(gAIScriptPtr[1])
{ {
case AI_USER: case AI_USER:
bank = sBattler_AI; battlerId = sBattler_AI;
break; break;
default: default:
bank = gBattlerTarget; battlerId = gBattlerTarget;
break; break;
} }
party = (GetBattlerSide(bank) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2); statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
@@ -1583,19 +1583,19 @@ static void BattleAICmd_if_status_not_in_party(void)
struct Pokemon *party; struct Pokemon *party;
int i; int i;
u32 statusToCompareTo; u32 statusToCompareTo;
u8 bank; u8 battlerId;
switch(gAIScriptPtr[1]) switch(gAIScriptPtr[1])
{ {
case 1: case 1:
bank = sBattler_AI; battlerId = sBattler_AI;
break; break;
default: default:
bank = gBattlerTarget; battlerId = gBattlerTarget;
break; break;
} }
party = (GetBattlerSide(bank) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2); statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
@@ -1646,14 +1646,14 @@ static void BattleAICmd_if_not_effect(void)
static void BattleAICmd_if_stat_level_less_than(void) static void BattleAICmd_if_stat_level_less_than(void)
{ {
u32 bank; u32 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3]) if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
else else
gAIScriptPtr += 8; gAIScriptPtr += 8;
@@ -1661,14 +1661,14 @@ static void BattleAICmd_if_stat_level_less_than(void)
static void BattleAICmd_if_stat_level_more_than(void) static void BattleAICmd_if_stat_level_more_than(void)
{ {
u32 bank; u32 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3]) if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
else else
gAIScriptPtr += 8; gAIScriptPtr += 8;
@@ -1676,14 +1676,14 @@ static void BattleAICmd_if_stat_level_more_than(void)
static void BattleAICmd_if_stat_level_equal(void) static void BattleAICmd_if_stat_level_equal(void)
{ {
u32 bank; u32 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3]) if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
else else
gAIScriptPtr += 8; gAIScriptPtr += 8;
@@ -1691,14 +1691,14 @@ static void BattleAICmd_if_stat_level_equal(void)
static void BattleAICmd_if_stat_level_not_equal(void) static void BattleAICmd_if_stat_level_not_equal(void)
{ {
u32 bank; u32 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3]) if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
else else
gAIScriptPtr += 8; gAIScriptPtr += 8;
@@ -1940,16 +1940,16 @@ static void BattleAICmd_if_doesnt_have_move_with_effect(void)
static void BattleAICmd_if_any_move_disabled_or_encored(void) static void BattleAICmd_if_any_move_disabled_or_encored(void)
{ {
u8 bank; u8 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if (gAIScriptPtr[2] == 0) if (gAIScriptPtr[2] == 0)
{ {
if (gDisableStructs[bank].disabledMove == 0) if (gDisableStructs[battlerId].disabledMove == 0)
{ {
gAIScriptPtr += 7; gAIScriptPtr += 7;
return; return;
@@ -1962,7 +1962,7 @@ static void BattleAICmd_if_any_move_disabled_or_encored(void)
gAIScriptPtr += 7; gAIScriptPtr += 7;
return; return;
} }
else if (gDisableStructs[bank].encoredMove != 0) else if (gDisableStructs[battlerId].encoredMove != 0)
{ {
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
return; return;
@@ -2018,31 +2018,31 @@ static void BattleAICmd_watch(void)
static void BattleAICmd_get_hold_effect(void) static void BattleAICmd_get_hold_effect(void)
{ {
u8 bank; u8 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
if (gActiveBattler != bank) if (gActiveBattler != battlerId)
AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[bank]); AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[battlerId]);
else else
AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[bank].item); AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battlerId].item);
gAIScriptPtr += 2; gAIScriptPtr += 2;
} }
static void BattleAICmd_if_holds_item(void) static void BattleAICmd_if_holds_item(void)
{ {
u8 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]); u8 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]);
u16 item; u16 item;
u8 var1, var2; u8 var1, var2;
if ((bank & BIT_SIDE) == (sBattler_AI & BIT_SIDE)) if ((battlerId & BIT_SIDE) == (sBattler_AI & BIT_SIDE))
item = gBattleMons[bank].item; item = gBattleMons[battlerId].item;
else else
item = BATTLE_HISTORY->itemEffects[bank]; item = BATTLE_HISTORY->itemEffects[battlerId];
// UB: doesn't properly read an unaligned u16 // UB: doesn't properly read an unaligned u16
var2 = gAIScriptPtr[2]; var2 = gAIScriptPtr[2];
@@ -2056,42 +2056,42 @@ static void BattleAICmd_if_holds_item(void)
static void BattleAICmd_get_gender(void) static void BattleAICmd_get_gender(void)
{ {
u8 bank; u8 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[bank].species, gBattleMons[bank].personality); AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[battlerId].species, gBattleMons[battlerId].personality);
gAIScriptPtr += 2; gAIScriptPtr += 2;
} }
static void BattleAICmd_is_first_turn_for(void) static void BattleAICmd_is_first_turn_for(void)
{ {
u8 bank; u8 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].isFirstTurn; AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].isFirstTurn;
gAIScriptPtr += 2; gAIScriptPtr += 2;
} }
static void BattleAICmd_get_stockpile_count(void) static void BattleAICmd_get_stockpile_count(void)
{ {
u8 bank; u8 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].stockpileCounter; AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].stockpileCounter;
gAIScriptPtr += 2; gAIScriptPtr += 2;
} }
@@ -2105,18 +2105,18 @@ static void BattleAICmd_is_double_battle(void)
static void BattleAICmd_get_used_held_item(void) static void BattleAICmd_get_used_held_item(void)
{ {
u8 bank; u8 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
// This is likely a leftover from Ruby's code and its ugly ewram access // This is likely a leftover from Ruby's code and its ugly ewram access
#ifdef NONMATCHING #ifdef NONMATCHING
AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[bank]; AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId];
#else #else
AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (bank * 2)); AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (battlerId * 2));
#endif // NONMATCHING #endif // NONMATCHING
gAIScriptPtr += 2; gAIScriptPtr += 2;
@@ -2145,14 +2145,14 @@ static void BattleAICmd_get_move_effect_from_result(void)
static void BattleAICmd_get_protect_count(void) static void BattleAICmd_get_protect_count(void)
{ {
u8 bank; u8 battlerId;
if (gAIScriptPtr[1] == AI_USER) if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI; battlerId = sBattler_AI;
else else
bank = gBattlerTarget; battlerId = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].protectUses; AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].protectUses;
gAIScriptPtr += 2; gAIScriptPtr += 2;
} }
@@ -2255,9 +2255,9 @@ static void BattleAICmd_if_target_is_ally(void)
static void BattleAICmd_if_flash_fired(void) static void BattleAICmd_if_flash_fired(void)
{ {
u8 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]); u8 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]);
if (gBattleResources->flags->flags[bank] & UNKNOWN_FLAG_FLASH_FIRE) if (gBattleResources->flags->flags[battlerId] & UNKNOWN_FLAG_FLASH_FIRE)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else else
gAIScriptPtr += 6; gAIScriptPtr += 6;
+77 -323
View File
@@ -4436,31 +4436,34 @@ static void atk47_setgraphicalstatchangevalues(void)
gBattlescriptCurrInstr++; gBattlescriptCurrInstr++;
} }
#ifdef NONMATCHING
static void atk48_playstatchangeanimation(void) static void atk48_playstatchangeanimation(void)
{ {
u32 currStat = 0; u32 currStat = 0;
s16 statAnimId = 0; u16 statAnimId = 0;
s16 checkingStatAnimId = 0; s32 changeableStatsCount = 0;
s32 changeableStats = 0; u8 statsToCheck = 0;
u32 statsToCheck = 0;
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
statsToCheck = gBattlescriptCurrInstr[2]; statsToCheck = gBattlescriptCurrInstr[2];
if (gBattlescriptCurrInstr[3] & ATK48_STAT_NEGATIVE) // goes down if (gBattlescriptCurrInstr[3] & ATK48_STAT_NEGATIVE) // goes down
{ {
checkingStatAnimId = (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) ? 0x2D : 0x15; s16 startingStatAnimId;
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
startingStatAnimId = 0x2D;
else
startingStatAnimId = 0x15;
while (statsToCheck != 0) while (statsToCheck != 0)
{ {
if (statsToCheck & 1) if (statsToCheck & 1)
{ {
if (!(gBattlescriptCurrInstr[3] & ATK48_LOWER_FAIL_CHECK)) if (gBattlescriptCurrInstr[3] & ATK48_DONT_CHECK_LOWER)
{ {
if (gBattleMons[gActiveBattler].statStages[currStat] > 0) if (gBattleMons[gActiveBattler].statStages[currStat] > 0)
{ {
statAnimId = checkingStatAnimId; statAnimId = startingStatAnimId + currStat;
changeableStats++; changeableStatsCount++;
} }
} }
else if (!gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer else if (!gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer
@@ -4471,15 +4474,15 @@ static void atk48_playstatchangeanimation(void)
{ {
if (gBattleMons[gActiveBattler].statStages[currStat] > 0) if (gBattleMons[gActiveBattler].statStages[currStat] > 0)
{ {
statAnimId = checkingStatAnimId; statAnimId = startingStatAnimId + currStat;
changeableStats++; changeableStatsCount++;
} }
} }
} }
statsToCheck >>= 1, checkingStatAnimId++, currStat++; statsToCheck >>= 1, currStat++;
} }
if (changeableStats > 1) // more than one stat, so the color is gray if (changeableStatsCount > 1) // more than one stat, so the color is gray
{ {
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
statAnimId = 0x3A; statAnimId = 0x3A;
@@ -4489,18 +4492,23 @@ static void atk48_playstatchangeanimation(void)
} }
else // goes up else // goes up
{ {
checkingStatAnimId = (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) ? 0x26 : 0xE; s16 startingStatAnimId;
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
startingStatAnimId = 0x26;
else
startingStatAnimId = 0xE;
while (statsToCheck != 0) while (statsToCheck != 0)
{ {
if (statsToCheck & 1 && gBattleMons[gActiveBattler].statStages[currStat] < 0xC) if (statsToCheck & 1 && gBattleMons[gActiveBattler].statStages[currStat] < 0xC)
{ {
statAnimId = checkingStatAnimId; statAnimId = startingStatAnimId + currStat;
changeableStats++; changeableStatsCount++;
} }
statsToCheck >>= 1, checkingStatAnimId += 1, currStat++; statsToCheck >>= 1, currStat++;
} }
if (changeableStats > 1) // more than one stat, so the color is gray if (changeableStatsCount > 1) // more than one stat, so the color is gray
{ {
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
statAnimId = 0x38; statAnimId = 0x38;
@@ -4509,15 +4517,15 @@ static void atk48_playstatchangeanimation(void)
} }
} }
if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStats < 2) if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStatsCount < 2)
{ {
gBattlescriptCurrInstr += 4; gBattlescriptCurrInstr += 4;
} }
else if (changeableStats != 0 && gBattleScripting.field_1B == 0) else if (changeableStatsCount != 0 && gBattleScripting.field_1B == 0)
{ {
BtlController_EmitBattleAnimation(0, B_ANIM_STATS_CHANGE, statAnimId); BtlController_EmitBattleAnimation(0, B_ANIM_STATS_CHANGE, statAnimId);
MarkBattlerForControllerExec(gActiveBattler); MarkBattlerForControllerExec(gActiveBattler);
if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStats > 1) if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStatsCount > 1)
gBattleScripting.field_1B = 1; gBattleScripting.field_1B = 1;
gBattlescriptCurrInstr += 4; gBattlescriptCurrInstr += 4;
} }
@@ -4526,261 +4534,6 @@ static void atk48_playstatchangeanimation(void)
gBattlescriptCurrInstr += 4; gBattlescriptCurrInstr += 4;
} }
} }
#else
ASM_DIRECT
static void atk48_playstatchangeanimation(void)
{
asm("\n\
.syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x4\n\
movs r7, 0\n\
movs r0, 0\n\
mov r8, r0\n\
movs r3, 0\n\
ldr r5, =gBattlescriptCurrInstr\n\
ldr r0, [r5]\n\
ldrb r0, [r0, 0x1]\n\
str r3, [sp]\n\
bl GetBattlerForBattleScript\n\
ldr r2, =gActiveBattler\n\
strb r0, [r2]\n\
ldr r0, [r5]\n\
ldrb r4, [r0, 0x2]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x1\n\
ands r0, r1\n\
ldr r3, [sp]\n\
cmp r0, 0\n\
beq _0804BAEC\n\
movs r0, 0x2\n\
ands r0, r1\n\
movs r1, 0x15\n\
cmp r0, 0\n\
beq _0804BA18\n\
movs r1, 0x2D\n\
_0804BA18:\n\
cmp r4, 0\n\
beq _0804BAC0\n\
movs r0, 0x1\n\
mov r10, r0\n\
ldr r0, =gBattleMons + 0x18\n\
mov r9, r0\n\
lsls r5, r1, 16\n\
_0804BA26:\n\
adds r0, r4, 0\n\
mov r1, r10\n\
ands r0, r1\n\
cmp r0, 0\n\
beq _0804BAB2\n\
ldr r0, =gBattlescriptCurrInstr\n\
ldr r0, [r0]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x8\n\
ands r0, r1\n\
cmp r0, 0\n\
beq _0804BA58\n\
ldr r0, =gActiveBattler\n\
ldrb r1, [r0]\n\
movs r0, 0x58\n\
muls r0, r1\n\
adds r0, r7, r0\n\
b _0804BAA0\n\
.pool\n\
_0804BA58:\n\
ldr r6, =gActiveBattler\n\
ldrb r0, [r6]\n\
str r3, [sp]\n\
bl GetBattlerPosition\n\
mov r1, r10\n\
ands r1, r0\n\
lsls r0, r1, 1\n\
adds r0, r1\n\
lsls r0, 2\n\
ldr r1, =gSideTimers\n\
adds r0, r1\n\
ldrb r0, [r0, 0x4]\n\
ldr r3, [sp]\n\
cmp r0, 0\n\
bne _0804BAB2\n\
ldr r0, =gBattleMons\n\
ldrb r2, [r6]\n\
movs r1, 0x58\n\
muls r2, r1\n\
adds r0, r2, r0\n\
adds r0, 0x20\n\
ldrb r0, [r0]\n\
cmp r0, 0x1D\n\
beq _0804BAB2\n\
cmp r0, 0x49\n\
beq _0804BAB2\n\
cmp r0, 0x33\n\
bne _0804BA96\n\
cmp r7, 0x6\n\
beq _0804BAB2\n\
_0804BA96:\n\
cmp r0, 0x34\n\
bne _0804BA9E\n\
cmp r7, 0x1\n\
beq _0804BAB2\n\
_0804BA9E:\n\
adds r0, r7, r2\n\
_0804BAA0:\n\
add r0, r9\n\
ldrb r0, [r0]\n\
lsls r0, 24\n\
asrs r0, 24\n\
cmp r0, 0\n\
ble _0804BAB2\n\
lsrs r0, r5, 16\n\
mov r8, r0\n\
adds r3, 0x1\n\
_0804BAB2:\n\
lsrs r4, 1\n\
movs r1, 0x80\n\
lsls r1, 9\n\
adds r5, r1\n\
adds r7, 0x1\n\
cmp r4, 0\n\
bne _0804BA26\n\
_0804BAC0:\n\
ldr r0, =gBattlescriptCurrInstr\n\
mov r9, r0\n\
cmp r3, 0x1\n\
ble _0804BB4E\n\
ldr r0, [r0]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x2\n\
ands r0, r1\n\
movs r1, 0x39\n\
mov r8, r1\n\
cmp r0, 0\n\
beq _0804BB4E\n\
movs r0, 0x3A\n\
b _0804BB4C\n\
.pool\n\
_0804BAEC:\n\
movs r0, 0x2\n\
ands r0, r1\n\
movs r1, 0xE\n\
cmp r0, 0\n\
beq _0804BAF8\n\
movs r1, 0x26\n\
_0804BAF8:\n\
mov r9, r5\n\
cmp r4, 0\n\
beq _0804BB34\n\
ldr r6, =gBattleMons + 0x18\n\
adds r5, r2, 0\n\
lsls r2, r1, 16\n\
_0804BB04:\n\
movs r0, 0x1\n\
ands r0, r4\n\
cmp r0, 0\n\
beq _0804BB26\n\
ldrb r1, [r5]\n\
movs r0, 0x58\n\
muls r0, r1\n\
adds r0, r7, r0\n\
adds r0, r6\n\
ldrb r0, [r0]\n\
lsls r0, 24\n\
asrs r0, 24\n\
cmp r0, 0xB\n\
bgt _0804BB26\n\
lsrs r1, r2, 16\n\
mov r8, r1\n\
adds r3, 0x1\n\
_0804BB26:\n\
lsrs r4, 1\n\
movs r0, 0x80\n\
lsls r0, 9\n\
adds r2, r0\n\
adds r7, 0x1\n\
cmp r4, 0\n\
bne _0804BB04\n\
_0804BB34:\n\
cmp r3, 0x1\n\
ble _0804BB4E\n\
mov r1, r9\n\
ldr r0, [r1]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x2\n\
ands r0, r1\n\
movs r1, 0x37\n\
mov r8, r1\n\
cmp r0, 0\n\
beq _0804BB4E\n\
movs r0, 0x38\n\
_0804BB4C:\n\
mov r8, r0\n\
_0804BB4E:\n\
mov r1, r9\n\
ldr r2, [r1]\n\
ldrb r1, [r2, 0x3]\n\
movs r0, 0x4\n\
ands r0, r1\n\
cmp r0, 0\n\
beq _0804BB6C\n\
cmp r3, 0x1\n\
bgt _0804BB6C\n\
adds r0, r2, 0x4\n\
mov r1, r9\n\
b _0804BBBA\n\
.pool\n\
_0804BB6C:\n\
cmp r3, 0\n\
beq _0804BBB4\n\
ldr r4, =gBattleScripting\n\
ldrb r0, [r4, 0x1B]\n\
cmp r0, 0\n\
bne _0804BBB4\n\
movs r0, 0\n\
movs r1, 0x1\n\
mov r2, r8\n\
str r3, [sp]\n\
bl BtlController_EmitBattleAnimation\n\
ldr r0, =gActiveBattler\n\
ldrb r0, [r0]\n\
bl MarkBattlerForControllerExec\n\
ldr r0, =gBattlescriptCurrInstr\n\
ldr r0, [r0]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x4\n\
ands r0, r1\n\
ldr r3, [sp]\n\
cmp r0, 0\n\
beq _0804BBA4\n\
cmp r3, 0x1\n\
ble _0804BBA4\n\
movs r0, 0x1\n\
strb r0, [r4, 0x1B]\n\
_0804BBA4:\n\
ldr r1, =gBattlescriptCurrInstr\n\
b _0804BBB6\n\
.pool\n\
_0804BBB4:\n\
mov r1, r9\n\
_0804BBB6:\n\
ldr r0, [r1]\n\
adds r0, 0x4\n\
_0804BBBA:\n\
str r0, [r1]\n\
add sp, 0x4\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.syntax divided");
}
#endif // NONMATCHING
#define ATK49_LAST_CASE 17 #define ATK49_LAST_CASE 17
@@ -5271,10 +5024,9 @@ static void atk4E_switchinanim(void)
static void atk4F_jumpifcantswitch(void) static void atk4F_jumpifcantswitch(void)
{ {
s32 val = 0; s32 i;
s32 compareVar = 0; s32 lastMonId;
struct Pokemon *party = NULL; struct Pokemon *party;
s32 r7 = 0;
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(ATK4F_DONT_CHECK_STATUSES)); gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(ATK4F_DONT_CHECK_STATUSES));
@@ -5294,20 +5046,20 @@ static void atk4F_jumpifcantswitch(void)
else else
party = gPlayerParty; party = gPlayerParty;
val = 0; i = 0;
if (2 & gActiveBattler) if (gActiveBattler & 2)
val = 3; i = 3;
for (compareVar = val + 3; val < compareVar; val++) for (lastMonId = i + 3; i < lastMonId; i++)
{ {
if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[val], MON_DATA_IS_EGG) && !GetMonData(&party[i], MON_DATA_IS_EGG)
&& GetMonData(&party[val], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_HP) != 0
&& gBattlerPartyIndexes[gActiveBattler] != val) && gBattlerPartyIndexes[gActiveBattler] != i)
break; break;
} }
if (val == compareVar) if (i == lastMonId)
gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
else else
gBattlescriptCurrInstr += 6; gBattlescriptCurrInstr += 6;
@@ -5320,18 +5072,18 @@ static void atk4F_jumpifcantswitch(void)
{ {
party = gPlayerParty; party = gPlayerParty;
val = 0; i = 0;
if (sub_806D82C(GetBattlerMultiplayerId(gActiveBattler)) == TRUE) if (sub_806D82C(GetBattlerMultiplayerId(gActiveBattler)) == TRUE)
val = 3; i = 3;
} }
else else
{ {
party = gEnemyParty; party = gEnemyParty;
if (gActiveBattler == 1) if (gActiveBattler == 1)
val = 0; i = 0;
else else
val = 3; i = 3;
} }
} }
else else
@@ -5341,22 +5093,21 @@ static void atk4F_jumpifcantswitch(void)
else else
party = gPlayerParty; party = gPlayerParty;
i = 0;
val = 0;
if (sub_806D82C(GetBattlerMultiplayerId(gActiveBattler)) == TRUE) if (sub_806D82C(GetBattlerMultiplayerId(gActiveBattler)) == TRUE)
val = 3; i = 3;
} }
for (compareVar = val + 3; val < compareVar; val++) for (lastMonId = i + 3; i < lastMonId; i++)
{ {
if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[val], MON_DATA_IS_EGG) && !GetMonData(&party[i], MON_DATA_IS_EGG)
&& GetMonData(&party[val], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_HP) != 0
&& gBattlerPartyIndexes[gActiveBattler] != val) && gBattlerPartyIndexes[gActiveBattler] != i)
break; break;
} }
if (val == compareVar) if (i == lastMonId)
gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
else else
gBattlescriptCurrInstr += 6; gBattlescriptCurrInstr += 6;
@@ -5365,58 +5116,61 @@ static void atk4F_jumpifcantswitch(void)
{ {
party = gEnemyParty; party = gEnemyParty;
val = 0; i = 0;
if (gActiveBattler == 3) if (gActiveBattler == B_POSITION_OPPONENT_RIGHT)
val = 3; i = 3;
for (compareVar = val + 3; val < compareVar; val++) for (lastMonId = i + 3; i < lastMonId; i++)
{ {
if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[val], MON_DATA_IS_EGG) && !GetMonData(&party[i], MON_DATA_IS_EGG)
&& GetMonData(&party[val], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_HP) != 0
&& gBattlerPartyIndexes[gActiveBattler] != val) && gBattlerPartyIndexes[gActiveBattler] != i)
break; break;
} }
if (val == compareVar) if (i == lastMonId)
gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
else else
gBattlescriptCurrInstr += 6; gBattlescriptCurrInstr += 6;
} }
else else
{ {
u8 battlerIn1, battlerIn2;
if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)
{ {
r7 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
compareVar = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
else else
compareVar = r7; battlerIn2 = battlerIn1;
party = gEnemyParty; party = gEnemyParty;
} }
else else
{ {
r7 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); battlerIn1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
compareVar = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); battlerIn2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
else else
compareVar = r7; battlerIn2 = battlerIn1;
party = gPlayerParty; party = gPlayerParty;
} }
for (val = 0; val < 6; val++)
for (i = 0; i < PARTY_SIZE; i++)
{ {
if (GetMonData(&party[val], MON_DATA_HP) != 0 if (GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[val], MON_DATA_IS_EGG) && !GetMonData(&party[i], MON_DATA_IS_EGG)
&& val != gBattlerPartyIndexes[r7] && val != gBattlerPartyIndexes[compareVar]) && i != gBattlerPartyIndexes[battlerIn1] && i != gBattlerPartyIndexes[battlerIn2])
break; break;
} }
if (val == 6) if (i == 6)
gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2); gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
else else
gBattlescriptCurrInstr += 6; gBattlescriptCurrInstr += 6;
+3 -81
View File
@@ -606,7 +606,6 @@ u8 sub_818E06C(void)
} }
} }
#ifdef NONMATCHING
static u8 sub_818E13C(void) static u8 sub_818E13C(void)
{ {
u8 retval; u8 retval;
@@ -627,9 +626,11 @@ static u8 sub_818E13C(void)
len = sub_818E258(gUnknown_0203CD68->playerName); len = sub_818E258(gUnknown_0203CD68->playerName);
if (len == sub_818E258(gSaveBlock2Ptr->playerName)) if (len == sub_818E258(gSaveBlock2Ptr->playerName))
{ {
u8 *name = gUnknown_0203CD68->playerName;
for (i = 0; i < len; i ++) for (i = 0; i < len; i ++)
{ {
if (gUnknown_0203CD68->playerName[i] != gSaveBlock2Ptr->playerName[i]) name = gUnknown_0203CD68->playerName;
if (name[i] != gSaveBlock2Ptr->playerName[i])
{ {
retval = 2; retval = 2;
break; break;
@@ -640,85 +641,6 @@ static u8 sub_818E13C(void)
} }
return retval; return retval;
} }
#else
ASM_DIRECT static u8 sub_818E13C(void)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tmovs r7, 0x1\n"
"\tldr r5, =gUnknown_0203CD68\n"
"\tldr r0, =gSaveBlock1Ptr\n"
"\tldr r1, [r0]\n"
"\tldr r2, =0x00003b58\n"
"\tadds r0, r1, r2\n"
"\tstr r0, [r5]\n"
"\tldrb r0, [r0, 0x18]\n"
"\tcmp r0, 0xFF\n"
"\tbne _0818E174\n"
"\tldr r0, =gStringVar1\n"
"\tldr r1, =gText_Lady2\n"
"\tbl StringCopy7\n"
"\tmovs r7, 0\n"
"\tb _0818E1DC\n"
"\t.pool\n"
"_0818E174:\n"
"\tldr r4, =gStringVar1\n"
"\tldr r0, =0x00003b70\n"
"\tadds r1, r0\n"
"\tadds r0, r4, 0\n"
"\tbl StringCopy7\n"
"\tldr r0, [r5]\n"
"\tadds r0, 0x2D\n"
"\tldrb r1, [r0]\n"
"\tadds r0, r4, 0\n"
"\tbl ConvertInternationalString\n"
"\tldr r0, [r5]\n"
"\tadds r0, 0x18\n"
"\tbl sub_818E258\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tldr r6, =gSaveBlock2Ptr\n"
"\tldr r0, [r6]\n"
"\tbl sub_818E258\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tcmp r4, r0\n"
"\tbne _0818E1DC\n"
"\tldr r0, [r5]\n"
"\tmovs r2, 0\n"
"\tcmp r2, r4\n"
"\tbcs _0818E1DC\n"
"\tldr r1, [r6]\n"
"\tldrb r0, [r0, 0x18]\n"
"\tldrb r1, [r1]\n"
"\tcmp r0, r1\n"
"\tbne _0818E1DA\n"
"_0818E1BA:\n"
"\tadds r0, r2, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r2, r0, 24\n"
"\tcmp r2, r4\n"
"\tbcs _0818E1DC\n"
"\tldr r0, =gUnknown_0203CD68\n"
"\tldr r1, [r0]\n"
"\tadds r1, 0x18\n"
"\tadds r1, r2\n"
"\tldr r0, =gSaveBlock2Ptr\n"
"\tldr r0, [r0]\n"
"\tadds r0, r2\n"
"\tldrb r1, [r1]\n"
"\tldrb r0, [r0]\n"
"\tcmp r1, r0\n"
"\tbeq _0818E1BA\n"
"_0818E1DA:\n"
"\tmovs r7, 0x2\n"
"_0818E1DC:\n"
"\tadds r0, r7, 0\n"
"\tpop {r4-r7}\n"
"\tpop {r1}\n"
"\tbx r1\n"
"\t.pool");
}
#endif
static u8 sub_818E1F4(void) static u8 sub_818E1F4(void)
{ {