summaryrefslogtreecommitdiff
path: root/src/battle_pyramid.c
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2018-11-17 22:55:39 +0100
committerDizzyEggg <jajkodizzy@wp.pl>2018-11-17 22:55:39 +0100
commit40a44a8508fb728e2bc528586c6fba717222751f (patch)
treeb1b9f3c03aae192827091f25ba7b1008902e674d /src/battle_pyramid.c
parenteb66b60f3813dda5cd6aae92401c10300b4a3515 (diff)
more battle pytamid
Diffstat (limited to 'src/battle_pyramid.c')
-rw-r--r--src/battle_pyramid.c425
1 files changed, 410 insertions, 15 deletions
diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c
index 248e58a9d..1ef59a438 100644
--- a/src/battle_pyramid.c
+++ b/src/battle_pyramid.c
@@ -14,12 +14,22 @@
#include "sound.h"
#include "task.h"
#include "start_menu.h"
+#include "trainer_see.h"
+#include "main.h"
+#include "load_save.h"
+#include "script.h"
+#include "malloc.h"
#include "constants/battle_frontier.h"
#include "constants/event_objects.h"
+#include "constants/event_object_movement_constants.h"
+#include "constants/moves.h"
+extern u8 gUnknown_0203CEF8[3];
extern void door_upload_tiles(void);
-#define PICKUP_ITEMS_SET_COUNT 20
+extern const struct MapLayout *const gMapLayouts[];
+
+#define TOTAL_ROUNDS 20
struct Struct_08613650
{
@@ -42,18 +52,25 @@ u8 sub_81AA9E4(void);
u16 sub_81A9AA8(u8);
u8 sub_81A9998(s32 *, u8, u8);
u8 sub_81AAA40(void);
-bool8 InBattlePyramid(void);
+u8 InBattlePyramid(void);
void sub_81A97DC(u8 taskId);
+void sub_81A9B44(u16 trainerId);
+void sub_81AA96C(u8 *);
+void sub_81AA33C(u8 *, u8 *);
// Const rom data.
extern void (* const gUnknown_08613EE0[])(void);
extern const struct Struct_08613650 gUnknown_08613650[];
-extern const u16 sPickupItemsLvl50[PICKUP_ITEMS_SET_COUNT][10];
-extern const u16 sPickupItemsLvlOpen[PICKUP_ITEMS_SET_COUNT][10];
+extern const u16 sPickupItemsLvl50[TOTAL_ROUNDS][10];
+extern const u16 sPickupItemsLvlOpen[TOTAL_ROUNDS][10];
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[];
// code
void sub_81A8E7C(void)
@@ -203,10 +220,10 @@ void sub_81A9290(void)
u8 id;
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
u32 floor = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
- u32 setId = (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] / 7) % PICKUP_ITEMS_SET_COUNT;
+ u32 round = (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] / 7) % TOTAL_ROUNDS;
- if (setId >= PICKUP_ITEMS_SET_COUNT)
- setId = PICKUP_ITEMS_SET_COUNT - 1;
+ if (round >= TOTAL_ROUNDS)
+ round = TOTAL_ROUNDS - 1;
id = sub_81AA9E4();
r7 = (gSpecialVar_LastTalked - gUnknown_08613650[id].unk1) - 1;
@@ -223,9 +240,9 @@ void sub_81A9290(void)
}
if (lvlMode != FRONTIER_LVL_50)
- gSpecialVar_0x8000 = sPickupItemsLvlOpen[setId][gUnknown_08613ABC[i][1]];
+ gSpecialVar_0x8000 = sPickupItemsLvlOpen[round][gUnknown_08613ABC[i][1]];
else
- gSpecialVar_0x8000 = sPickupItemsLvl50[setId][gUnknown_08613ABC[i][1]];
+ gSpecialVar_0x8000 = sPickupItemsLvl50[round][gUnknown_08613ABC[i][1]];
gSpecialVar_0x8001 = 1;
}
@@ -254,10 +271,6 @@ void sub_81A9414(void)
gFacilityTrainers = gBattleFrontierTrainers;
}
-extern const u8 gUnknown_08613C1C[50][2];
-extern const u8 gUnknown_08613ED8[];
-extern const u8 *const *const *const gUnknown_08613EC0[];
-
void sub_81A9424(void)
{
s32 i;
@@ -408,8 +421,6 @@ void sub_81A97C8(void)
CreateTask(sub_81A97DC, 0);
}
-extern const u16 gUnknown_08D856C8[][16];
-
void sub_81A97DC(u8 taskId)
{
if (gPaletteFade.active)
@@ -423,3 +434,387 @@ void sub_81A9828(void)
{
sub_809FDD4();
}
+
+void sub_81A9834(void)
+{
+ s32 i, j, k, l;
+
+ for (i = 0; i < 3; i++)
+ {
+ s32 id = gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1;
+ for (j = 0; j < 3; j++)
+ {
+ if (GetMonData(&gSaveBlock1Ptr->playerParty[id], MON_DATA_SPECIES, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL))
+ {
+ for (k = 0; k < 4; k++)
+ {
+ for (l = 0; l < 4; l++)
+ {
+ if (GetMonData(&gSaveBlock1Ptr->playerParty[id], MON_DATA_MOVE1 + l, NULL) == GetMonData(&gPlayerParty[j], MON_DATA_MOVE1 + k, NULL))
+ break;
+ }
+ if (l == 4)
+ SetMonMoveSlot(&gPlayerParty[j], MOVE_SKETCH, k);
+ }
+ gSaveBlock1Ptr->playerParty[id] = gPlayerParty[j];
+ gUnknown_0203CEF8[j] = id + 1;
+ break;
+ }
+ }
+ }
+
+ for (i = 0; i < 3; i++)
+ gSaveBlock2Ptr->frontier.selectedPartyMons[i] = gUnknown_0203CEF8[i];
+}
+
+u8 sub_81A9998(s32 *arg0, u8 arg1, u8 arg2)
+{
+ s32 i, j;
+ u8 ret = 0;
+ u16 *map = gUnknown_03005DC0.map;
+ map += gUnknown_03005DC0.width * 7 + 7;
+
+ for (i = 0; i < 32; map += 47, i++)
+ {
+ for (j = 0; j < 32; j++)
+ {
+ if ((map[j] & 0x3FF) == 0x28E)
+ {
+ j += 7 - gEventObjects[gSelectedEventObject].initialCoords.x;
+ i += 7 - gEventObjects[gSelectedEventObject].initialCoords.y;
+ if (j >= arg1 || j <= -arg1 || i >= arg1 || i <= -arg1 || arg2 == 0)
+ {
+ if (j > 0 && i > 0)
+ {
+ if (j >= i)
+ ret = 2;
+ else
+ ret = 3;
+ }
+ else if (j < 0 && i < 0)
+ {
+ if (j > i)
+ ret = 0;
+ else
+ ret = 1;
+ }
+ else if (j == 0)
+ {
+ if (i > 0)
+ ret = 3;
+ else
+ ret = 0;
+ }
+ else if (i == 0)
+ {
+ if (j > 0)
+ ret = 2;
+ else
+ ret = 1;
+ }
+ else if (j < 0)
+ {
+ if (j + i > 0)
+ ret = 3;
+ else
+ ret = 1;
+ }
+ else
+ {
+ ret = (~(j + i) >= 0) ? 0 : 2;
+ }
+ *arg0 = 0;
+ }
+ else
+ {
+ *arg0 = arg2;
+ }
+ return ret;
+ }
+ }
+ }
+
+ return ret;
+}
+
+u16 sub_81A9AA8(u8 arg0)
+{
+ return gSaveBlock2Ptr->frontier.field_CB4[arg0 - 1];
+}
+
+bool8 GetBattlePyramidTrainerFlag(u8 eventId)
+{
+ return gSaveBlock2Ptr->frontier.field_E2A & gBitTable[gEventObjects[eventId].localId - 1];
+}
+
+void sub_81A9B04(void)
+{
+ sub_81A9B44(gTrainerBattleOpponent_A);
+ if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
+ {
+ gSelectedEventObject = GetChosenApproachingTrainerEventObjectId(1);
+ sub_81A9B44(gTrainerBattleOpponent_B);
+ }
+}
+
+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)
+{
+ s32 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
+ gSaveBlock2Ptr->frontier.field_E2A |= gBitTable[i];
+ }
+
+ gEventObjects[gSelectedEventObject].movementType = MOVEMENT_TYPE_WANDER_AROUND;
+ gSaveBlock1Ptr->eventObjectTemplates[gSpecialVar_LastTalked - 1].movementType = MOVEMENT_TYPE_WANDER_AROUND;
+ gEventObjects[gSelectedEventObject].initialCoords.x = gEventObjects[gSelectedEventObject].currentCoords.x;
+ gEventObjects[gSelectedEventObject].initialCoords.y = gEventObjects[gSelectedEventObject].currentCoords.y;
+}
+
+void GenerateBattlePyramidWildMon(void)
+{
+ u8 name[POKEMON_NAME_LENGTH + 1];
+ s32 i;
+ const struct PyramidWildMon *wildMons;
+ u32 id;
+ u32 lvl = gSaveBlock2Ptr->frontier.lvlMode;
+ u16 round = (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvl] / 7) % TOTAL_ROUNDS;
+
+ if (round >= TOTAL_ROUNDS)
+ round = TOTAL_ROUNDS - 1;
+
+ if (lvl != FRONTIER_LVL_50)
+ wildMons = gBattlePyramidOpenLevelWildMonPointers[round];
+ else
+ wildMons = gBattlePyramidLevel50WildMonPointers[round];
+
+ id = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, NULL) - 1;
+ SetMonData(&gEnemyParty[0], MON_DATA_SPECIES, &wildMons[id].species);
+ GetSpeciesName(name, wildMons[id].species);
+ SetMonData(&gEnemyParty[0], MON_DATA_NICKNAME, &name);
+ if (lvl != FRONTIER_LVL_50)
+ {
+ lvl = SetFacilityPtrsGetLevel();
+ lvl -= wildMons[id].lvl;
+ lvl = lvl - 5 + (Random() % 11);
+ }
+ else
+ {
+ lvl = wildMons[id].lvl - 5 + ((Random() % 11));
+ }
+ SetMonData(&gEnemyParty[0],
+ MON_DATA_EXP,
+ &gExperienceTables[gBaseStats[wildMons[id].species].growthRate][lvl]);
+
+ switch (wildMons[id].abilityBit)
+ {
+ case 0:
+ case 1:
+ SetMonData(&gEnemyParty[0], MON_DATA_ALT_ABILITY, &wildMons[id].abilityBit);
+ break;
+ case 2:
+ default:
+ if (gBaseStats[wildMons[id].species].ability2)
+ {
+ i = GetMonData(&gEnemyParty[0], MON_DATA_PERSONALITY, NULL) % 2;
+ SetMonData(&gEnemyParty[0], MON_DATA_ALT_ABILITY, &i);
+ }
+ else
+ {
+ i = 0;
+ SetMonData(&gEnemyParty[0], MON_DATA_ALT_ABILITY, &i);
+ }
+ break;
+ }
+
+ for (i = 0; i < 4; i++)
+ SetMonMoveSlot(&gEnemyParty[0], wildMons[id].moves[i], i);
+
+ if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvl] >= 140) // BUG: Reading outside the array as lvl was used for mon level instead of frontier lvl mode.
+ {
+ id = (Random() % 17) + 15;
+ for (i = 0; i < NUM_STATS; i++)
+ SetMonData(&gEnemyParty[0], MON_DATA_HP_IV + i, &id);
+ }
+ CalculateMonStats(&gEnemyParty[0]);
+}
+
+u8 sub_81A9E28(void)
+{
+ u8 id = sub_81AA9E4();
+ return gUnknown_08613650[id].unk4;
+}
+
+u8 InBattlePyramid(void)
+{
+ if (gMapHeader.mapLayoutId == 361)
+ return 1;
+ else if (gMapHeader.mapLayoutId == 378)
+ return 2;
+ else
+ return FALSE;
+}
+
+bool8 InBattlePyramid_(void)
+{
+ return (gMapHeader.mapLayoutId == 361 || gMapHeader.mapLayoutId == 378);
+}
+
+void sub_81A9E90(void)
+{
+ if (InBattlePyramid())
+ {
+ sub_81A9834();
+ gSaveBlock2Ptr->frontier.field_CA8 = 2;
+ VarSet(VAR_TEMP_E, 0);
+ LoadPlayerParty();
+ }
+}
+
+void sub_81A9EC8(void)
+{
+ if (InBattlePyramid())
+ DoSoftReset();
+}
+
+void sub_81A9EDC(u16 trainerId)
+{
+ FrontierSpeechToString(gFacilityTrainers[trainerId].speechBefore);
+}
+
+void sub_81A9EFC(u16 trainerId)
+{
+ FrontierSpeechToString(gFacilityTrainers[trainerId].speechWin);
+}
+
+void sub_81A9F1C(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;
+
+ for (i = 0; i < ARRAY_COUNT(gUnknown_08613B44); i++)
+ {
+ if (gUnknown_08613B44[i].class == gFacilityClassToTrainerClass[gFacilityTrainers[trainerId].facilityClass])
+ return gUnknown_08613B44[i].music;
+ }
+ return 0;
+}
+
+void sub_81A9F80(void)
+{
+ ScriptContext1_SetupScript(BattleFrontier_BattlePyramidEmptySquare_EventScript_252C88);
+}
+
+u16 sub_81A9F90(u8 count)
+{
+ s32 i;
+ u16 trainerId;
+ u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
+ u32 challengeNum = gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] / 7;
+ u32 battleNum = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
+ if (battleNum == 7)
+ {
+ do
+ {
+ trainerId = sub_8162548(challengeNum + 1, battleNum);
+ for (i = 0 ; i < count; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
+ break;
+ }
+ } while (i != count);
+ }
+ else
+ {
+ do
+ {
+ trainerId = sub_8162548(challengeNum, battleNum);
+ for (i = 0 ; i < count; i++)
+ {
+ if (gSaveBlock2Ptr->frontier.field_CB4[i] == trainerId)
+ break;
+ }
+ } while (i != count);
+ }
+
+ return trainerId;
+}
+
+void sub_81AA078(u16 *mapArg, u8 arg1)
+{
+ s32 j, k;
+ s32 i;
+ u8 var0, var1;
+ u8 *allocated = AllocZeroed(0x10);
+
+ sub_81AA96C(allocated);
+ sub_81AA33C(&var0, &var1);
+ for (i = 0; i < 16; i++)
+ {
+ u16 *map;
+ s32 heightAdd, widthAdd;
+ const struct MapLayout *mapLayout = gMapLayouts[allocated[i] + 0x169];
+ const u16 *layoutMap = mapLayout->map;
+
+ gUnknown_03005DC0.map = mapArg;
+ gUnknown_03005DC0.width = mapLayout->width * 4 + 15;
+ gUnknown_03005DC0.height = mapLayout->height * 4 + 14;
+ map = mapArg;
+ heightAdd = (((i / 4 * mapLayout->height) + 7) * (gUnknown_03005DC0.width));
+ widthAdd = ((i % 4 * mapLayout->width) + 7);
+ map += heightAdd + widthAdd;
+ for (j = 0; j < mapLayout->height; j++)
+ {
+ for (k = 0; k < mapLayout->width; k++)
+ {
+ if ((layoutMap[k] & 0x3FF) != 0x28E)
+ {
+ map[k] = layoutMap[k];
+ }
+ else if (i != var1)
+ {
+ if (i == var0 && arg1 == 0)
+ {
+ gSaveBlock1Ptr->pos.x = (mapLayout->width * (i % 4)) + k;
+ gSaveBlock1Ptr->pos.y = (mapLayout->height * (i / 4)) + j;
+ }
+ map[k] = (layoutMap[k] & 0xFC00) | 0x28D;
+ }
+ else
+ {
+ map[k] = layoutMap[k];
+ }
+ }
+ map += 15 + (mapLayout->width * 4);
+ layoutMap += mapLayout->width;
+ }
+ }
+ mapheader_run_script_with_tag_x1();
+ free(allocated);
+}