summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2017-11-05 12:05:07 +0100
committerDizzyEggg <jajkodizzy@wp.pl>2017-11-05 12:05:07 +0100
commitbd56bb073f87eeca6e71b14ab1ec0a11ea1ee3a4 (patch)
treea9407d270e335b796c8d44a236b76ea6d6c1364a /src
parentaf197ccd3bd62fab813154dc4311e65f9992a676 (diff)
start working on hall of fame
Diffstat (limited to 'src')
-rw-r--r--src/hall_of_fame.c319
1 files changed, 319 insertions, 0 deletions
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index d9fd40b84..d63efe21e 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -1,4 +1,323 @@
#include "global.h"
#include "hall_of_fame.h"
+#include "task.h"
+#include "palette.h"
+#include "sprite.h"
+#include "pokemon.h"
+#include "text.h"
+#include "malloc.h"
+#include "gpu_regs.h"
+#include "main.h"
+#include "sound.h"
+#include "songs.h"
+#include "decompress.h"
+#include "save.h"
+#include "window.h"
+#include "bg.h"
+#include "species.h"
+struct HallofFameMon
+{
+ u32 tid;
+ u32 personality;
+ u16 species : 9;
+ u16 lvl : 7;
+ u8 nick[10];
+};
+struct HallofFameMons
+{
+ struct HallofFameMon mons[6];
+};
+
+extern struct HallofFameMons *gHofMonsPtr;
+
+struct HofGfx
+{
+ u16 field_0;
+ u8 field_2[0x2010];
+};
+
+extern struct HofGfx *gUnknown_0203BCDC;
+
+extern u32 gUnknown_0203BCD4;
+extern bool8 HasHallOfFameRecords;
+extern u8 gDecompressionBuffer[];
+
+#define HALL_OF_FAME_MAX_TEAMS 50
+
+// strings
+extern const u8 gText_SavingDontTurnOffPower[];
+
+extern void sub_81973C4(u8, u8);
+extern u16 AddTextPrinterParametrized(u8 windowId, u8 fontId, const u8 *str, u8 speed, void ( *callback)(u16, struct TextPrinter *), u8 fgColor, u8 bgColor, u8 shadowColor);
+
+// this file's functions
+void sub_8174EC4(void);
+void sub_8174F70(void);
+void sub_8174FAC(void);
+bool8 sub_8175024(void);
+void sub_817371C(u8 taskId);
+void sub_81738BC(u8 taskId);
+void sub_8173A8C(u8 taskId);
+void sub_81739C4(u8 taskId);
+void sub_8173A5C(u8 taskId);
+void sub_8173AA8(u8 taskId);
+void sub_8173BC0(u8 taskId);
+void sub_8175120(struct Sprite *sprite);
+
+void VBlankCB_HallOfFame(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_HallOfFame(void)
+{
+ RunTasks();
+ RunTextPrinters();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+bool8 sub_817357C(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ sub_8174EC4();
+ gUnknown_0203BCDC = AllocZeroed(sizeof(*gUnknown_0203BCDC));
+ gMain.state = 1;
+ break;
+ case 1:
+ sub_8174F70();
+ gMain.state++;
+ break;
+ case 2:
+ SetGpuReg(REG_OFFSET_BLDCNT, 0x3F42);
+ SetGpuReg(REG_OFFSET_BLDALPHA, 0x710);
+ SetGpuReg(REG_OFFSET_BLDY, 0);
+ sub_8174FAC();
+ gUnknown_0203BCDC->field_0 = 0;
+ gMain.state++;
+ break;
+ case 3:
+ if (!sub_8175024())
+ {
+ SetVBlankCallback(VBlankCB_HallOfFame);
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ gMain.state++;
+ }
+ break;
+ case 4:
+ UpdatePaletteFade();
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CB2_HallOfFame);
+ PlayBGM(BGM_DENDOU);
+ return FALSE;
+ }
+ break;
+ }
+ return TRUE;
+}
+
+#define tData0 data[0]
+#define tDisplayedPoke data[1]
+#define tPokesNumber data[2]
+#define tFrameCount data[3]
+#define tPlayerSpriteID data[4]
+#define tMonSpriteID(i) data[i + 5]
+
+void sub_8173694(void)
+{
+ if (!sub_817357C())
+ {
+ u8 taskId = CreateTask(sub_817371C, 0);
+ gTasks[taskId].tData0 = 0;
+ gHofMonsPtr = AllocZeroed(sizeof(*gHofMonsPtr));
+ }
+}
+
+void sub_81736D8(void)
+{
+ if (!sub_817357C())
+ {
+ u8 taskId = CreateTask(sub_817371C, 0);
+ gTasks[taskId].tData0 = 1;
+ gHofMonsPtr = AllocZeroed(sizeof(*gHofMonsPtr));
+ }
+}
+
+void sub_817371C(u8 taskId)
+{
+ u16 i, j;
+
+ gTasks[taskId].tPokesNumber = 0; // valid pokes
+
+ for (i = 0; i < 6; i++)
+ {
+ u8 nick[POKEMON_NAME_LENGTH + 2];
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES))
+ {
+ gHofMonsPtr->mons[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ gHofMonsPtr->mons[i].tid = GetMonData(&gPlayerParty[i], MON_DATA_OT_ID);
+ gHofMonsPtr->mons[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);
+ gHofMonsPtr->mons[i].lvl = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
+ GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nick);
+ for (j = 0; j < POKEMON_NAME_LENGTH; j++)
+ {
+ gHofMonsPtr->mons[i].nick[j] = nick[j];
+ }
+ gTasks[taskId].tPokesNumber++;
+ }
+ else
+ {
+ gHofMonsPtr->mons[i].species = 0;
+ gHofMonsPtr->mons[i].tid = 0;
+ gHofMonsPtr->mons[i].personality = 0;
+ gHofMonsPtr->mons[i].lvl = 0;
+ gHofMonsPtr->mons[i].nick[0] = EOS;
+ }
+ }
+
+ gUnknown_0203BCD4 = 0;
+ gTasks[taskId].tDisplayedPoke = 0;
+ gTasks[taskId].tPlayerSpriteID = 0xFF;
+
+ for (i = 0; i < 6; i++)
+ {
+ gTasks[taskId].tMonSpriteID(i) = 0xFF;
+ }
+
+ if (gTasks[taskId].tData0)
+ gTasks[taskId].func = sub_8173A8C;
+ else
+ gTasks[taskId].func = sub_81738BC;
+}
+
+void sub_81738BC(u8 taskId)
+{
+ u16 i;
+ struct HallofFameMons* lastSavedTeam = (struct HallofFameMons*)(gDecompressionBuffer);
+
+ if (!HasHallOfFameRecords)
+ {
+ memset(gDecompressionBuffer, 0, 0x2000);
+ }
+ else
+ {
+ if (sub_81534D0(3) != TRUE)
+ memset(gDecompressionBuffer, 0, 0x2000);
+ }
+
+ for (i = 0; i < HALL_OF_FAME_MAX_TEAMS; i++, lastSavedTeam++)
+ {
+ if (lastSavedTeam->mons[0].species == 0)
+ break;
+ }
+ if (i >= HALL_OF_FAME_MAX_TEAMS)
+ {
+ struct HallofFameMons *afterTeam = (struct HallofFameMons*)(gDecompressionBuffer);
+ struct HallofFameMons *beforeTeam = (struct HallofFameMons*)(gDecompressionBuffer);
+ afterTeam++;
+ for (i = 0; i < HALL_OF_FAME_MAX_TEAMS - 1; i++, beforeTeam++, afterTeam++)
+ {
+ *beforeTeam = *afterTeam;
+ }
+ lastSavedTeam--;
+ }
+ *lastSavedTeam = *gHofMonsPtr;
+
+ sub_81973C4(0, 0);
+ AddTextPrinterParametrized(0, 1, gText_SavingDontTurnOffPower, 0, NULL, 2, 1, 3);
+ CopyWindowToVram(0, 3);
+ gTasks[taskId].func = sub_81739C4;
+}
+
+extern u8 TrySavingData(u8);
+extern MainCallback gGameContinueCallback;
+extern u32 gDamagedSaveSectors;
+
+void sub_81739C4(u8 taskId)
+{
+ gGameContinueCallback = sub_81736D8;
+ if (TrySavingData(3) == 0xFF && gDamagedSaveSectors != 0)
+ {
+ UnsetBgTilemapBuffer(1);
+ UnsetBgTilemapBuffer(3);
+ FreeAllWindowBuffers();
+
+ if (gUnknown_0203BCDC != NULL)
+ FREE_AND_SET_NULL(gUnknown_0203BCDC);
+ if (gHofMonsPtr != NULL)
+ FREE_AND_SET_NULL(gHofMonsPtr);
+
+ DestroyTask(taskId);
+ }
+ else
+ {
+ PlaySE(SE_SAVE);
+ gTasks[taskId].func = sub_8173A5C;
+ gTasks[taskId].tFrameCount = 32;
+ }
+}
+
+void sub_8173A5C(u8 taskId)
+{
+ if (gTasks[taskId].tFrameCount)
+ gTasks[taskId].tFrameCount--;
+ else
+ gTasks[taskId].func = sub_8173A8C;
+}
+
+void sub_8173A8C(u8 taskId)
+{
+ gTasks[taskId].func = sub_8173AA8;
+}
+
+extern const s16 sHallOfFame_MonsFullTeamPositions[][4];
+extern const s16 sHallOfFame_MonsHalfTeamPositions[][4];
+
+extern u8 sub_818D3E4(u16 species, u32 trainerId, u32 personality, u8 flags, s16 x, s16 y, u8, u16);
+extern void sub_8197434(u8, u8);
+
+void sub_8173AA8(u8 taskId)
+{
+ u8 spriteId;
+ s16 xPos, yPos, field4, field6;
+
+ u16 currPokeID = gTasks[taskId].tDisplayedPoke;
+ struct HallofFameMon* currMon = &gHofMonsPtr->mons[currPokeID];
+
+ if (gTasks[taskId].tPokesNumber > 3)
+ {
+ xPos = sHallOfFame_MonsFullTeamPositions[currPokeID][0];
+ yPos = sHallOfFame_MonsFullTeamPositions[currPokeID][1];
+ field4 = sHallOfFame_MonsFullTeamPositions[currPokeID][2];
+ field6 = sHallOfFame_MonsFullTeamPositions[currPokeID][3];
+ }
+ else
+ {
+ xPos = sHallOfFame_MonsHalfTeamPositions[currPokeID][0];
+ yPos = sHallOfFame_MonsHalfTeamPositions[currPokeID][1];
+ field4 = sHallOfFame_MonsHalfTeamPositions[currPokeID][2];
+ field6 = sHallOfFame_MonsHalfTeamPositions[currPokeID][3];
+ }
+
+ if (currMon->species == SPECIES_EGG)
+ field6 += 10;
+
+ spriteId = sub_818D3E4(currMon->species, currMon->tid, currMon->personality, 1, xPos, yPos, currPokeID, 0xFFFF);
+ gSprites[spriteId].data1 = field4;
+ gSprites[spriteId].data2 = field6;
+ gSprites[spriteId].data0 = 0;
+ gSprites[spriteId].data7 = currMon->species;
+ gSprites[spriteId].callback = sub_8175120;
+ gTasks[taskId].tMonSpriteID(currPokeID) = spriteId;
+ sub_8197434(0, 1);
+ gTasks[taskId].func = sub_8173BC0;
+}