Begin battle pyramid

This commit is contained in:
DizzyEggg
2018-11-17 15:30:34 +01:00
parent 032dd251e6
commit eb66b60f38
9 changed files with 2913 additions and 3593 deletions

425
src/battle_pyramid.c Normal file
View File

@@ -0,0 +1,425 @@
#include "global.h"
#include "battle_pyramid_bag.h"
#include "event_data.h"
#include "battle.h"
#include "battle_setup.h"
#include "battle_tower.h"
#include "save.h"
#include "fieldmap.h"
#include "palette.h"
#include "field_message_box.h"
#include "random.h"
#include "item.h"
#include "util.h"
#include "sound.h"
#include "task.h"
#include "start_menu.h"
#include "constants/battle_frontier.h"
#include "constants/event_objects.h"
extern void door_upload_tiles(void);
#define PICKUP_ITEMS_SET_COUNT 20
struct Struct_08613650
{
u8 unk0;
u8 unk1;
u8 unk2;
u8 unk3;
u8 unk4;
u8 unk5;
u8 unk6[10];
};
extern const u16 gBattleFrontierHeldItems[];
extern const struct FacilityMon gBattleFrontierMons[];
extern const struct BattleFrontierTrainer gBattleFrontierTrainers[];
// 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);
bool8 InBattlePyramid(void);
void sub_81A97DC(u8 taskId);
// 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 u8 gUnknown_08613ABC[63][2];
extern const u8 gUnknown_08613B3A[];
extern const u16 gUnknown_08613F34[9];
extern const u16 gUnknown_08613F28[6];
// code
void sub_81A8E7C(void)
{
gUnknown_08613EE0[gSpecialVar_0x8004]();
}
void sub_81A8E9C(void)
{
bool32 isCurrent;
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
gSaveBlock2Ptr->frontier.field_CA8 = 0;
gSaveBlock2Ptr->frontier.curChallengeBattleNum = 0;
gSaveBlock2Ptr->frontier.field_CA9_a = 0;
if (lvlMode != FRONTIER_LVL_50)
isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x2000;
else
isCurrent = gSaveBlock2Ptr->frontier.field_CDC & 0x1000;
if (!isCurrent)
{
gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] = 0;
sub_81AAA7C(lvlMode);
}
sub_81C4EEC();
gTrainerBattleOpponent_A = 0;
gBattleOutcome = 0;
}
void sub_81A8F38(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
switch (gSpecialVar_0x8005)
{
case 0:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_E18;
break;
case 1:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode];
break;
case 2:
if (lvlMode != FRONTIER_LVL_50)
gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x2000;
else
gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x1000;
break;
case 3:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_50];
break;
case 4:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_OPEN];
break;
case 5:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x1000;
break;
case 6:
gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_CDC & 0x2000;
break;
}
}
void sub_81A9048(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
switch (gSpecialVar_0x8005)
{
case 0:
gSaveBlock2Ptr->frontier.field_E18 = gSpecialVar_0x8006;
break;
case 1:
gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] = gSpecialVar_0x8006;
break;
case 2:
if (lvlMode != FRONTIER_LVL_50)
{
if (gSpecialVar_0x8006)
gSaveBlock2Ptr->frontier.field_CDC |= 0x2000;
else
gSaveBlock2Ptr->frontier.field_CDC &= ~(0x2000);
}
else
{
if (gSpecialVar_0x8006)
gSaveBlock2Ptr->frontier.field_CDC |= 0x1000;
else
gSaveBlock2Ptr->frontier.field_CDC &= ~(0x1000);
}
break;
case 7:
gSaveBlock2Ptr->frontier.field_E2A = gSpecialVar_0x8006;
break;
}
}
void sub_81A9134(void)
{
gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005;
VarSet(VAR_TEMP_0, 0);
gSaveBlock2Ptr->frontier.field_CA9_a = 1;
save_serialize_map();
TrySavingData(SAVE_LINK);
}
void sub_81A917C(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] > 41)
gSaveBlock2Ptr->frontier.field_E18 = gUnknown_08613F34[Random() % ARRAY_COUNT(gUnknown_08613F34)];
else
gSaveBlock2Ptr->frontier.field_E18 = gUnknown_08613F28[Random() % ARRAY_COUNT(gUnknown_08613F28)];
}
void sub_81A91FC(void)
{
if (AddBagItem(gSaveBlock2Ptr->frontier.field_E18, 1) == TRUE)
{
CopyItemName(gSaveBlock2Ptr->frontier.field_E18, gStringVar1);
gSaveBlock2Ptr->frontier.field_E18 = 0;
gSpecialVar_Result = TRUE;
}
else
{
gSpecialVar_Result = FALSE;
}
}
void sub_81A9254(void)
{
s32 i;
for (i = 0; i < 4; i++)
gSaveBlock2Ptr->frontier.field_E22[i] = Random();
gSaveBlock2Ptr->frontier.field_E2A = 0;
}
void sub_81A9290(void)
{
s32 i;
s32 r7;
s32 rand;
u8 id;
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
u32 floor = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
u32 setId = (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] / 7) % PICKUP_ITEMS_SET_COUNT;
if (setId >= PICKUP_ITEMS_SET_COUNT)
setId = PICKUP_ITEMS_SET_COUNT - 1;
id = sub_81AA9E4();
r7 = (gSpecialVar_LastTalked - gUnknown_08613650[id].unk1) - 1;
rand = gSaveBlock2Ptr->frontier.field_E22[r7 / 2];
SeedRng2(rand);
for (i = 0; i < r7 + 1; i++)
rand = Random2() % 100;
for (i = gUnknown_08613B3A[floor]; i < ARRAY_COUNT(gUnknown_08613ABC); i++)
{
if (rand < gUnknown_08613ABC[i][0])
break;
}
if (lvlMode != FRONTIER_LVL_50)
gSpecialVar_0x8000 = sPickupItemsLvlOpen[setId][gUnknown_08613ABC[i][1]];
else
gSpecialVar_0x8000 = sPickupItemsLvl50[setId][gUnknown_08613ABC[i][1]];
gSpecialVar_0x8001 = 1;
}
void sub_81A93C8(void)
{
struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates;
s32 i = 0;
for (;;)
{
if (events[i].localId == gSpecialVar_LastTalked)
{
events[i].x = 0x7FFF;
events[i].y = 0x7FFF;
break;
}
i++;
if (events[i].localId == 0)
break;
}
}
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;
s32 var_24;
u8 id;
s32 class = 0;
s32 r7 = 0;
struct EventObjectTemplate *events = gSaveBlock1Ptr->eventObjectTemplates;
u16 trainerId = sub_81A9AA8(gEventObjects[gSelectedEventObject].localId);
for (i = 0; i < ARRAY_COUNT(gUnknown_08613C1C); i++)
{
if (gUnknown_08613C1C[i][0] == gFacilityTrainers[trainerId].facilityClass)
{
class = gUnknown_08613C1C[i][1];
break;
}
}
var_24 = gUnknown_08613ED8[gEventObjects[gSelectedEventObject].localId - 1];
i = 0;
while (!i)
{
switch (var_24)
{
case 0:
r7 = sub_81A9998(&var_24, 8, 0);
i = 1;
break;
case 1:
for (i = 0; i < sub_81AAA40(); i++)
{
if (events[i].graphicsId == EVENT_OBJ_GFX_ITEM_BALL && events[i].x != 0x7FFF && events[i].y != 0x7FFF)
r7++;
}
i = 1;
break;
case 2:
id = sub_81AA9E4();
r7 = gUnknown_08613650[id].unk1;
for (i = 0; i < 8; i++)
{
if (gBitTable[i] & gSaveBlock2Ptr->frontier.field_E2A)
r7--;
}
i = 1;
break;
case 3:
sub_81A9998(&var_24, 8, 2);
break;
case 4:
sub_81A9998(&var_24, 8, 1);
break;
case 5:
sub_81A9998(&var_24, 16, 2);
break;
case 6:
sub_81A9998(&var_24, 16, 1);
break;
case 7:
sub_81A9998(&var_24, 24, 2);
break;
case 8:
sub_81A9998(&var_24, 24, 1);
break;
}
}
ShowFieldMessage(gUnknown_08613EC0[class][var_24][r7]);
}
void sub_81A9618(void)
{
u32 lvlMode = gSaveBlock2Ptr->frontier.lvlMode;
if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] < 999)
gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode]++;
if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] > gSaveBlock2Ptr->frontier.pyramidRecordStreaks[lvlMode])
gSaveBlock2Ptr->frontier.pyramidRecordStreaks[lvlMode] = gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode];
}
void sub_81A966C(void)
{
gSpecialVar_Result = InBattlePyramid();
}
void sub_81A9684(void)
{
switch (gSpecialVar_0x8006)
{
case 0:
gSaveBlock2Ptr->frontier.field_E68 = gSpecialVar_0x8005;
break;
case 1:
switch (gSpecialVar_Result)
{
case 0:
if (!gPaletteFade.active)
{
if (gSaveBlock2Ptr->frontier.field_E68 >= 120)
gSaveBlock2Ptr->frontier.field_E68 = 120;
else
PlaySE(gSpecialVar_0x8007);
gSpecialVar_Result++;
}
break;
case 1:
if (gSpecialVar_0x8005 != 0)
{
gSpecialVar_0x8005--;
gSaveBlock2Ptr->frontier.field_E68++;
if (gSaveBlock2Ptr->frontier.field_E68 > 120)
{
gSaveBlock2Ptr->frontier.field_E68 = 120;
gSpecialVar_Result++;
}
door_upload_tiles();
}
else
{
gSpecialVar_Result = 2;
}
break;
case 2:
default:
break;
}
break;
}
}
void sub_81A975C(void)
{
s32 i, j;
u16 item = 0;
for (i = 0; i < PARTY_SIZE; i++)
{
for (j = 0; j < 4; j++)
{
if (gSaveBlock2Ptr->frontier.selectedPartyMons[j] != 0 && gSaveBlock2Ptr->frontier.selectedPartyMons[j] - 1 == i)
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &item);
}
}
}
void sub_81A97C8(void)
{
CreateTask(sub_81A97DC, 0);
}
extern const u16 gUnknown_08D856C8[][16];
void sub_81A97DC(u8 taskId)
{
if (gPaletteFade.active)
{
CpuCopy16(gUnknown_08D856C8[gSaveBlock2Ptr->frontier.curChallengeBattleNum], &gPlttBufferUnfaded[96], 32);
DestroyTask(taskId);
}
}
void sub_81A9828(void)
{
sub_809FDD4();
}

View File

@@ -9860,71 +9860,72 @@ static void atkE4_getsecretpowereffect(void)
static void atkE5_pickup(void)
{
if (!InBattlePike())
s32 i;
u16 species, heldItem;
u8 ability;
if (InBattlePike())
{
s32 i;
u16 species, heldItem;
u8 ability;
if (InBattlePyramid())
}
else if (InBattlePyramid())
{
for (i = 0; i < PARTY_SIZE; i++)
{
for (i = 0; i < 6; i++)
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY))
ability = gBaseStats[species].ability2;
else
ability = gBaseStats[species].ability1;
if (ability == ABILITY_PICKUP
&& species != 0
&& species != SPECIES_EGG
&& heldItem == ITEM_NONE
&& (Random() % 10) == 0)
{
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY))
ability = gBaseStats[species].ability2;
else
ability = gBaseStats[species].ability1;
if (ability == ABILITY_PICKUP
&& species != 0
&& species != SPECIES_EGG
&& heldItem == ITEM_NONE
&& (Random() % 10) == 0)
{
heldItem = GetBattlePyramidPickupItemId();
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem);
}
heldItem = GetBattlePyramidPickupItemId();
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem);
}
}
else
}
else
{
for (i = 0; i < PARTY_SIZE; i++)
{
for (i = 0; i < 6; i++)
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY))
ability = gBaseStats[species].ability2;
else
ability = gBaseStats[species].ability1;
if (ability == ABILITY_PICKUP
&& species != 0
&& species != SPECIES_EGG
&& heldItem == ITEM_NONE
&& (Random() % 10) == 0)
{
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
s32 j;
s32 rand = Random() % 100;
u8 lvlDivBy10 = (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) - 1) / 10;
if (lvlDivBy10 > 9)
lvlDivBy10 = 9;
if (GetMonData(&gPlayerParty[i], MON_DATA_ALT_ABILITY))
ability = gBaseStats[species].ability2;
else
ability = gBaseStats[species].ability1;
if (ability == ABILITY_PICKUP
&& species != 0
&& species != SPECIES_EGG
&& heldItem == ITEM_NONE
&& (Random() % 10) == 0)
for (j = 0; j < 9; j++)
{
s32 j;
s32 rand = Random() % 100;
u8 lvlDivBy10 = (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) - 1) / 10;
if (lvlDivBy10 > 9)
lvlDivBy10 = 9;
for (j = 0; j < 9; j++)
if (sPickupProbabilities[j] > rand)
{
if (sPickupProbabilities[j] > rand)
{
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &sPickupItems[lvlDivBy10 + j]);
break;
}
else if (rand == 99 || rand == 98)
{
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &sRarePickupItems[lvlDivBy10 + (99 - rand)]);
break;
}
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &sPickupItems[lvlDivBy10 + j]);
break;
}
else if (rand == 99 || rand == 98)
{
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &sRarePickupItems[lvlDivBy10 + (99 - rand)]);
break;
}
}
}

View File

@@ -1485,7 +1485,7 @@ const u32 gUnknown_08DD4C4C[] = INCBIN_U32("graphics/link/link_winedge.bin.lz");
const u32 gUnknown_08DD4CF8[] = INCBIN_U32("graphics/interface/unk_change_case.4bpp.lz");
const u16 gTilesetPalettes_General[][16] =
const u16 gTilesetPalettes_General[][16] =
{
INCBIN_U16("data/tilesets/primary/general/palettes/00.gbapal"),
INCBIN_U16("data/tilesets/primary/general/palettes/01.gbapal"),