diff options
Diffstat (limited to 'src/battle_arena.c')
-rw-r--r-- | src/battle_arena.c | 292 |
1 files changed, 288 insertions, 4 deletions
diff --git a/src/battle_arena.c b/src/battle_arena.c index 968a7e7e4..5ab71965b 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -9,18 +9,62 @@ #include "bg.h" #include "sound.h" #include "m4a.h" +#include "util.h" +#include "battle_setup.h" +#include "overworld.h" +#include "frontier_util.h" +#include "random.h" +#include "item.h" +#include "battle_tower.h" #include "constants/songs.h" +#include "constants/battle_string_ids.h" +#include "constants/battle_frontier.h" extern u16 gBattle_WIN0H; extern u16 gBattle_WIN0V; -extern void (* const gUnknown_08611F84[])(void); -extern const struct CompressedSpriteSheet gUnknown_08611F74[]; +extern const u32 gUnknown_08D854E8[]; extern const u16 gUnknown_08D855E8[]; extern const struct SpriteTemplate gUnknown_08611F5C; +extern const s8 gBattleArenaMoveMindRatings[]; // This file's functions. -void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler); +static void sub_81A58B4(void); +static void sub_81A5964(void); +static void sub_81A59FC(void); +static void sub_81A5AC4(void); +static void sub_81A5B08(void); +static void sub_81A5B88(void); +static void sub_81A5BE0(void); +static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler); + +// Const rom data. +static const struct CompressedSpriteSheet gUnknown_08611F74[] = +{ + {gUnknown_08D854E8, 0x200, 0x3E8}, + {0} +}; + +static void (* const gUnknown_08611F84[])(void) = +{ + sub_81A58B4, + sub_81A5964, + sub_81A59FC, + sub_81A5AC4, + sub_81A5B08, + sub_81A5B88, + sub_81A5BE0, +}; + +static const u16 gUnknown_08611FA0[6] = +{ + 0x003f, 0x0040, 0x0041, 0x0043, 0x0042, 0x0046 +}; + +static const u16 gUnknown_08611FAC[9] = +{ + 0x00b3, 0x00b4, 0x00b7, 0x00c8, 0x00b9, 0x00bb, 0x00c4, 0x00c6, 0x00ba +}; // code void CallBattleArenaFunction(void) @@ -153,7 +197,7 @@ u8 sub_81A5258(u8 *state) return ret; } -void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler) +static void sub_81A5558(u8 x, u8 y, u8 arg2, u8 battler) { s32 animNum = 0; s32 r6 = 0; @@ -222,3 +266,243 @@ void sub_81A56B4(void) ptr3[0] = gBattleMons[0].hp; ptr3[1] = gBattleMons[1].hp; } + +void sub_81A56E8(u8 battler) +{ + s8 *ptr1 = gBattleStruct->field_298; + + ptr1[battler] += gBattleArenaMoveMindRatings[gCurrentMove]; +} + +void sub_81A5718(u8 battler) +{ + s8 *ptr2 = gBattleStruct->field_29A; + + if (gHitMarker & HITMARKER_OBEYS) + { + u8 *ptr4 = &gBattleStruct->field_2A2; + if (*ptr4 & gBitTable[battler]) + { + *ptr4 &= ~(gBitTable[battler]); + ptr2[battler] -= 2; + } + else if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT) + { + if (!(gMoveResultFlags & MOVE_RESULT_MISSED) || gBattleCommunication[6] != 1) + ptr2[battler] -= 2; + } + else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE && gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) + { + ptr2[battler] += 1; + } + else if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) + { + ptr2[battler] += 2; + } + else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) + { + ptr2[battler] -= 1; + } + else if (!gProtectStructs[battler].protected) + { + ptr2[battler] += 1; + } + } +} + +void sub_81A57E4(u8 battler, u16 stringId) +{ + s8 *ptr2 = gBattleStruct->field_29A; + + switch (stringId) + { + case STRINGID_PKMNSXMADEYUSELESS: + case STRINGID_PKMNSXMADEITINEFFECTIVE: + case STRINGID_PKMNSXPREVENTSFLINCHING: + case STRINGID_PKMNSXBLOCKSY2: + case STRINGID_PKMNSXPREVENTSYLOSS: + case STRINGID_PKMNSXMADEYINEFFECTIVE: + case STRINGID_PKMNSXPREVENTSBURNS: + case STRINGID_PKMNSXBLOCKSY: + case STRINGID_PKMNPROTECTEDBY: + case STRINGID_PKMNPREVENTSUSAGE: + case STRINGID_PKMNRESTOREDHPUSING: + case STRINGID_PKMNPREVENTSPARALYSISWITH: + case STRINGID_PKMNPREVENTSROMANCEWITH: + case STRINGID_PKMNPREVENTSPOISONINGWITH: + case STRINGID_PKMNPREVENTSCONFUSIONWITH: + case STRINGID_PKMNRAISEDFIREPOWERWITH: + case STRINGID_PKMNANCHORSITSELFWITH: + case STRINGID_PKMNPREVENTSSTATLOSSWITH: + case STRINGID_PKMNSTAYEDAWAKEUSING: + ptr2[battler] -= 3; + break; + } +} + +void sub_81A586C(u8 battler) +{ + u16 *ptr3 = gBattleStruct->field_29C; + + ptr3[battler] = gBattleMons[battler].hp; + if (ptr3[BATTLE_OPPOSITE(battler)] > gBattleMons[BATTLE_OPPOSITE(battler)].hp) + ptr3[BATTLE_OPPOSITE(battler)] = gBattleMons[BATTLE_OPPOSITE(battler)].hp; +} + +static void sub_81A58B4(void) +{ + bool32 isCurrent; + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + gSaveBlock2Ptr->frontier.field_CA8 = 0; + gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0; + gSaveBlock2Ptr->frontier.field_CA9_a = 0; + gSaveBlock2Ptr->frontier.field_CA9_b = 0; + if (lvlMode != FRONTIER_LVL_50) + isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x80; + else + isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x40; + + if (!isCurrent) + gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = 0; + + saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + gTrainerBattleOpponent_A = 0; +} + +static void sub_81A5964(void) +{ + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + switch (gSpecialVar_0x8005) + { + case 0: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DD8; + break; + case 1: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode]; + break; + case 2: + if (lvlMode != FRONTIER_LVL_50) + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x80; + else + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x40; + break; + } +} + +static void sub_81A59FC(void) +{ + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + switch (gSpecialVar_0x8005) + { + case 0: + gSaveBlock2Ptr->frontier.field_DD8 = gSpecialVar_0x8006; + break; + case 1: + gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] = gSpecialVar_0x8006; + break; + case 2: + if (lvlMode != FRONTIER_LVL_50) + { + if (gSpecialVar_0x8006) + gSaveBlock2Ptr->frontier.field_CDC |= 0x80; + else + gSaveBlock2Ptr->frontier.field_CDC &= ~(0x80); + } + else + { + if (gSpecialVar_0x8006) + gSaveBlock2Ptr->frontier.field_CDC |= 0x40; + else + gSaveBlock2Ptr->frontier.field_CDC &= ~(0x40); + } + break; + } +} + +static void sub_81A5AC4(void) +{ + gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005; + VarSet(VAR_TEMP_0, 0); + gSaveBlock2Ptr->frontier.field_CA9_a = 1; + sub_81A4C30(); +} + +static void sub_81A5B08(void) +{ + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + if (gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] > 41) + gSaveBlock2Ptr->frontier.field_DD8 = gUnknown_08611FAC[Random() % ARRAY_COUNT(gUnknown_08611FAC)]; + else + gSaveBlock2Ptr->frontier.field_DD8 = gUnknown_08611FA0[Random() % ARRAY_COUNT(gUnknown_08611FA0)]; +} + +static void sub_81A5B88(void) +{ + if (AddBagItem(gSaveBlock2Ptr->frontier.field_DD8, 1) == TRUE) + { + CopyItemName(gSaveBlock2Ptr->frontier.field_DD8, gStringVar1); + gSaveBlock2Ptr->frontier.field_DD8 = 0; + gSpecialVar_Result = TRUE; + } + else + { + gSpecialVar_Result = FALSE; + } +} + +static void sub_81A5BE0(void) +{ + GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); +} + +void sub_81A5BF8(void) +{ + u8 width = 27; + u8 palNum = 7; + + FillBgTilemapBufferRect(0, 0, 254, 14, 1, 6, palNum); + FillBgTilemapBufferRect(0, 0, 32, 14, 1, 6, palNum); + FillBgTilemapBufferRect(0, 0x31, 0, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x33, 1, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x34, 2, 14, width, 1, palNum); + width++; + FillBgTilemapBufferRect(0, 0x35, 28, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x36, 29, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x37, 0, 15, 1, 5, palNum); + FillBgTilemapBufferRect(0, 0x39, 1, 15, width, 5, palNum); + FillBgTilemapBufferRect(0, 0x3A, 29, 15, 1, 5, palNum); + FillBgTilemapBufferRect(0, 0x831, 0, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x833, 1, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x834, 2, 19, width - 2, 1, palNum); + FillBgTilemapBufferRect(0, 0x835, 28, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x836, 29, 19, 1, 1, palNum); +} + +void sub_81A5D44(void) +{ + u8 width; + u8 height; + u8 palNum = 0; + + FillBgTilemapBufferRect(0, 3, 0, 14, 1, 1, palNum); + height = 4; + FillBgTilemapBufferRect(0, 4, 1, 14, 1, 1, palNum); + width = 27; + FillBgTilemapBufferRect(0, 5, 2, 14, width, 1, palNum); + FillBgTilemapBufferRect(0, 6, 28, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 7, 29, 14, 1, 1, palNum); + FillBgTilemapBufferRect(0, 8, 0, 15, 1, height, palNum); + FillBgTilemapBufferRect(0, 9, 1, 15, 1, height, palNum); + FillBgTilemapBufferRect(0, 0xA, 2, 15, width, height, palNum); + FillBgTilemapBufferRect(0, 0xB, 28, 15, 1, height, palNum); + FillBgTilemapBufferRect(0, 0xC, 29, 15, 1, height, palNum); + FillBgTilemapBufferRect(0, 0xD, 0, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0xE, 1, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0xF, 2, 19, width, 1, palNum); + FillBgTilemapBufferRect(0, 0x10, 28, 19, 1, 1, palNum); + FillBgTilemapBufferRect(0, 0x11, 29, 19, 1, 1, palNum); +} |