diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_main.c | 7 | ||||
-rw-r--r-- | src/battle_pyramid.c | 619 | ||||
-rw-r--r-- | src/battle_script_commands.c | 4 | ||||
-rw-r--r-- | src/battle_setup.c | 14 | ||||
-rw-r--r-- | src/item.c | 2 | ||||
-rw-r--r-- | src/overworld.c | 2 | ||||
-rw-r--r-- | src/pokemon.c | 3 | ||||
-rw-r--r-- | src/trainer_see.c | 3 | ||||
-rw-r--r-- | src/wild_encounter.c | 4 |
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); |