diff options
Diffstat (limited to 'src/battle_palace.c')
-rw-r--r-- | src/battle_palace.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/src/battle_palace.c b/src/battle_palace.c new file mode 100644 index 000000000..4033712b6 --- /dev/null +++ b/src/battle_palace.c @@ -0,0 +1,188 @@ +#include "global.h" +#include "event_data.h" +#include "battle_setup.h" +#include "overworld.h" +#include "random.h" +#include "battle_tower.h" +#include "frontier_util.h" +#include "item.h" +#include "string_util.h" +#include "constants/items.h" + +// This file's functions. +static void sub_8195980(void); +static void sub_8195A38(void); +static void sub_8195AE4(void); +static void sub_8195BB0(void); +static void sub_8195C20(void); +static void sub_8195C50(void); +static void sub_8195C7C(void); +static void sub_8195CE4(void); +static void sub_8195D28(void); +static void sub_8195DB8(void); + +// Const rom data. +static void (* const sBattlePalaceFunctions[])(void) = +{ + sub_8195980, + sub_8195A38, + sub_8195AE4, + sub_8195BB0, + sub_8195C20, + sub_8195C50, + sub_8195C7C, + sub_8195CE4, + sub_8195D28, + sub_8195DB8, +}; + +static const u16 gUnknown_0860DE78[] = {ITEM_HP_UP, ITEM_PROTEIN, ITEM_IRON, ITEM_CALCIUM, ITEM_CARBOS, ITEM_ZINC}; +static const u16 gUnknown_0860DE84[] = {ITEM_BRIGHT_POWDER, ITEM_WHITE_HERB, ITEM_QUICK_CLAW, ITEM_LEFTOVERS, ITEM_MENTAL_HERB, ITEM_KINGS_ROCK, ITEM_FOCUS_BAND, ITEM_SCOPE_LENS, ITEM_CHOICE_BAND}; + +static const u32 gUnknown_0860DE98[][2] = +{ + {0x10, 0x20}, + {0x400000, 0x800000}, +}; + +static const u32 gUnknown_0860DEA8[][2] = +{ + {~0x10, ~0x20}, + {~0x400000, ~0x800000}, +}; + +// code +void CallBattlePalaceFunction(void) +{ + sBattlePalaceFunctions[gSpecialVar_0x8004](); +} + +static void sub_8195980(void) +{ + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + + gSaveBlock2Ptr->frontier.field_CA8 = 0; + gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0; + gSaveBlock2Ptr->frontier.field_CA9_a = 0; + gSaveBlock2Ptr->frontier.field_CA9_b = 0; + if (!(gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode])) + gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = 0; + + saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); + gTrainerBattleOpponent_A = 0; +} + +static void sub_8195A38(void) +{ + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + + switch (gSpecialVar_0x8005) + { + case 0: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_DC6; + break; + case 1: + gSpecialVar_Result = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]; + break; + case 2: + gSpecialVar_Result = ((gSaveBlock2Ptr->frontier.field_CDC & gUnknown_0860DE98[battleMode][lvlMode]) != 0); + break; + } +} + +static void sub_8195AE4(void) +{ + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + + switch (gSpecialVar_0x8005) + { + case 0: + gSaveBlock2Ptr->frontier.field_DC6 = gSpecialVar_0x8006; + break; + case 1: + gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] = gSpecialVar_0x8006; + break; + case 2: + if (gSpecialVar_0x8006) + gSaveBlock2Ptr->frontier.field_CDC |= gUnknown_0860DE98[battleMode][lvlMode]; + else + gSaveBlock2Ptr->frontier.field_CDC &= gUnknown_0860DEA8[battleMode][lvlMode]; + break; + } +} + +static void sub_8195BB0(void) +{ + u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 50) + gSpecialVar_Result = Random() % 3; + else if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 99) + gSpecialVar_Result = 3; + else + gSpecialVar_Result = 4; +} + +static void sub_8195C20(void) +{ + gTrainerBattleOpponent_A = 5 *(Random() % 255) / 64u; + SetBattleFacilityTrainerGfxId(gTrainerBattleOpponent_A, 0); +} + +static void sub_8195C50(void) +{ + if (gTrainerBattleOpponent_A < 300) + FrontierSpeechToString(gFacilityTrainers[gTrainerBattleOpponent_A].speechBefore); +} + +static void sub_8195C7C(void) +{ + u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] < 9999) + { + gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]++; + + // Whatever GF planned to do here, they messed up big time. + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][(lvlMode > gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[battleMode][lvlMode]) ? 1 : 0]) + gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[battleMode][lvlMode] = gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode]; + } +} + +static void sub_8195CE4(void) +{ + gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005; + VarSet(VAR_TEMP_0, 0); + gSaveBlock2Ptr->frontier.field_CA9_a = 1; + sub_81A4C30(); +} + +static void sub_8195D28(void) +{ + u32 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); + u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; + + if (gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode] > 41) + gSaveBlock2Ptr->frontier.field_DC6 = gUnknown_0860DE84[Random() % ARRAY_COUNT(gUnknown_0860DE84)]; + else + gSaveBlock2Ptr->frontier.field_DC6 = gUnknown_0860DE78[Random() % ARRAY_COUNT(gUnknown_0860DE78)]; +} + +static void sub_8195DB8(void) +{ + if (AddBagItem(gSaveBlock2Ptr->frontier.field_DC6, 1) == TRUE) + { + CopyItemName(gSaveBlock2Ptr->frontier.field_DC6, gStringVar1); + gSaveBlock2Ptr->frontier.field_DC6 = 0; + gSpecialVar_Result = TRUE; + } + else + { + gSpecialVar_Result = FALSE; + } +} |