diff options
Diffstat (limited to 'src/battle_ai.c')
-rw-r--r-- | src/battle_ai.c | 572 |
1 files changed, 426 insertions, 146 deletions
diff --git a/src/battle_ai.c b/src/battle_ai.c index 4727b2eb0..ca767a3a3 100644 --- a/src/battle_ai.c +++ b/src/battle_ai.c @@ -6,13 +6,14 @@ #include "abilities.h" #include "species.h" #include "item.h" +#include "battle_move_effects.h" #define AIScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) #define AIScriptRead16(ptr) ((ptr)[0] | (ptr)[1] << 8) #define AIScriptRead8(ptr) ((ptr)[0]) #define AIScriptReadPtr(ptr) (u8*) AIScriptRead32(ptr) -#define AI_THINKING_STRUCT ((struct AI_ThinkingStruct *)(&battle_2000000 + 0x16800)) +#define AI_THINKING_STRUCT ((struct AI_ThinkingStruct *)((u8 *)&battle_2000000 + 0x16800)) #define AI_ARRAY_160CC ((&battle_2000000 + 0x160CC)) extern void sub_801CAF8(u8, u8); @@ -31,11 +32,11 @@ extern u16 gBattleWeather; extern u8 gUnknown_02024A60; extern u8 gUnknown_02024A6A[][2]; extern u16 gUnknown_02024BE6; -extern int gUnknown_02024BEC; +extern int gBattleMoveDamage; extern u8 gUnknown_02024C07; // something player? extern u8 gUnknown_02024C08; // something opponent? extern u8 gUnknown_02024C0C; -extern u8 gUnknown_02024C68; +extern u8 gBattleMoveFlags; extern u16 gUnknown_02024DEC; extern u16 gUnknown_02024C34[]; extern u32 gUnknown_02024ACC[]; @@ -51,7 +52,6 @@ extern u8 *BattleAIs[]; extern struct Trainer gTrainers[]; extern struct BattleMove gBattleMoves[]; extern struct BaseStats gBaseStats[]; -extern void (*gBattleAICmdTable[])(void); // needed to match the hack that is get_item, thanks cam, someone else clean this up later. extern u8 unk_2000000[]; @@ -100,6 +100,221 @@ extern struct UnknownStruct1 unk_2016A00; extern struct UnknownStruct3 unk_2016C00; extern struct UnknownStruct4 gUnknown_02024CA8[]; +static void BattleAICmd_if_random(void); +static void BattleAICmd_if_not_random(void); +static void BattleAICmd_if_random_1(void); +static void BattleAICmd_if_not_random_1(void); +static void BattleAICmd_score(void); +static void BattleAICmd_if_hp_less_than(void); +static void BattleAICmd_if_hp_more_than(void); +static void BattleAICmd_if_hp_equal(void); +static void BattleAICmd_if_hp_not_equal(void); +static void BattleAICmd_if_status(void); +static void BattleAICmd_if_not_status(void); +static void BattleAICmd_if_status2(void); +static void BattleAICmd_if_not_status2(void); +static void BattleAICmd_if_status3(void); +static void BattleAICmd_if_not_status3(void); +static void BattleAICmd_if_status4(void); +static void BattleAICmd_if_not_status4(void); +static void BattleAICmd_if_less_than(void); +static void BattleAICmd_if_more_than(void); +static void BattleAICmd_if_equal(void); +static void BattleAICmd_if_not_equal(void); +static void BattleAICmd_if_less_than_32(void); +static void BattleAICmd_if_more_than_32(void); +static void BattleAICmd_if_equal_32(void); +static void BattleAICmd_if_not_equal_32(void); +static void BattleAICmd_if_move(void); +static void BattleAICmd_if_not_move(void); +static void BattleAICmd_if_in_bytes(void); +static void BattleAICmd_if_not_in_bytes(void); +static void BattleAICmd_if_in_words(void); +static void BattleAICmd_if_not_in_words(void); +static void BattleAICmd_if_user_can_damage(void); +static void BattleAICmd_if_user_cant_damage(void); +static void BattleAICmd_unk_21(void); +static void BattleAICmd_get_type(void); +static void BattleAICmd_unk_23(void); +static void BattleAICmd_unk_24(void); +static void BattleAICmd_get_move(void); +static void BattleAICmd_if_type(void); +static void BattleAICmd_unk_27(void); +static void BattleAICmd_if_would_go_first(void); +static void BattleAICmd_if_would_not_go_first(void); +static void BattleAICmd_unk_2A(void); +static void BattleAICmd_unk_2B(void); +static void BattleAICmd_count_alive_pokemon(void); +static void BattleAICmd_unk_2D(void); +static void BattleAICmd_unk_2E(void); +static void BattleAICmd_get_ability(void); +static void BattleAICmd_unk_30(void); +static void BattleAICmd_if_damage_bonus(void); +static void BattleAICmd_unk_32(void); +static void BattleAICmd_unk_33(void); +static void BattleAICmd_if_status_in_party(void); +static void BattleAICmd_if_status_not_in_party(void); +static void BattleAICmd_unk_36(void); +static void BattleAICmd_if_effect(void); +static void BattleAICmd_if_not_effect(void); +static void BattleAICmd_if_stat_level_less_than(void); +static void BattleAICmd_if_stat_level_more_than(void); +static void BattleAICmd_if_stat_level_equal(void); +static void BattleAICmd_if_stat_level_not_equal(void); +static void BattleAICmd_if_can_faint(void); +static void BattleAICmd_if_cant_faint(void); +static void BattleAICmd_unk_3F(void); +static void BattleAICmd_unk_40(void); +static void BattleAICmd_if_move_effect(void); +static void BattleAICmd_if_not_move_effect(void); +static void BattleAICmd_if_last_move_did_damage(void); +static void BattleAICmd_if_encored(void); +static void BattleAICmd_unk_45(void); +static void BattleAICmd_if_random_2(void); +static void BattleAICmd_unk_47(void); +static void BattleAICmd_get_hold_effect(void); +static void BattleAICmd_get_gender(void); +static void BattleAICmd_is_first_turn(void); +static void BattleAICmd_get_stockpile_count(void); +static void BattleAICmd_unk_4C(void); +static void BattleAICmd_get_item(void); +static void BattleAICmd_unk_4E(void); +static void BattleAICmd_unk_4F(void); +static void BattleAICmd_unk_50(void); +static void BattleAICmd_get_protect_count(void); +static void BattleAICmd_unk_52(void); +static void BattleAICmd_unk_53(void); +static void BattleAICmd_unk_54(void); +static void BattleAICmd_unk_55(void); +static void BattleAICmd_unk_56(void); +static void BattleAICmd_unk_57(void); +static void BattleAICmd_call(void); +static void BattleAICmd_jump(void); +static void BattleAICmd_unk_5A(void); +static void BattleAICmd_if_level_cond(void); +static void BattleAICmd_if_taunted(void); +static void BattleAICmd_if_not_taunted(void); + +typedef void (*BattleAICmdFunc)(void); + +static const BattleAICmdFunc sBattleAICmdTable[] = +{ + BattleAICmd_if_random, + BattleAICmd_if_not_random, + BattleAICmd_if_random_1, + BattleAICmd_if_not_random_1, + BattleAICmd_score, + BattleAICmd_if_hp_less_than, + BattleAICmd_if_hp_more_than, + BattleAICmd_if_hp_equal, + BattleAICmd_if_hp_not_equal, + BattleAICmd_if_status, + BattleAICmd_if_not_status, + BattleAICmd_if_status2, + BattleAICmd_if_not_status2, + BattleAICmd_if_status3, + BattleAICmd_if_not_status3, + BattleAICmd_if_status4, + BattleAICmd_if_not_status4, + BattleAICmd_if_less_than, + BattleAICmd_if_more_than, + BattleAICmd_if_equal, + BattleAICmd_if_not_equal, + BattleAICmd_if_less_than_32, + BattleAICmd_if_more_than_32, + BattleAICmd_if_equal_32, + BattleAICmd_if_not_equal_32, + BattleAICmd_if_move, + BattleAICmd_if_not_move, + BattleAICmd_if_in_bytes, + BattleAICmd_if_not_in_bytes, + BattleAICmd_if_in_words, + BattleAICmd_if_not_in_words, + BattleAICmd_if_user_can_damage, + BattleAICmd_if_user_cant_damage, + BattleAICmd_unk_21, + BattleAICmd_get_type, + BattleAICmd_unk_23, + BattleAICmd_unk_24, + BattleAICmd_get_move, + BattleAICmd_if_type, + BattleAICmd_unk_27, + BattleAICmd_if_would_go_first, + BattleAICmd_if_would_not_go_first, + BattleAICmd_unk_2A, + BattleAICmd_unk_2B, + BattleAICmd_count_alive_pokemon, + BattleAICmd_unk_2D, + BattleAICmd_unk_2E, + BattleAICmd_get_ability, + BattleAICmd_unk_30, + BattleAICmd_if_damage_bonus, + BattleAICmd_unk_32, + BattleAICmd_unk_33, + BattleAICmd_if_status_in_party, + BattleAICmd_if_status_not_in_party, + BattleAICmd_unk_36, + BattleAICmd_if_effect, + BattleAICmd_if_not_effect, + BattleAICmd_if_stat_level_less_than, + BattleAICmd_if_stat_level_more_than, + BattleAICmd_if_stat_level_equal, + BattleAICmd_if_stat_level_not_equal, + BattleAICmd_if_can_faint, + BattleAICmd_if_cant_faint, + BattleAICmd_unk_3F, + BattleAICmd_unk_40, + BattleAICmd_if_move_effect, + BattleAICmd_if_not_move_effect, + BattleAICmd_if_last_move_did_damage, + BattleAICmd_if_encored, + BattleAICmd_unk_45, + BattleAICmd_if_random_2, + BattleAICmd_unk_47, + BattleAICmd_get_hold_effect, + BattleAICmd_get_gender, + BattleAICmd_is_first_turn, + BattleAICmd_get_stockpile_count, + BattleAICmd_unk_4C, + BattleAICmd_get_item, + BattleAICmd_unk_4E, + BattleAICmd_unk_4F, + BattleAICmd_unk_50, + BattleAICmd_get_protect_count, + BattleAICmd_unk_52, + BattleAICmd_unk_53, + BattleAICmd_unk_54, + BattleAICmd_unk_55, + BattleAICmd_unk_56, + BattleAICmd_unk_57, + BattleAICmd_call, + BattleAICmd_jump, + BattleAICmd_unk_5A, + BattleAICmd_if_level_cond, + BattleAICmd_if_taunted, + BattleAICmd_if_not_taunted, +}; + +#ifdef NONMATCHING +static +#endif +const u16 sDiscouragedPowerfulMoveEffects[] = +{ + EFFECT_EXPLOSION, + EFFECT_DREAM_EATER, + EFFECT_RAZOR_WIND, + EFFECT_SKY_ATTACK, + EFFECT_RECHARGE, + EFFECT_SKULL_BASH, + EFFECT_SOLARBEAM, + EFFECT_SPIT_UP, + EFFECT_FOCUS_PUNCH, + EFFECT_SUPERPOWER, + EFFECT_ERUPTION, + EFFECT_OVERHEAT, + 0xFFFF +}; + void BattleAI_SetupAIData(void); void BattleAI_DoAIProcessing(void); void sub_810745C(void); @@ -248,7 +463,7 @@ void BattleAI_DoAIProcessing(void) break; case 1: if(gAIThinkingSpace.unk2 != 0) - gBattleAICmdTable[*(u8 *)gAIScriptPtr](); // run AI command. + sBattleAICmdTable[*(u8 *)gAIScriptPtr](); // run AI command. else { gAIThinkingSpace.score[gAIThinkingSpace.moveConsidered] = 0; @@ -303,7 +518,7 @@ void sub_81074F8(u8 a, u8 b) unk_2016A00.unk22[battle_get_per_side_status(a) & 1] = b; } -void BattleAICmd_if_random(void) +static void BattleAICmd_if_random(void) { u16 random = Random(); @@ -313,7 +528,7 @@ void BattleAICmd_if_random(void) gAIScriptPtr += 6; } -void BattleAICmd_if_not_random(void) +static void BattleAICmd_if_not_random(void) { u16 random = Random(); @@ -323,7 +538,7 @@ void BattleAICmd_if_not_random(void) gAIScriptPtr += 6; } -void BattleAICmd_if_random_1(void) // if RNG Value equal to +static void BattleAICmd_if_random_1(void) // if RNG Value equal to { u16 random = Random(); @@ -333,7 +548,7 @@ void BattleAICmd_if_random_1(void) // if RNG Value equal to gAIScriptPtr += 6; } -void BattleAICmd_if_not_random_1(void) // if RNG value not equal to +static void BattleAICmd_if_not_random_1(void) // if RNG value not equal to { u16 random = Random(); @@ -343,7 +558,7 @@ void BattleAICmd_if_not_random_1(void) // if RNG value not equal to gAIScriptPtr += 6; } -void BattleAICmd_score(void) +static void BattleAICmd_score(void) { gAIThinkingSpace.score[gAIThinkingSpace.moveConsidered] += gAIScriptPtr[1]; // add the result to the array of the move consider's score. @@ -353,7 +568,7 @@ void BattleAICmd_score(void) gAIScriptPtr += 2; // AI return. } -void BattleAICmd_if_hp_less_than(void) +static void BattleAICmd_if_hp_less_than(void) { u16 var; @@ -368,7 +583,7 @@ void BattleAICmd_if_hp_less_than(void) gAIScriptPtr += 7; } -void BattleAICmd_if_hp_more_than(void) +static void BattleAICmd_if_hp_more_than(void) { u16 var; @@ -383,7 +598,7 @@ void BattleAICmd_if_hp_more_than(void) gAIScriptPtr += 7; } -void BattleAICmd_if_hp_equal(void) +static void BattleAICmd_if_hp_equal(void) { u16 var; @@ -398,7 +613,7 @@ void BattleAICmd_if_hp_equal(void) gAIScriptPtr += 7; } -void BattleAICmd_if_hp_not_equal(void) +static void BattleAICmd_if_hp_not_equal(void) { u16 var; @@ -413,7 +628,7 @@ void BattleAICmd_if_hp_not_equal(void) gAIScriptPtr += 7; } -void BattleAICmd_if_status(void) +static void BattleAICmd_if_status(void) { u16 var; u32 temp; @@ -431,7 +646,7 @@ void BattleAICmd_if_status(void) gAIScriptPtr += 10; } -void BattleAICmd_if_not_status(void) +static void BattleAICmd_if_not_status(void) { u16 var; u32 temp; @@ -449,7 +664,7 @@ void BattleAICmd_if_not_status(void) gAIScriptPtr += 10; } -void BattleAICmd_if_status2(void) +static void BattleAICmd_if_status2(void) { u8 var; u32 temp; @@ -467,7 +682,7 @@ void BattleAICmd_if_status2(void) gAIScriptPtr += 10; } -void BattleAICmd_if_not_status2(void) +static void BattleAICmd_if_not_status2(void) { u8 var; u32 temp; @@ -485,7 +700,7 @@ void BattleAICmd_if_not_status2(void) gAIScriptPtr += 10; } -void BattleAICmd_if_status3(void) +static void BattleAICmd_if_status3(void) { u8 var; u32 temp; @@ -503,7 +718,7 @@ void BattleAICmd_if_status3(void) gAIScriptPtr += 10; } -void BattleAICmd_if_not_status3(void) +static void BattleAICmd_if_not_status3(void) { u8 var; u32 temp; @@ -521,7 +736,7 @@ void BattleAICmd_if_not_status3(void) gAIScriptPtr += 10; } -void BattleAICmd_if_status4(void) +static void BattleAICmd_if_status4(void) { u8 var; u32 temp; @@ -541,7 +756,7 @@ void BattleAICmd_if_status4(void) gAIScriptPtr += 10; } -void BattleAICmd_if_not_status4(void) +static void BattleAICmd_if_not_status4(void) { u8 var; u32 temp; @@ -561,7 +776,7 @@ void BattleAICmd_if_not_status4(void) gAIScriptPtr += 10; } -void BattleAICmd_if_less_than(void) +static void BattleAICmd_if_less_than(void) { if (gAIThinkingSpace.funcResult < gAIScriptPtr[1]) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -569,7 +784,7 @@ void BattleAICmd_if_less_than(void) gAIScriptPtr += 6; } -void BattleAICmd_if_more_than(void) +static void BattleAICmd_if_more_than(void) { if (gAIThinkingSpace.funcResult > gAIScriptPtr[1]) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -577,7 +792,7 @@ void BattleAICmd_if_more_than(void) gAIScriptPtr += 6; } -void BattleAICmd_if_equal(void) +static void BattleAICmd_if_equal(void) { if (gAIThinkingSpace.funcResult == gAIScriptPtr[1]) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -585,7 +800,7 @@ void BattleAICmd_if_equal(void) gAIScriptPtr += 6; } -void BattleAICmd_if_not_equal(void) +static void BattleAICmd_if_not_equal(void) { if (gAIThinkingSpace.funcResult != gAIScriptPtr[1]) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -593,7 +808,7 @@ void BattleAICmd_if_not_equal(void) gAIScriptPtr += 6; } -void BattleAICmd_if_less_than_32(void) +static void BattleAICmd_if_less_than_32(void) { u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); @@ -603,7 +818,7 @@ void BattleAICmd_if_less_than_32(void) gAIScriptPtr += 9; } -void BattleAICmd_if_more_than_32(void) +static void BattleAICmd_if_more_than_32(void) { u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); @@ -613,7 +828,7 @@ void BattleAICmd_if_more_than_32(void) gAIScriptPtr += 9; } -void BattleAICmd_if_equal_32(void) +static void BattleAICmd_if_equal_32(void) { u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); @@ -623,7 +838,7 @@ void BattleAICmd_if_equal_32(void) gAIScriptPtr += 9; } -void BattleAICmd_if_not_equal_32(void) +static void BattleAICmd_if_not_equal_32(void) { u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1); @@ -633,7 +848,7 @@ void BattleAICmd_if_not_equal_32(void) gAIScriptPtr += 9; } -void BattleAICmd_if_move(void) +static void BattleAICmd_if_move(void) { u16 move = AIScriptRead16(gAIScriptPtr + 1); @@ -643,7 +858,7 @@ void BattleAICmd_if_move(void) gAIScriptPtr += 7; } -void BattleAICmd_if_not_move(void) +static void BattleAICmd_if_not_move(void) { u16 move = AIScriptRead16(gAIScriptPtr + 1); @@ -653,7 +868,7 @@ void BattleAICmd_if_not_move(void) gAIScriptPtr += 7; } -void BattleAICmd_if_in_bytes(void) +static void BattleAICmd_if_in_bytes(void) { u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1); @@ -669,7 +884,7 @@ void BattleAICmd_if_in_bytes(void) gAIScriptPtr += 9; } -void BattleAICmd_if_not_in_bytes(void) +static void BattleAICmd_if_not_in_bytes(void) { u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1); @@ -685,7 +900,7 @@ void BattleAICmd_if_not_in_bytes(void) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); } -void BattleAICmd_if_in_words(void) +static void BattleAICmd_if_in_words(void) { u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1); @@ -701,7 +916,7 @@ void BattleAICmd_if_in_words(void) gAIScriptPtr += 9; } -void BattleAICmd_if_not_in_words(void) +static void BattleAICmd_if_not_in_words(void) { u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1); @@ -717,7 +932,7 @@ void BattleAICmd_if_not_in_words(void) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5); } -void BattleAICmd_if_user_can_damage(void) +static void BattleAICmd_if_user_can_damage(void) { s32 i; @@ -733,7 +948,7 @@ void BattleAICmd_if_user_can_damage(void) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); } -void BattleAICmd_if_user_cant_damage(void) +static void BattleAICmd_if_user_cant_damage(void) { s32 i; @@ -749,13 +964,13 @@ void BattleAICmd_if_user_cant_damage(void) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); } -void BattleAICmd_unk_21(void) +static void BattleAICmd_unk_21(void) { gAIThinkingSpace.funcResult = gUnknown_030042E0[19]; gAIScriptPtr += 1; } -void BattleAICmd_get_type(void) +static void BattleAICmd_get_type(void) { u8 typeVar = gAIScriptPtr[1]; @@ -780,14 +995,78 @@ void BattleAICmd_get_type(void) gAIScriptPtr += 2; } -void BattleAICmd_unk_23(void) +static void BattleAICmd_unk_23(void) { gAIThinkingSpace.funcResult = gBattleMoves[gAIThinkingSpace.unk2].power; gAIScriptPtr += 1; } +#ifdef NONMATCHING +static void BattleAICmd_unk_24(void) +{ + int i, j; + s32 damage; + s32 damages[4]; + + for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) + if (gBattleMoves[AI_THINKING_STRUCT->unk2].effect == sDiscouragedPowerfulMoveEffects[i]) + break; + + if (gBattleMoves[AI_THINKING_STRUCT->unk2].power > 1 + && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) + { + gUnknown_02024DEC = 0; + *((u8 *)&battle_2000000 + 0x1601C) = 0; + *((u8 *)&battle_2000000 + 0x1601F) = 1; + gBattleMoveFlags = 0; + gCritMultiplier = 1; + + for (i = 0; i < 4; i++) + { + for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++) + { + if (gBattleMoves[gBattleMons[gUnknown_02024C07].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j]) + break; + } + + if (gBattleMons[gUnknown_02024C07].moves[i] + && sDiscouragedPowerfulMoveEffects[j] == 0xFFFF + && gBattleMoves[gBattleMons[gUnknown_02024C07].moves[i]].power > 1) + { + gUnknown_02024BE6 = gBattleMons[gUnknown_02024C07].moves[i]; + sub_801CAF8(gUnknown_02024C07, gUnknown_02024C08); + move_effectiveness_something(gUnknown_02024BE6, gUnknown_02024C07, gUnknown_02024C08); + damage = (gBattleMoveDamage * AI_THINKING_STRUCT->unk18[i]) / 100; + damages[i] = damage; + if (!damage) + damages[i] = 1; + } + else + { + damages[i] = 0; + } + } + + for (i = 0; i < 4; i++) + if (damages[i] > damages[AI_THINKING_STRUCT->moveConsidered]) + break; + + if (i == 4) + AI_THINKING_STRUCT->funcResult = 2; + else + AI_THINKING_STRUCT->funcResult = 1; + } + else + { + AI_THINKING_STRUCT->funcResult = 0; + gAIScriptPtr += 1; + } + + gAIScriptPtr += 1; +} +#else __attribute__((naked)) -void BattleAICmd_unk_24(void) +static void BattleAICmd_unk_24(void) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -797,7 +1076,7 @@ void BattleAICmd_unk_24(void) push {r5-r7}\n\ sub sp, 0x14\n\ movs r3, 0\n\ - ldr r0, _08108328 @ =gUnknown_083F62BC\n\ + ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ ldrh r1, [r0]\n\ ldr r4, _0810832C @ =0x0000ffff\n\ ldr r6, _08108330 @ =gBattleMoves\n\ @@ -810,7 +1089,7 @@ void BattleAICmd_unk_24(void) lsls r0, 2\n\ adds r0, r6\n\ ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =gUnknown_083F62BC\n\ + ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ _0810821E:\n\ ldrh r0, [r1]\n\ cmp r2, r0\n\ @@ -832,7 +1111,7 @@ _0810822E:\n\ b _081083B2\n\ _08108240:\n\ lsls r0, r3, 1\n\ - ldr r1, _08108328 @ =gUnknown_083F62BC\n\ + ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ adds r0, r1\n\ ldrh r3, [r0]\n\ ldr r0, _0810832C @ =0x0000ffff\n\ @@ -850,13 +1129,13 @@ _08108250:\n\ adds r0, r5, r2\n\ movs r2, 0x1\n\ strb r2, [r0]\n\ - ldr r0, _08108340 @ =gUnknown_02024C68\n\ + ldr r0, _08108340 @ =gBattleMoveFlags\n\ strb r1, [r0]\n\ ldr r0, _08108344 @ =gCritMultiplier\n\ strb r2, [r0]\n\ movs r6, 0\n\ mov r9, r3\n\ - ldr r0, _08108328 @ =gUnknown_083F62BC\n\ + ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ ldrh r0, [r0]\n\ str r0, [sp, 0x10]\n\ _08108276:\n\ @@ -885,7 +1164,7 @@ _08108276:\n\ lsls r0, 2\n\ adds r0, r2\n\ ldrb r2, [r0]\n\ - ldr r1, _08108328 @ =gUnknown_083F62BC\n\ + ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ _081082AA:\n\ ldrh r0, [r1]\n\ cmp r2, r0\n\ @@ -907,7 +1186,7 @@ _081082BA:\n\ cmp r0, 0\n\ beq _0810835C\n\ lsls r0, r3, 1\n\ - ldr r2, _08108328 @ =gUnknown_083F62BC\n\ + ldr r2, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\ adds r0, r2\n\ ldrh r0, [r0]\n\ cmp r0, r9\n\ @@ -933,7 +1212,7 @@ _081082BA:\n\ bl move_effectiveness_something\n\ mov r4, sp\n\ add r4, r8\n\ - ldr r2, _08108358 @ =gUnknown_02024BEC\n\ + ldr r2, _08108358 @ =gBattleMoveDamage\n\ ldr r0, _08108334 @ =0x02016800\n\ adds r0, 0x18\n\ adds r0, r6, r0\n\ @@ -949,19 +1228,19 @@ _081082BA:\n\ str r0, [r4]\n\ b _08108364\n\ .align 2, 0\n\ -_08108328: .4byte gUnknown_083F62BC\n\ +_08108328: .4byte sDiscouragedPowerfulMoveEffects\n\ _0810832C: .4byte 0x0000ffff\n\ _08108330: .4byte gBattleMoves\n\ _08108334: .4byte 0x02016800\n\ _08108338: .4byte gUnknown_02024DEC\n\ _0810833C: .4byte 0xfffff81c\n\ -_08108340: .4byte gUnknown_02024C68\n\ +_08108340: .4byte gBattleMoveFlags\n\ _08108344: .4byte gCritMultiplier\n\ _08108348: .4byte gBattleMons\n\ _0810834C: .4byte gUnknown_02024C07\n\ _08108350: .4byte gUnknown_02024BE6\n\ _08108354: .4byte gUnknown_02024C08\n\ -_08108358: .4byte gUnknown_02024BEC\n\ +_08108358: .4byte gBattleMoveDamage\n\ _0810835C:\n\ mov r1, sp\n\ add r1, r8\n\ @@ -1029,8 +1308,9 @@ _081083B8:\n\ _081083D0: .4byte gAIScriptPtr\n\ .syntax divided\n"); } +#endif // NONMATCHING -void BattleAICmd_get_move(void) +static void BattleAICmd_get_move(void) { if (gAIScriptPtr[1] == USER) gAIThinkingSpace.funcResult = gUnknown_02024C34[gUnknown_02024C07]; @@ -1040,7 +1320,7 @@ void BattleAICmd_get_move(void) gAIScriptPtr += 2; } -void BattleAICmd_if_type(void) +static void BattleAICmd_if_type(void) { if ( gAIScriptPtr[1] == gAIThinkingSpace.funcResult ) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -1048,7 +1328,7 @@ void BattleAICmd_if_type(void) gAIScriptPtr += 6; } -void BattleAICmd_unk_27(void) // if_not_type +static void BattleAICmd_unk_27(void) // if_not_type { if ( gAIScriptPtr[1] != gAIThinkingSpace.funcResult ) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -1056,7 +1336,7 @@ void BattleAICmd_unk_27(void) // if_not_type gAIScriptPtr += 6; } -void BattleAICmd_if_would_go_first(void) +static void BattleAICmd_if_would_go_first(void) { if ( b_first_side(gUnknown_02024C07, gUnknown_02024C08, 1) == gAIScriptPtr[1] ) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -1064,7 +1344,7 @@ void BattleAICmd_if_would_go_first(void) gAIScriptPtr += 6; } -void BattleAICmd_if_would_not_go_first(void) +static void BattleAICmd_if_would_not_go_first(void) { if ( b_first_side(gUnknown_02024C07, gUnknown_02024C08, 1) != gAIScriptPtr[1] ) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -1072,13 +1352,13 @@ void BattleAICmd_if_would_not_go_first(void) gAIScriptPtr += 6; } -void BattleAICmd_unk_2A(void) +static void BattleAICmd_unk_2A(void) {} -void BattleAICmd_unk_2B(void) +static void BattleAICmd_unk_2B(void) {} -void BattleAICmd_count_alive_pokemon(void) +static void BattleAICmd_count_alive_pokemon(void) { u8 index; struct Pokemon *party; @@ -1126,19 +1406,19 @@ void BattleAICmd_count_alive_pokemon(void) gAIScriptPtr += 2; } -void BattleAICmd_unk_2D(void) +static void BattleAICmd_unk_2D(void) { gAIThinkingSpace.funcResult = gAIThinkingSpace.unk2; gAIScriptPtr += 1; } -void BattleAICmd_unk_2E(void) +static void BattleAICmd_unk_2E(void) { gAIThinkingSpace.funcResult = gBattleMoves[gAIThinkingSpace.unk2].effect; gAIScriptPtr += 1; } -void BattleAICmd_get_ability(void) +static void BattleAICmd_get_ability(void) { u8 var; @@ -1207,7 +1487,7 @@ void BattleAICmd_get_ability(void) } } -void BattleAICmd_unk_30(void) +static void BattleAICmd_unk_30(void) { s32 i; struct AI_ThinkingStruct *ai; @@ -1216,14 +1496,14 @@ void BattleAICmd_unk_30(void) gUnknown_02024DEC = 0; battle_2000000.unk.unk1 = 0; battle_2000000.unk.unk4 = 1; - gUnknown_02024C68 = 0; + gBattleMoveFlags = 0; gCritMultiplier = 1; ai = &battle_2000000.ai; ai->funcResult = 0; for(i = 0; i < 4; i++) { - gUnknown_02024BEC = 40; + gBattleMoveDamage = 40; gUnknown_02024BE6 = gBattleMons[gUnknown_02024C07].moves[i]; if (gUnknown_02024BE6) @@ -1231,27 +1511,27 @@ void BattleAICmd_unk_30(void) move_effectiveness_something(gUnknown_02024BE6, gUnknown_02024C07, gUnknown_02024C08); // reduce by 1/3. - if (gUnknown_02024BEC == 120) - gUnknown_02024BEC = 80; - if(gUnknown_02024BEC == 240) - gUnknown_02024BEC = 160; - if(gUnknown_02024BEC == 30) - gUnknown_02024BEC = 20; - if(gUnknown_02024BEC == 15) - gUnknown_02024BEC = 10; - - if(gUnknown_02024C68 & 8) - gUnknown_02024BEC = 0; + if (gBattleMoveDamage == 120) + gBattleMoveDamage = 80; + if(gBattleMoveDamage == 240) + gBattleMoveDamage = 160; + if(gBattleMoveDamage == 30) + gBattleMoveDamage = 20; + if(gBattleMoveDamage == 15) + gBattleMoveDamage = 10; + + if(gBattleMoveFlags & 8) + gBattleMoveDamage = 0; ai2 = &battle_2000000.ai; - if (ai2->funcResult < gUnknown_02024BEC) - ai2->funcResult = gUnknown_02024BEC; + if (ai2->funcResult < gBattleMoveDamage) + ai2->funcResult = gBattleMoveDamage; } } gAIScriptPtr += 1; } -void BattleAICmd_if_damage_bonus(void) +static void BattleAICmd_if_damage_bonus(void) { struct AI_ThinkingStruct *ai; u8 damageVar; @@ -1259,41 +1539,41 @@ void BattleAICmd_if_damage_bonus(void) gUnknown_02024DEC = 0; battle_2000000.unk.unk1 = 0; battle_2000000.unk.unk4 = 1; - gUnknown_02024C68 = 0; + gBattleMoveFlags = 0; gCritMultiplier = 1; - gUnknown_02024BEC = 40; + gBattleMoveDamage = 40; gUnknown_02024BE6 = (ai = &battle_2000000.ai)->unk2; move_effectiveness_something(gUnknown_02024BE6, gUnknown_02024C07, gUnknown_02024C08); - if (gUnknown_02024BEC == 120) - gUnknown_02024BEC = 80; - if(gUnknown_02024BEC == 240) - gUnknown_02024BEC = 160; - if(gUnknown_02024BEC == 30) - gUnknown_02024BEC = 20; - if(gUnknown_02024BEC == 15) - gUnknown_02024BEC = 10; + if (gBattleMoveDamage == 120) + gBattleMoveDamage = 80; + if(gBattleMoveDamage == 240) + gBattleMoveDamage = 160; + if(gBattleMoveDamage == 30) + gBattleMoveDamage = 20; + if(gBattleMoveDamage == 15) + gBattleMoveDamage = 10; - if(gUnknown_02024C68 & 8) - gUnknown_02024BEC = 0; + if(gBattleMoveFlags & 8) + gBattleMoveDamage = 0; // i have to store 2024BEC in a local variable before the comparison or else it will not match. - damageVar = gUnknown_02024BEC; + damageVar = gBattleMoveDamage; if(damageVar == gAIScriptPtr[1]) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); else gAIScriptPtr += 6; } -void BattleAICmd_unk_32(void) +static void BattleAICmd_unk_32(void) {} -void BattleAICmd_unk_33(void) +static void BattleAICmd_unk_33(void) {} -void BattleAICmd_if_status_in_party(void) +static void BattleAICmd_if_status_in_party(void) { struct Pokemon *party; int i; @@ -1330,7 +1610,7 @@ void BattleAICmd_if_status_in_party(void) gAIScriptPtr += 10; } -void BattleAICmd_if_status_not_in_party(void) +static void BattleAICmd_if_status_not_in_party(void) { struct Pokemon *party; int i; @@ -1365,7 +1645,7 @@ void BattleAICmd_if_status_not_in_party(void) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); } -void BattleAICmd_unk_36(void) +static void BattleAICmd_unk_36(void) { if(gBattleWeather & 7) gAIThinkingSpace.funcResult = 1; @@ -1379,7 +1659,7 @@ void BattleAICmd_unk_36(void) gAIScriptPtr += 1; } -void BattleAICmd_if_effect(void) +static void BattleAICmd_if_effect(void) { if(gBattleMoves[gAIThinkingSpace.unk2].effect == gAIScriptPtr[1]) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -1387,7 +1667,7 @@ void BattleAICmd_if_effect(void) gAIScriptPtr += 6; } -void BattleAICmd_if_not_effect(void) +static void BattleAICmd_if_not_effect(void) { if(gBattleMoves[gAIThinkingSpace.unk2].effect != gAIScriptPtr[1]) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2); @@ -1395,7 +1675,7 @@ void BattleAICmd_if_not_effect(void) gAIScriptPtr += 6; } -void BattleAICmd_if_stat_level_less_than(void) +static void BattleAICmd_if_stat_level_less_than(void) { u32 party; @@ -1410,7 +1690,7 @@ void BattleAICmd_if_stat_level_less_than(void) gAIScriptPtr += 8; } -void BattleAICmd_if_stat_level_more_than(void) +static void BattleAICmd_if_stat_level_more_than(void) { u32 party; @@ -1425,7 +1705,7 @@ void BattleAICmd_if_stat_level_more_than(void) gAIScriptPtr += 8; } -void BattleAICmd_if_stat_level_equal(void) +static void BattleAICmd_if_stat_level_equal(void) { u32 party; @@ -1440,7 +1720,7 @@ void BattleAICmd_if_stat_level_equal(void) gAIScriptPtr += 8; } -void BattleAICmd_if_stat_level_not_equal(void) +static void BattleAICmd_if_stat_level_not_equal(void) { u32 party; @@ -1455,7 +1735,7 @@ void BattleAICmd_if_stat_level_not_equal(void) gAIScriptPtr += 8; } -void BattleAICmd_if_can_faint(void) +static void BattleAICmd_if_can_faint(void) { if(gBattleMoves[gAIThinkingSpace.unk2].power < 2) { @@ -1465,25 +1745,25 @@ void BattleAICmd_if_can_faint(void) gUnknown_02024DEC = 0; ((struct BattleStruct *)((u8 *)&gAIThinkingSpace - 0x16800))->unk.unk1 = 0; ((struct BattleStruct *)((u8 *)&gAIThinkingSpace - 0x16800))->unk.unk4 = 1; - gUnknown_02024C68 = 0; + gBattleMoveFlags = 0; gCritMultiplier = 1; gUnknown_02024BE6 = gAIThinkingSpace.unk2; sub_801CAF8(gUnknown_02024C07, gUnknown_02024C08); move_effectiveness_something(gUnknown_02024BE6, gUnknown_02024C07, gUnknown_02024C08); - gUnknown_02024BEC = gUnknown_02024BEC * gAIThinkingSpace.unk18[gAIThinkingSpace.moveConsidered] / 100; + gBattleMoveDamage = gBattleMoveDamage * gAIThinkingSpace.unk18[gAIThinkingSpace.moveConsidered] / 100; // moves always do at least 1 damage. - if(gUnknown_02024BEC == 0) - gUnknown_02024BEC = 1; + if(gBattleMoveDamage == 0) + gBattleMoveDamage = 1; - if(gBattleMons[gUnknown_02024C08].hp <= gUnknown_02024BEC) + if(gBattleMons[gUnknown_02024C08].hp <= gBattleMoveDamage) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); else gAIScriptPtr += 5; } -void BattleAICmd_if_cant_faint(void) +static void BattleAICmd_if_cant_faint(void) { if(gBattleMoves[gAIThinkingSpace.unk2].power < 2) { @@ -1494,23 +1774,23 @@ void BattleAICmd_if_cant_faint(void) gUnknown_02024DEC = 0; ((struct BattleStruct *)((u8 *)&gAIThinkingSpace - 0x16800))->unk.unk1 = 0; ((struct BattleStruct *)((u8 *)&gAIThinkingSpace - 0x16800))->unk.unk4 = 1; - gUnknown_02024C68 = 0; + gBattleMoveFlags = 0; gCritMultiplier = 1; gUnknown_02024BE6 = gAIThinkingSpace.unk2; sub_801CAF8(gUnknown_02024C07, gUnknown_02024C08); move_effectiveness_something(gUnknown_02024BE6, gUnknown_02024C07, gUnknown_02024C08); - gUnknown_02024BEC = gUnknown_02024BEC * gAIThinkingSpace.unk18[gAIThinkingSpace.moveConsidered] / 100; + gBattleMoveDamage = gBattleMoveDamage * gAIThinkingSpace.unk18[gAIThinkingSpace.moveConsidered] / 100; // this macro is missing the damage 0 = 1 assumption. - if(gBattleMons[gUnknown_02024C08].hp > gUnknown_02024BEC) + if(gBattleMons[gUnknown_02024C08].hp > gBattleMoveDamage) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); else gAIScriptPtr += 5; } -void BattleAICmd_unk_3F(void) +static void BattleAICmd_unk_3F(void) { int i; u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2); @@ -1554,7 +1834,7 @@ void BattleAICmd_unk_3F(void) } } -void BattleAICmd_unk_40(void) +static void BattleAICmd_unk_40(void) { int i; u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2); @@ -1598,7 +1878,7 @@ void BattleAICmd_unk_40(void) } } -void BattleAICmd_if_move_effect(void) +static void BattleAICmd_if_move_effect(void) { int i; @@ -1627,7 +1907,7 @@ void BattleAICmd_if_move_effect(void) } } -void BattleAICmd_if_not_move_effect(void) +static void BattleAICmd_if_not_move_effect(void) { int i; @@ -1656,7 +1936,7 @@ void BattleAICmd_if_not_move_effect(void) } } -void BattleAICmd_if_last_move_did_damage(void) +static void BattleAICmd_if_last_move_did_damage(void) { u8 var; @@ -1688,7 +1968,7 @@ void BattleAICmd_if_last_move_did_damage(void) gAIScriptPtr += 7; } -void BattleAICmd_if_encored(void) +static void BattleAICmd_if_encored(void) { switch(gAIScriptPtr[1]) { @@ -1714,12 +1994,12 @@ void BattleAICmd_if_encored(void) } } -void BattleAICmd_unk_45(void) +static void BattleAICmd_unk_45(void) { gAIThinkingSpace.unk10 |= 0xB; } -void BattleAICmd_if_random_2(void) +static void BattleAICmd_if_random_2(void) { u8 var = battle_2000000.unk88 * 5; @@ -1729,12 +2009,12 @@ void BattleAICmd_if_random_2(void) gAIScriptPtr += 5; } -void BattleAICmd_unk_47(void) +static void BattleAICmd_unk_47(void) { gAIThinkingSpace.unk10 |= 0xD; } -void BattleAICmd_get_hold_effect(void) +static void BattleAICmd_get_hold_effect(void) { u8 var; u16 status; @@ -1758,7 +2038,7 @@ void BattleAICmd_get_hold_effect(void) gAIScriptPtr += 2; } -void BattleAICmd_get_gender(void) +static void BattleAICmd_get_gender(void) { u8 var; @@ -1772,7 +2052,7 @@ void BattleAICmd_get_gender(void) gAIScriptPtr += 2; } -void BattleAICmd_is_first_turn(void) +static void BattleAICmd_is_first_turn(void) { u8 var; @@ -1786,7 +2066,7 @@ void BattleAICmd_is_first_turn(void) gAIScriptPtr += 2; } -void BattleAICmd_get_stockpile_count(void) +static void BattleAICmd_get_stockpile_count(void) { u8 var; @@ -1800,14 +2080,14 @@ void BattleAICmd_get_stockpile_count(void) gAIScriptPtr += 2; } -void BattleAICmd_unk_4C(void) +static void BattleAICmd_unk_4C(void) { gAIThinkingSpace.funcResult = gBattleTypeFlags & 1; gAIScriptPtr += 1; } -void BattleAICmd_get_item(void) +static void BattleAICmd_get_item(void) { u8 var; @@ -1822,28 +2102,28 @@ void BattleAICmd_get_item(void) gAIScriptPtr += 2; } -void BattleAICmd_unk_4E(void) +static void BattleAICmd_unk_4E(void) { gAIThinkingSpace.funcResult = gBattleMoves[gAIThinkingSpace.funcResult].type; gAIScriptPtr += 1; } -void BattleAICmd_unk_4F(void) +static void BattleAICmd_unk_4F(void) { gAIThinkingSpace.funcResult = gBattleMoves[gAIThinkingSpace.funcResult].power; gAIScriptPtr += 1; } -void BattleAICmd_unk_50(void) +static void BattleAICmd_unk_50(void) { gAIThinkingSpace.funcResult = gBattleMoves[gAIThinkingSpace.funcResult].effect; gAIScriptPtr += 1; } -void BattleAICmd_get_protect_count(void) +static void BattleAICmd_get_protect_count(void) { u8 var; @@ -1857,36 +2137,36 @@ void BattleAICmd_get_protect_count(void) gAIScriptPtr += 2; } -void BattleAICmd_unk_52(void) {} +static void BattleAICmd_unk_52(void) {} -void BattleAICmd_unk_53(void) {} +static void BattleAICmd_unk_53(void) {} -void BattleAICmd_unk_54(void) {} +static void BattleAICmd_unk_54(void) {} -void BattleAICmd_unk_55(void) {} +static void BattleAICmd_unk_55(void) {} -void BattleAICmd_unk_56(void) {} +static void BattleAICmd_unk_56(void) {} -void BattleAICmd_unk_57(void) {} +static void BattleAICmd_unk_57(void) {} -void BattleAICmd_call(void) +static void BattleAICmd_call(void) { sub_81098C4(gAIScriptPtr + 5); gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); } -void BattleAICmd_jump(void) +static void BattleAICmd_jump(void) { gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); } -void BattleAICmd_unk_5A(void) +static void BattleAICmd_unk_5A(void) { if(sub_8109908() == 0) gAIThinkingSpace.unk10 |= 1; } -void BattleAICmd_if_level_cond(void) +static void BattleAICmd_if_level_cond(void) { switch(gAIScriptPtr[1]) { @@ -1917,7 +2197,7 @@ void BattleAICmd_if_level_cond(void) } } -void BattleAICmd_if_taunted(void) +static void BattleAICmd_if_taunted(void) { if(gUnknown_02024CA8[gUnknown_02024C08].taunt) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); @@ -1925,7 +2205,7 @@ void BattleAICmd_if_taunted(void) gAIScriptPtr += 5; } -void BattleAICmd_if_not_taunted(void) +static void BattleAICmd_if_not_taunted(void) { if(!(gUnknown_02024CA8[gUnknown_02024C08].taunt)) gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1); |