tmc/src/demo.c

212 lines
6.0 KiB
C

/**
* @file demo.c
* @ingroup Tasks
*
* @brief Demo task
*/
#include "common.h"
#include "fileselect.h"
#include "functions.h"
#include "game.h"
#include "global.h"
#include "main.h"
#include "menu.h"
#include "message.h"
#include "screen.h"
#include "menu.h"
void sub_080A30AC(void);
void sub_080A2E40(void);
void sub_080A2FD0(void);
void sub_080A2F8C(void);
extern u8 gUnk_02000004;
void sub_080A3198(u32, u32);
extern u8 gUnk_08A05751[];
// sprite_table
extern void gUnk_089FD1B4;
extern void gUnk_089FD2F4;
extern u8 gUnk_08A068BF[129];
void DemoTask(void) {
static void (*const demoFunctions[])(void) = {
sub_080A2E40,
sub_080A2FD0,
sub_080A2F8C,
};
FlushSprites();
demoFunctions[gMain.state]();
sub_080A30AC();
CopyOAM();
}
void sub_080A2E40(void) {
DispReset(1);
InitSoundPlayingInfo();
MemClear((void*)VRAM, 0x80);
MessageInitialize();
EraseAllEntities();
ResetPalettes();
ResetPaletteTable(0);
MemClear(&gUI, sizeof gUI);
MemClear(&gChooseFileState, sizeof gChooseFileState);
MemClear(&gBG0Buffer, sizeof gBG0Buffer);
LoadGfxGroups();
LoadPaletteGroup(0xb5);
LoadGfxGroup(0x56);
MemCopy(&gUnk_089FD1B4, gPaletteBuffer + 96, 0x100);
MemCopy(&gUnk_089FD1B4, gPaletteBuffer + 352, 0x100);
MemCopy(&gUnk_089FD2F4, (void*)0x6000000, 0x8000);
MemCopy(&gUnk_089FD2F4, (void*)0x6010000, 0x8000);
MemCopy(&gUnk_08A05751, &gBG1Buffer, 0x800);
MemCopy(&gUnk_08A05751[0x800], &gBG2Buffer, 0x800);
gScreen.lcd.displayControl = 0x1f00;
gScreen.bg1.control = 0x1c81;
gScreen.bg2.control = 0x1d82;
gScreen.bg3.control = 0x1e0b;
gScreen.bg1.updated = 1;
gScreen.bg2.updated = 1;
gScreen.bg3.updated = 1;
gScreen.controls.layerFXControl = 0x1044;
gScreen.controls.alphaBlend = 0xb04;
{
// TODO write to 0x2000004
u32 addr = (0x80 << 0x12);
*(u8*)(addr + 4) = 0;
}
sub_080A3198(0, 0);
gMain.state = GAMETASK_INIT;
SoundReq(BGM_FILE_SELECT);
SetFade(FADE_INSTANT, 8);
}
void sub_080A2F8C(void) {
if (gFadeControl.active == 0) {
switch (gMain.substate) {
case GAMEMAIN_INITROOM:
gMain.substate = GAMEMAIN_CHANGEROOM;
{
// TODO write to 0x2000005
u32 addr = (0x80 << 0x12);
*(u8*)(addr + 5) = 1;
*(u8*)(addr + 6) = 1;
}
gMain.state = GAMETASK_MAIN;
SetFade(FADE_IN_OUT | FADE_INSTANT, 8);
break;
case GAMEMAIN_CHANGEROOM:
SetTask(TASK_GAME);
break;
}
}
}
void sub_080A2FD0(void) {
u32 val;
s32 tmp3;
if (gFadeControl.active == 0) {
val = 0;
switch (gInput.heldKeys) {
case DPAD_LEFT:
if (gChooseFileState.unk_0x0 == 0) {
val = -1;
gChooseFileState.unk_0x20 = -4;
SoundReq(SFX_TEXTBOX_CHOICE);
}
break;
case DPAD_RIGHT:
if (gChooseFileState.unk_0x0 == 0) {
val = 1;
gChooseFileState.unk_0x20 = 4;
SoundReq(SFX_TEXTBOX_CHOICE);
}
break;
case START_BUTTON:
case A_BUTTON:
if (gChooseFileState.unk_0x0 == 0) {
gMain.state = 2;
gMain.substate = gChooseFileState.unk_0x0;
SoundReq(SFX_TEXTBOX_SELECT);
}
break;
case DPAD_UP:
case DPAD_DOWN:
break;
}
gSaveHeader->saveFileId = (int)(gSaveHeader->saveFileId + 3 + val) % 3;
tmp3 = gChooseFileState.unk_0x10;
if (gSaveHeader->saveFileId * 0x68 != tmp3) {
gChooseFileState.unk_0x10 = (tmp3 + gChooseFileState.unk_0x20 + 0x138) % 0x138;
gChooseFileState.unk_0x0 = 1;
} else {
gChooseFileState.unk_0x0 = 0;
}
sub_080A3198(gSaveHeader->saveFileId, 0);
}
}
void sub_080A30AC(void) {
s32 unk_0x10;
u8* ptr;
u8* currentPtr;
u32 offset;
gOamCmd._4 = 0x2000;
gOamCmd._6 = 0;
gOamCmd._8 = 0xc00;
gOamCmd.y = 0x40;
unk_0x10 = (s16)gGenericMenu.unk10.h[0];
gOamCmd.x = -0x128 - unk_0x10;
offset = *(u32*)gUnk_08A068BF;
ptr = gUnk_08A068BF - 0xc;
sub_080ADA04(&gOamCmd, ptr + offset);
gOamCmd.x = -0xc0 - unk_0x10;
sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 4));
gOamCmd.x = -0x58 - unk_0x10;
sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 8));
gOamCmd.x = 0x10 - unk_0x10;
sub_080ADA04(&gOamCmd, ptr + *(u32*)(gUnk_08A068BF));
gOamCmd.x = 0x78 - unk_0x10;
sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 4));
gOamCmd.x = 0xe0 - unk_0x10;
sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 8));
gOamCmd.x = 0x148 - unk_0x10;
sub_080ADA04(&gOamCmd, ptr + *(u32*)(gUnk_08A068BF));
gOamCmd.x = 0x1b0 - unk_0x10;
sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 4));
gOamCmd.x = 0x218 - unk_0x10;
sub_080ADA04(&gOamCmd, ptr + *(u32*)(ptr + 8));
}
void sub_080A3198(u32 param_1, u32 param_2) {
static const Font gUnk_08127C98[] = {
{ &gBG0Buffer[0x1ef], BG_TILE_ADDR(0x1a0), gTextGfxBuffer, 0, 0x1080, 0xd0, 1, 0, 0, 1, 9, 0, 0, 1, 1 },
{ &gBG0Buffer[0x22f], BG_TILE_ADDR(0x1a0), gTextGfxBuffer, 0, 0x80, 0xd0, 1, 0, 0, 1, 9, 0, 0, 1, 1 },
};
static const u16 gUnk_08127CC8[4] = {
TEXT_INDEX(TEXT_WINDCRESTS, 0x1c),
TEXT_INDEX(TEXT_WINDCRESTS, 0x20),
TEXT_INDEX(TEXT_WINDCRESTS, 0x21),
0x0,
};
u16 textIndex = gUnk_08127CC8[param_1];
if (gChooseFileState.unk_0x12 != textIndex) {
gChooseFileState.unk_0x12 = textIndex;
MemClear(gUnk_08127C98[0].dest - 0xf, 0x180);
if (textIndex != 0) {
ShowTextBox(textIndex, gUnk_08127C98);
}
gScreen.bg0.updated = 1;
}
}