summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_main.c7
-rw-r--r--src/battle_pyramid.c619
-rw-r--r--src/battle_script_commands.c4
-rw-r--r--src/battle_setup.c14
-rw-r--r--src/item.c2
-rw-r--r--src/overworld.c2
-rw-r--r--src/pokemon.c3
-rw-r--r--src/trainer_see.c3
-rw-r--r--src/wild_encounter.c4
9 files changed, 562 insertions, 96 deletions
diff --git a/src/battle_main.c b/src/battle_main.c
index f6c01aee2..dee2adf0b 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -5,6 +5,7 @@
#include "battle_controllers.h"
#include "battle_interface.h"
#include "battle_message.h"
+#include "battle_pyramid.h"
#include "battle_scripts.h"
#include "battle_setup.h"
#include "battle_tower.h"
@@ -109,10 +110,8 @@ extern const u8 gText_Love[];
// functions
extern void sub_81B9150(void);
extern void sub_80B3AF8(u8 taskId); // cable club
-extern u8 sub_81A9E28(void); // battle frontier 2
extern void sub_81B8FB0(u8, u8); // party menu
extern u8 pokemon_order_func(u8); // party menu
-extern bool8 InBattlePyramid(void);
// this file's functions
static void CB2_InitBattleInternal(void);
@@ -5604,7 +5603,7 @@ bool8 TryRunFromBattle(u8 battler)
if (InBattlePyramid())
{
gBattleStruct->runTries++;
- pyramidMultiplier = sub_81A9E28();
+ pyramidMultiplier = GetPyramidRunMultiplier();
speedVar = (gBattleMons[battler].speed * pyramidMultiplier) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30);
if (speedVar > (Random() & 0xFF))
{
@@ -5630,7 +5629,7 @@ bool8 TryRunFromBattle(u8 battler)
{
if (InBattlePyramid())
{
- pyramidMultiplier = sub_81A9E28();
+ pyramidMultiplier = GetPyramidRunMultiplier();
speedVar = (gBattleMons[battler].speed * pyramidMultiplier) / (gBattleMons[BATTLE_OPPOSITE(battler)].speed) + (gBattleStruct->runTries * 30);
if (speedVar > (Random() & 0xFF))
effect++;
diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c
index 1ef59a438..34dd353d0 100644
--- a/src/battle_pyramid.c
+++ b/src/battle_pyramid.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "battle_pyramid.h"
#include "battle_pyramid_bag.h"
#include "event_data.h"
#include "battle.h"
@@ -19,9 +20,12 @@
#include "load_save.h"
#include "script.h"
#include "malloc.h"
+#include "overworld.h"
#include "constants/battle_frontier.h"
#include "constants/event_objects.h"
#include "constants/event_object_movement_constants.h"
+#include "constants/items.h"
+#include "constants/maps.h"
#include "constants/moves.h"
extern u8 gUnknown_0203CEF8[3];
@@ -30,6 +34,7 @@ extern void door_upload_tiles(void);
extern const struct MapLayout *const gMapLayouts[];
#define TOTAL_ROUNDS 20
+#define PICKUP_ITEMS_PER_ROUND 10
struct Struct_08613650
{
@@ -38,47 +43,134 @@ struct Struct_08613650
u8 unk2;
u8 unk3;
u8 unk4;
- u8 unk5;
- u8 unk6[10];
+ u8 unk5[11];
+};
+
+struct PyramidWildMon
+{
+ u16 species;
+ u8 lvl;
+ u8 abilityBit;
+ u16 moves[4];
+};
+
+struct ClassMusic
+{
+ u8 class;
+ u8 music;
};
extern const u16 gBattleFrontierHeldItems[];
extern const struct FacilityMon gBattleFrontierMons[];
extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
+extern const u8 BattleFrontier_BattlePyramidEmptySquare_EventScript_252C88[];
+extern const u8 BattleFrontier_BattlePyramidEmptySquare_EventScript_252C4F[];
+extern const u8 BattleFrontier_BattlePyramidEmptySquare_EventScript_252C6A[];
+
// This file's functions.
-void sub_81AAA7C(u8 lvlMode);
-u8 sub_81AA9E4(void);
-u16 sub_81A9AA8(u8);
-u8 sub_81A9998(s32 *, u8, u8);
-u8 sub_81AAA40(void);
-u8 InBattlePyramid(void);
-void sub_81A97DC(u8 taskId);
-void sub_81A9B44(u16 trainerId);
-void sub_81AA96C(u8 *);
-void sub_81AA33C(u8 *, u8 *);
+static void sub_81A8E9C(void);
+static void sub_81A8F38(void);
+static void sub_81A9048(void);
+static void sub_81A9134(void);
+static void sub_81A917C(void);
+static void sub_81A91FC(void);
+static void sub_81A9254(void);
+static void sub_81A9290(void);
+static void sub_81A93C8(void);
+static void sub_81A9414(void);
+static void sub_81A9424(void);
+static void sub_81A9618(void);
+static void sub_81A966C(void);
+static void sub_81A9684(void);
+static void sub_81A975C(void);
+static void sub_81A97C8(void);
+static void sub_81A9828(void);
+static void sub_81A9834(void);
+static void InitBagItems(u8 lvlMode);
+static u8 sub_81AA9E4(void);
+static u8 sub_81A9998(s32 *, u8, u8);
+static void sub_81A97DC(u8 taskId);
+static void sub_81A9B44(u16 trainerId);
+static void sub_81AA96C(u8 *mapNums);
+static void sub_81AA33C(u8 *, u8 *);
+static void sub_81AA398(u8);
+static bool8 sub_81AA4D8(u8, u8);
+static bool8 sub_81AA648(u8, u8);
+static bool8 sub_81AA760(u8 arg0, u8 *mapNums, u8 whichMap, u8 id);
+static bool8 sub_81AA810(u8 arg0, u8 x, u8 y, u8 *mapNums, u8 whichMap, u8 id);
// Const rom data.
-extern void (* const gUnknown_08613EE0[])(void);
extern const struct Struct_08613650 gUnknown_08613650[];
-extern const u16 sPickupItemsLvl50[TOTAL_ROUNDS][10];
-extern const u16 sPickupItemsLvlOpen[TOTAL_ROUNDS][10];
+extern const u16 sPickupItemsLvl50[TOTAL_ROUNDS][PICKUP_ITEMS_PER_ROUND];
+extern const u16 sPickupItemsLvlOpen[TOTAL_ROUNDS][PICKUP_ITEMS_PER_ROUND];
extern const u8 gUnknown_08613ABC[63][2];
extern const u8 gUnknown_08613B3A[];
-extern const u16 gUnknown_08613F34[9];
-extern const u16 gUnknown_08613F28[6];
extern const u16 gUnknown_08D856C8[][16];
extern const u8 gUnknown_08613C1C[50][2];
-extern const u8 gUnknown_08613ED8[];
extern const u8 *const *const *const gUnknown_08613EC0[];
+extern const struct ClassMusic gUnknown_08613B44[54];
+extern const struct PyramidWildMon *const gBattlePyramidOpenLevelWildMonPointers[];
+extern const struct PyramidWildMon *const gBattlePyramidLevel50WildMonPointers[];
+extern const u8 gUnknown_08613794[];
+extern const u8 gUnknown_08613750[34][2];
+
+static const u8 gUnknown_08613ED8[] = {3, 4, 5, 6, 7, 8, 3, 4};
+
+static void (* const sBattlePyramidFunctions[])(void) =
+{
+ sub_81A8E9C,
+ sub_81A8F38,
+ sub_81A9048,
+ sub_81A9134,
+ sub_81A917C,
+ sub_81A91FC,
+ sub_81A9254,
+ sub_81A9290,
+ sub_81A93C8,
+ sub_81A9414,
+ sub_81A9424,
+ sub_81A9618,
+ sub_81A966C,
+ sub_81A9684,
+ sub_81A975C,
+ sub_81A97C8,
+ sub_81A9828,
+ sub_81A9834,
+};
+
+static const u16 gUnknown_08613F28[] = {ITEM_HP_UP, ITEM_PROTEIN, ITEM_IRON, ITEM_CALCIUM, ITEM_CARBOS, ITEM_ZINC};
+static const u16 gUnknown_08613F34[] = {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 u8 gUnknown_08613F46[][4] =
+{
+ {0x01, 0x04, 0xff, 0xff},
+ {0x00, 0x02, 0x05, 0xff},
+ {0x01, 0x03, 0x06, 0xff},
+ {0x02, 0x07, 0xff, 0xff},
+ {0x00, 0x05, 0x08, 0xff},
+ {0x01, 0x04, 0x06, 0x09},
+ {0x02, 0x05, 0x07, 0x0a},
+ {0x03, 0x06, 0x0b, 0xff},
+ {0x04, 0x09, 0x0c, 0xff},
+ {0x05, 0x08, 0x0a, 0x0d},
+ {0x06, 0x09, 0x0b, 0x0e},
+ {0x07, 0x0a, 0x0f, 0xff},
+ {0x08, 0x0d, 0xff, 0xff},
+ {0x09, 0x0c, 0x0e, 0xff},
+ {0x0a, 0x0d, 0x0f, 0xff},
+ {0x0b, 0x0e, 0xff, 0xff},
+};
+
+static const u8 sPickupPercentages[PICKUP_ITEMS_PER_ROUND] = {30, 40, 50, 60, 70, 80, 85, 90, 95, 100};
// code
-void sub_81A8E7C(void)
+void CallBattlePyramidFunction(void)
{
- gUnknown_08613EE0[gSpecialVar_0x8004]();
+ sBattlePyramidFunctions[gSpecialVar_0x8004]();
}
-void sub_81A8E9C(void)
+static void sub_81A8E9C(void)
{
bool32 isCurrent;
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
@@ -94,7 +186,7 @@ void sub_81A8E9C(void)
if (!isCurrent)
{
gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] = 0;
- sub_81AAA7C(lvlMode);
+ InitBagItems(lvlMode);
}
sub_81C4EEC();
@@ -102,7 +194,7 @@ void sub_81A8E9C(void)
gBattleOutcome = 0;
}
-void sub_81A8F38(void)
+static void sub_81A8F38(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
@@ -135,7 +227,7 @@ void sub_81A8F38(void)
}
}
-void sub_81A9048(void)
+static void sub_81A9048(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
@@ -169,7 +261,7 @@ void sub_81A9048(void)
}
}
-void sub_81A9134(void)
+static void sub_81A9134(void)
{
gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
VarSet(VAR_TEMP_0, 0);
@@ -178,7 +270,7 @@ void sub_81A9134(void)
TrySavingData(SAVE_LINK);
}
-void sub_81A917C(void)
+static void sub_81A917C(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
@@ -188,7 +280,7 @@ void sub_81A917C(void)
gSaveBlock2Ptr->frontier.field_E18 = gUnknown_08613F28[Random() % ARRAY_COUNT(gUnknown_08613F28)];
}
-void sub_81A91FC(void)
+static void sub_81A91FC(void)
{
if (AddBagItem(gSaveBlock2Ptr->frontier.field_E18, 1) == TRUE)
{
@@ -202,7 +294,7 @@ void sub_81A91FC(void)
}
}
-void sub_81A9254(void)
+static void sub_81A9254(void)
{
s32 i;
@@ -212,7 +304,7 @@ void sub_81A9254(void)
gSaveBlock2Ptr->frontier.field_E2A = 0;
}
-void sub_81A9290(void)
+static void sub_81A9290(void)
{
s32 i;
s32 r7;
@@ -247,7 +339,7 @@ void sub_81A9290(void)
gSpecialVar_0x8001 = 1;
}
-void sub_81A93C8(void)
+static void sub_81A93C8(void)
{
struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates;
s32 i = 0;
@@ -266,12 +358,12 @@ void sub_81A93C8(void)
}
}
-void sub_81A9414(void)
+static void sub_81A9414(void)
{
gFacilityTrainers = gBattleFrontierTrainers;
}
-void sub_81A9424(void)
+static void sub_81A9424(void)
{
s32 i;
s32 var_24;
@@ -279,7 +371,7 @@ void sub_81A9424(void)
s32 class = 0;
s32 r7 = 0;
struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates;
- u16 trainerId = sub_81A9AA8(gEventObjects[gSelectedEventObject].localId);
+ u16 trainerId = LocalIdToPyramidTrainerId(gEventObjects[gSelectedEventObject].localId);
for (i = 0; i < ARRAY_COUNT(gUnknown_08613C1C); i++)
{
@@ -341,7 +433,7 @@ void sub_81A9424(void)
ShowFieldMessage(gUnknown_08613EC0[class][var_24][r7]);
}
-void sub_81A9618(void)
+static void sub_81A9618(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
@@ -351,12 +443,12 @@ void sub_81A9618(void)
gSaveBlock2Ptr->frontier.pyramidRecordStreaks[lvlMode] = gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode];
}
-void sub_81A966C(void)
+static void sub_81A966C(void)
{
gSpecialVar_Result = InBattlePyramid();
}
-void sub_81A9684(void)
+static void sub_81A9684(void)
{
switch (gSpecialVar_0x8006)
{
@@ -401,7 +493,7 @@ void sub_81A9684(void)
}
}
-void sub_81A975C(void)
+static void sub_81A975C(void)
{
s32 i, j;
u16 item = 0;
@@ -416,12 +508,12 @@ void sub_81A975C(void)
}
}
-void sub_81A97C8(void)
+static void sub_81A97C8(void)
{
CreateTask(sub_81A97DC, 0);
}
-void sub_81A97DC(u8 taskId)
+static void sub_81A97DC(u8 taskId)
{
if (gPaletteFade.active)
{
@@ -430,12 +522,12 @@ void sub_81A97DC(u8 taskId)
}
}
-void sub_81A9828(void)
+static void sub_81A9828(void)
{
sub_809FDD4();
}
-void sub_81A9834(void)
+static void sub_81A9834(void)
{
s32 i, j, k, l;
@@ -467,7 +559,7 @@ void sub_81A9834(void)
gSaveBlock2Ptr->frontier.selectedPartyMons[i] = gUnknown_0203CEF8[i];
}
-u8 sub_81A9998(s32 *arg0, u8 arg1, u8 arg2)
+static u8 sub_81A9998(s32 *arg0, u8 arg1, u8 arg2)
{
s32 i, j;
u8 ret = 0;
@@ -537,9 +629,9 @@ u8 sub_81A9998(s32 *arg0, u8 arg1, u8 arg2)
return ret;
}
-u16 sub_81A9AA8(u8 arg0)
+u16 LocalIdToPyramidTrainerId(u8 localId)
{
- return gSaveBlock2Ptr->frontier.field_CB4[arg0 - 1];
+ return gSaveBlock2Ptr->frontier.field_CB4[localId - 1];
}
bool8 GetBattlePyramidTrainerFlag(u8 eventId)
@@ -557,18 +649,7 @@ void sub_81A9B04(void)
}
}
-struct PyramidWildMon
-{
- u16 species;
- u8 lvl;
- u8 abilityBit;
- u16 moves[4];
-};
-
-extern const struct PyramidWildMon *const gBattlePyramidOpenLevelWildMonPointers[];
-extern const struct PyramidWildMon *const gBattlePyramidLevel50WildMonPointers[];
-
-void sub_81A9B44(u16 trainerId)
+static void sub_81A9B44(u16 trainerId)
{
s32 i;
@@ -652,7 +733,7 @@ void GenerateBattlePyramidWildMon(void)
CalculateMonStats(&gEnemyParty[0]);
}
-u8 sub_81A9E28(void)
+u8 GetPyramidRunMultiplier(void)
{
u8 id = sub_81AA9E4();
return gUnknown_08613650[id].unk4;
@@ -690,30 +771,21 @@ void sub_81A9EC8(void)
DoSoftReset();
}
-void sub_81A9EDC(u16 trainerId)
+void CopyPyramidTrainerSpeechBefore(u16 trainerId)
{
FrontierSpeechToString(gFacilityTrainers[trainerId].speechBefore);
}
-void sub_81A9EFC(u16 trainerId)
+void CopyPyramidTrainerWinSpeech(u16 trainerId)
{
FrontierSpeechToString(gFacilityTrainers[trainerId].speechWin);
}
-void sub_81A9F1C(u16 trainerId)
+void CopyPyramidTrainerLoseSpeech(u16 trainerId)
{
FrontierSpeechToString(gFacilityTrainers[trainerId].speechLose);
}
-struct ClassMusic
-{
- u8 class;
- u8 music;
-};
-
-extern const struct ClassMusic gUnknown_08613B44[54];
-extern const u8 BattleFrontier_BattlePyramidEmptySquare_EventScript_252C88[];
-
u8 GetTrainerEncounterMusicIdInBattlePyramind(u16 trainerId)
{
s32 i;
@@ -726,12 +798,12 @@ u8 GetTrainerEncounterMusicIdInBattlePyramind(u16 trainerId)
return 0;
}
-void sub_81A9F80(void)
+static void sub_81A9F80(void)
{
ScriptContext1_SetupScript(BattleFrontier_BattlePyramidEmptySquare_EventScript_252C88);
}
-u16 sub_81A9F90(u8 count)
+static u16 sub_81A9F90(u8 count)
{
s32 i;
u16 trainerId;
@@ -818,3 +890,408 @@ void sub_81AA078(u16 *mapArg, u8 arg1)
mapheader_run_script_with_tag_x1();
free(allocated);
}
+
+void sub_81AA1D8(void)
+{
+ s32 i;
+ u8 id;
+ u8 var0, var1;
+
+ for (i = 0; i < 8; i++)
+ gSaveBlock2Ptr->frontier.field_CB4[i] |= 0xFFFF;
+
+ id = sub_81AA9E4();
+ sub_81AA33C(&var0, &var1);
+ CpuFill32(0, gSaveBlock1Ptr->eventObjectTemplates, sizeof(gSaveBlock1Ptr->eventObjectTemplates));
+ for (i = 0; i < 2; i++)
+ {
+ u8 value;
+
+ if (i == 0)
+ value = gUnknown_08613650[id].unk3;
+ else
+ value = gUnknown_08613650[id].unk2;
+
+ switch (value)
+ {
+ case 0:
+ sub_81AA398(i);
+ break;
+ case 1:
+ if (sub_81AA4D8(i, var0))
+ sub_81AA398(i);
+ break;
+ case 2:
+ if (sub_81AA4D8(i, var1))
+ sub_81AA398(i);
+ break;
+ case 3:
+ if (sub_81AA648(i, var0))
+ sub_81AA398(i);
+ break;
+ case 4:
+ if (sub_81AA648(i, var1))
+ sub_81AA398(i);
+ break;
+ }
+ }
+}
+
+void sub_81AA2F8(void)
+{
+ s32 i;
+ struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates;
+
+ for (i = 0; i < EVENT_OBJECT_TEMPLATES_COUNT; i++)
+ {
+ if (events[i].graphicsId != EVENT_OBJ_GFX_ITEM_BALL)
+ events[i].script = BattleFrontier_BattlePyramidEmptySquare_EventScript_252C4F;
+ else
+ events[i].script = BattleFrontier_BattlePyramidEmptySquare_EventScript_252C6A;
+ }
+}
+
+static void sub_81AA33C(u8 *var0, u8 *var1)
+{
+ *var0 = gSaveBlock2Ptr->frontier.field_E22[3] % 16;
+ *var1 = gSaveBlock2Ptr->frontier.field_E22[0] % 16;
+
+ if (*var0 == *var1)
+ {
+ *var0 = (gSaveBlock2Ptr->frontier.field_E22[3] + 1 ) % 16;
+ *var1 = (gSaveBlock2Ptr->frontier.field_E22[0] + 15) % 16;
+ }
+}
+
+static void sub_81AA398(u8 arg0)
+{
+ s32 i;
+ s32 count;
+ s32 var_28;
+ s32 r4;
+ u32 bits = 0;
+ u8 id = sub_81AA9E4();
+ u8 *allocated = AllocZeroed(0x10);
+
+ sub_81AA96C(allocated);
+ r4 = gSaveBlock2Ptr->frontier.field_E22[2] % 16;
+ if (arg0 == 0)
+ {
+ count = gUnknown_08613650[id].unk1;
+ var_28 = 0;
+ }
+ else
+ {
+ count = gUnknown_08613650[id].unk0;
+ var_28 = gUnknown_08613650[id].unk1;
+ }
+
+ for (i = 0; i < count; i++)
+ {
+ do
+ {
+ do
+ {
+ if (bits & 1)
+ {
+ if (!(gBitTable[r4] & gSaveBlock2Ptr->frontier.field_E22[3]))
+ bits |= 2;
+ }
+ else
+ {
+ if (gBitTable[r4] & gSaveBlock2Ptr->frontier.field_E22[3])
+ bits |= 2;
+ }
+ if (++r4 >= 16)
+ r4 = 0;
+
+ if (r4 == gSaveBlock2Ptr->frontier.field_E22[2] % 16)
+ {
+ if (bits & 1)
+ bits |= 6;
+ else
+ bits |= 1;
+ }
+ } while (!(bits & 2));
+
+ } while (!(bits & 4) && sub_81AA760(arg0, allocated, r4, var_28 + i));
+ bits &= 1;
+ }
+ free(allocated);
+}
+
+static bool8 sub_81AA4D8(u8 arg0, u8 arg1)
+{
+ s32 i;
+ s32 var_28;
+ s32 r6 = 0;
+ s32 r7 = 0;
+ s32 var_34 = 0;
+ s32 count;
+ u8 id = sub_81AA9E4();
+ u8 *allocated = AllocZeroed(0x10);
+
+ sub_81AA96C(allocated);
+ if (arg0 == 0)
+ {
+ count = gUnknown_08613650[id].unk1;
+ var_28 = 0;
+ }
+ else
+ {
+ count = gUnknown_08613650[id].unk0;
+ var_28 = gUnknown_08613650[id].unk1;
+ }
+
+ for (i = 0; i < count; i++)
+ {
+ if (r7 == 0)
+ {
+ if (sub_81AA760(arg0, allocated, arg1, var_28 + i))
+ r7 = 1;
+ else
+ var_34++;
+ }
+ if (r7 & 1)
+ {
+ if (sub_81AA760(arg0, allocated, gUnknown_08613F46[arg1][r6], var_28 + i))
+ {
+ do
+ {
+ r6++;
+ if (gUnknown_08613F46[arg1][r6] == 0xFF || r6 >= 4)
+ r6 = 0;
+ r7 += 2;
+ } while (r7 >> 1 != 4 && sub_81AA760(arg0, allocated, gUnknown_08613F46[arg1][r6], var_28 + i));
+ var_34++;
+ }
+ else
+ {
+ r6++;
+ if (gUnknown_08613F46[arg1][r6] == 0xFF || r6 >= 4)
+ r6 = 0;
+ var_34++;
+ }
+ }
+
+ if (r7 >> 1 == 4)
+ break;
+
+ r7 &= 1;
+ }
+ // free(allocated); BUG: allocated memory not freed
+
+ return (count / 2 > var_34);
+}
+
+static bool8 sub_81AA648(u8 arg0, u8 arg1)
+{
+ s32 i;
+ s32 var_28;
+ s32 r4 = 0;
+ s32 r7 = 0;
+ s32 r8 = 0;
+ s32 count;
+ u8 id = sub_81AA9E4();
+ u8 *allocated = AllocZeroed(0x10);
+
+ sub_81AA96C(allocated);
+ if (arg0 == 0)
+ {
+ count = gUnknown_08613650[id].unk1;
+ var_28 = 0;
+ }
+ else
+ {
+ count = gUnknown_08613650[id].unk0;
+ var_28 = gUnknown_08613650[id].unk1;
+ }
+
+ for (i = 0; i < count; i++)
+ {
+ if (sub_81AA760(arg0, allocated, gUnknown_08613F46[arg1][r4], var_28 + i))
+ {
+ do
+ {
+ r4++;
+ if (gUnknown_08613F46[arg1][r4] == 0xFF || r4 >= 4)
+ r4 = 0;
+ r8++;
+ } while (r8 != 4 && sub_81AA760(arg0, allocated, gUnknown_08613F46[arg1][r4], var_28 + i));
+ r7++;
+ }
+ else
+ {
+ r4++;
+ if (gUnknown_08613F46[arg1][r4] == 0xFF || r4 >= 4)
+ r4 = 0;
+ r7++;
+ }
+
+ if (r8 == 4)
+ break;
+ }
+ // free(allocated); BUG: allocated memory not freed
+
+ return (count / 2 > r7);
+}
+
+static bool8 sub_81AA760(u8 arg0, u8 *mapNums, u8 whichMap, u8 id)
+{
+ s32 i, j;
+
+ if (gSaveBlock2Ptr->frontier.field_E22[0] & 1)
+ {
+ s32 minus1 = -1;
+ for (i = 7; i > minus1; i--)
+ {
+ for (j = 7; j >= 0; j--)
+ {
+ if (!sub_81AA810(arg0, j, i, mapNums, whichMap, id))
+ return FALSE;
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ if (!sub_81AA810(arg0, j, i, mapNums, whichMap, id))
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+static bool8 sub_81AA810(u8 arg0, u8 x, u8 y, u8 *mapNums, u8 whichMap, u8 id)
+{
+ s32 i, j;
+ const struct MapHeader *mapHeader;
+ struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates;
+
+ mapHeader = Overworld_GetMapHeaderByGroupAndId(MAP_GROUP(BATTLE_PYRAMID_SQUARE01), mapNums[whichMap] + MAP_NUM(BATTLE_PYRAMID_SQUARE01));
+ for (i = 0; i < mapHeader->events->eventObjectCount; i++)
+ {
+ if (mapHeader->events->eventObjects[i].x != x || mapHeader->events->eventObjects[i].y != y)
+ continue;
+
+ if (arg0 != 0 || mapHeader->events->eventObjects[i].graphicsId == EVENT_OBJ_GFX_ITEM_BALL)
+ {
+ if (arg0 != 1 || mapHeader->events->eventObjects[i].graphicsId != EVENT_OBJ_GFX_ITEM_BALL)
+ continue;
+ }
+
+ for (j = 0; j < id; j++)
+ {
+ if (events[j].x == x + ((whichMap % 4) * 8) && events[j].y == y + ((whichMap / 4) * 8))
+ break;
+ }
+ if (j != id)
+ continue;
+
+ events[id] = mapHeader->events->eventObjects[i];
+ events[id].x += ((whichMap % 4) * 8);
+ events[id].y += ((whichMap / 4) * 8);
+ events[id].localId = id + 1;
+ if (events[id].graphicsId != EVENT_OBJ_GFX_ITEM_BALL)
+ {
+ i = sub_81A9F90(id);
+ events[id].graphicsId = GetBattleFacilityTrainerGfxId(i);
+ gSaveBlock2Ptr->frontier.field_CB4[id] = i;
+ }
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void sub_81AA96C(u8 *mapNums)
+{
+ s32 i;
+ s32 bits = (gSaveBlock2Ptr->frontier.field_E22[0]) | (gSaveBlock2Ptr->frontier.field_E22[1] << 16);
+ u8 id = sub_81AA9E4();
+
+ for (i = 0; i < 16; i++)
+ {
+ mapNums[i] = gUnknown_08613650[id].unk5[bits & 7];
+ bits >>= 3;
+ if (i == 7)
+ {
+ bits = (gSaveBlock2Ptr->frontier.field_E22[2]) | (gSaveBlock2Ptr->frontier.field_E22[3] << 16);
+ bits >>= 8;
+ }
+ }
+}
+
+static u8 sub_81AA9E4(void)
+{
+ s32 i;
+ s32 var = gSaveBlock2Ptr->frontier.field_E22[3] % 100;
+ s32 battleNum = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
+
+ for (i = gUnknown_08613794[battleNum]; i < ARRAY_COUNT(gUnknown_08613750); i++)
+ {
+ if (var < gUnknown_08613750[i][0])
+ return gUnknown_08613750[i][1];
+ }
+ return 0;
+}
+
+u8 sub_81AAA40(void)
+{
+ u8 i;
+ struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (events[i].localId == 0)
+ break;
+ }
+
+ return i;
+}
+
+static void InitBagItems(u8 lvlMode)
+{
+ s32 i;
+
+ for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
+ {
+ gSaveBlock2Ptr->frontier.pyramidBag.itemId[lvlMode][i] = 0;
+ gSaveBlock2Ptr->frontier.pyramidBag.quantity[lvlMode][i] = 0;
+ }
+
+ AddPyramidBagItem(ITEM_HYPER_POTION, 1);
+ AddPyramidBagItem(ITEM_ETHER, 1);
+}
+
+u16 GetBattlePyramidPickupItemId(void)
+{
+ s32 rand;
+ u32 i;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ s32 round = (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] / 7);
+
+ if (round >= TOTAL_ROUNDS)
+ round = TOTAL_ROUNDS - 1;
+
+ rand = Random() % 100;
+
+ for (i = 0; i < ARRAY_COUNT(sPickupPercentages); i++)
+ {
+ if (sPickupPercentages[i] > rand)
+ break;
+ }
+
+ if (i >= PICKUP_ITEMS_PER_ROUND)
+ i = PICKUP_ITEMS_PER_ROUND - 1;
+
+ if (lvlMode != FRONTIER_LVL_50)
+ return sPickupItemsLvlOpen[round][i];
+ else
+ return sPickupItemsLvl50[round][i];
+}
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index 920e1045b..ae397159a 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -45,6 +45,7 @@
#include "party_menu.h"
#include "battle_arena.h"
#include "battle_pike.h"
+#include "battle_pyramid.h"
extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
@@ -62,11 +63,8 @@ extern void sub_81D388C(struct Pokemon* mon, void* statStoreLocation); // pokena
extern void sub_81D3640(u8 arg0, void* statStoreLocation1, void* statStoreLocation2, u8 arg3, u8 arg4, u8 arg5); // pokenav.s
extern void sub_81D3784(u8 arg0, void* statStoreLocation1, u8 arg2, u8 arg3, u8 arg4); // pokenav.s
extern u8* GetMonNickname(struct Pokemon* mon, u8* dst); // party_menu
-extern u8 BattleArena_ShowJudgmentWindow(u8* arg0); // battle frontier 2
extern void sub_81B8E80(u8 battlerId, u8, u8); // party menu
extern bool8 sub_81B1250(void); // ?
-extern bool8 InBattlePyramid(void);
-extern u16 GetBattlePyramidPickupItemId(void);
extern u8 sub_813B21C(void);
extern u16 get_unknown_box_id(void);
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 18998e564..ab2a12fb7 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -34,6 +34,7 @@
#include "battle_tower.h"
#include "gym_leader_rematch.h"
#include "battle_pike.h"
+#include "battle_pyramid.h"
#include "constants/map_types.h"
#include "constants/battle_frontier.h"
@@ -54,7 +55,6 @@ struct TrainerBattleParameter
u8 ptrType;
};
-extern bool8 InBattlePyramid(void);
extern bool32 InTrainerHill(void);
extern bool32 FieldPoisonEffectIsRunning(void);
extern void RestartWildEncounterImmunitySteps(void);
@@ -63,17 +63,13 @@ extern void sub_81BE72C(void);
extern void sub_808BCF4(void);
extern void sub_80EECC8(void);
extern void sub_80AF6F0(void);
-extern u16 sub_81A9AA8(u8 localId);
extern u16 sub_81D6180(u8 localId);
-extern bool8 GetBattlePyramidTrainerFlag(u8 eventObjId);
extern bool8 GetTrainerHillTrainerFlag(u8 eventObjId);
extern bool8 sub_81D5C18(void);
-extern void sub_81A9B04(void);
extern void sub_81D639C(void);
extern void sub_81D6384(void);
extern void sub_81D61E8(void);
extern void sub_80982B8(void);
-extern void sub_81A9EDC(u16 a0);
extern void CopyTrainerHillTrainerText(u8 a0, u16 arg1);
// this file's functions
@@ -1131,12 +1127,12 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data)
{
TrainerBattleLoadArgs(sOrdinaryBattleParams, data);
SetMapVarsToTrainer();
- gTrainerBattleOpponent_A = sub_81A9AA8(gSpecialVar_LastTalked);
+ gTrainerBattleOpponent_A = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked);
}
else
{
TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data);
- gTrainerBattleOpponent_B = sub_81A9AA8(gSpecialVar_LastTalked);
+ gTrainerBattleOpponent_B = LocalIdToPyramidTrainerId(gSpecialVar_LastTalked);
}
return EventScript_271362;
case TRAINER_BATTLE_SET_TRAINER_A:
@@ -1360,9 +1356,9 @@ void ShowTrainerIntroSpeech(void)
if (InBattlePyramid())
{
if (gNoOfApproachingTrainers == 0 || gNoOfApproachingTrainers == 1)
- sub_81A9EDC(sub_81A9AA8(gSpecialVar_LastTalked));
+ CopyPyramidTrainerSpeechBefore(LocalIdToPyramidTrainerId(gSpecialVar_LastTalked));
else
- sub_81A9EDC(sub_81A9AA8(gEventObjects[gApproachingTrainers[gApproachingTrainerId].eventObjectId].localId));
+ CopyPyramidTrainerSpeechBefore(LocalIdToPyramidTrainerId(gEventObjects[gApproachingTrainers[gApproachingTrainerId].eventObjectId].localId));
sub_80982B8();
}
diff --git a/src/item.c b/src/item.c
index b4a2fd6f0..b2c009be6 100644
--- a/src/item.c
+++ b/src/item.c
@@ -10,9 +10,9 @@
#include "item_menu.h"
#include "strings.h"
#include "load_save.h"
+#include "battle_pyramid.h"
#include "battle_pyramid_bag.h"
-extern bool8 InBattlePyramid(void);
extern u16 gUnknown_0203CF30[];
extern const struct Item gItems[];
diff --git a/src/overworld.c b/src/overworld.c
index 4e1f8cc4f..5c0a06f38 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "overworld.h"
+#include "battle_pyramid.h"
#include "battle_setup.h"
#include "berry.h"
#include "bg.h"
@@ -113,7 +114,6 @@ extern void ShowMapNamePopup(void);
extern bool32 InTrainerHill(void);
extern bool32 sub_808651C(void);
extern bool8 sub_80AF6A4(void);
-extern bool8 InBattlePyramid_(void);
extern bool8 sub_80E909C(void);
extern void sub_81AA1D8(void);
extern void c2_change_map(void);
diff --git a/src/pokemon.c b/src/pokemon.c
index 47c4f9217..0f7c80b77 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -4,6 +4,7 @@
#include "battle_controllers.h"
#include "battle_message.h"
#include "battle_pike.h"
+#include "battle_pyramid.h"
#include "battle_setup.h"
#include "battle_tower.h"
#include "event_data.h"
@@ -81,9 +82,7 @@ extern u8 StorageGetCurrentBox(void);
extern void set_unknown_box_id(u8);
extern void sub_803FA70(u8 battlerId);
extern u8 sav1_map_get_name(void);
-extern bool8 InBattlePyramid(void);
extern bool8 sub_806F104(void);
-extern u8 GetTrainerEncounterMusicIdInBattlePyramind(u16 trainerOpponentId);
extern u8 sub_81D63C8(u16 trainerOpponentId);
extern void SummaryScreen_SetUnknownTaskId(u8);
diff --git a/src/trainer_see.c b/src/trainer_see.c
index 726d89847..b74608d0b 100644
--- a/src/trainer_see.c
+++ b/src/trainer_see.c
@@ -12,11 +12,10 @@
#include "task.h"
#include "trainer_see.h"
#include "util.h"
+#include "battle_pyramid.h"
#include "constants/field_effects.h"
-extern bool8 InBattlePyramid(void);
extern bool32 InTrainerHill(void);
-extern bool8 GetBattlePyramidTrainerFlag(u8 eventObjectId);
extern bool8 GetTrainerHillTrainerFlag(u8 eventObjectId);
extern void sub_809BE48(u16 npcId);
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index 52dbdf65e..9b3c70ad7 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -19,6 +19,7 @@
#include "link.h"
#include "script.h"
#include "battle_pike.h"
+#include "battle_pyramid.h"
#include "constants/items.h"
#include "constants/maps.h"
@@ -26,9 +27,6 @@ extern const u8 EventScript_RepelWoreOff[];
#define NUM_FEEBAS_SPOTS 6
-extern void GenerateBattlePyramidWildMon(void);
-extern bool8 InBattlePyramid(void);
-
// this file's functions
static u16 FeebasRandom(void);
static void FeebasSeedRng(u16 seed);