diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main_menu.c | 2 | ||||
| -rw-r--r-- | src/naming_screen.c | 559 | 
2 files changed, 560 insertions, 1 deletions
| diff --git a/src/main_menu.c b/src/main_menu.c index dee9af852..c586e2b08 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -1081,7 +1081,7 @@ static void Task_NewGameSpeech22(u8 taskId)      if (!gPaletteFade.active)      {          SetPresetPlayerName(1); -        DoNamingScreen(0, &gSaveBlock2, gSaveBlock2.playerGender, 0, 0, CB_ContinueNewGameSpeechPart2); +        DoNamingScreen(0, gSaveBlock2.playerName, gSaveBlock2.playerGender, 0, 0, CB_ContinueNewGameSpeechPart2);      }  } diff --git a/src/naming_screen.c b/src/naming_screen.c new file mode 100644 index 000000000..91860b604 --- /dev/null +++ b/src/naming_screen.c @@ -0,0 +1,559 @@ +#include "global.h" +#include "asm.h" +#include "main.h" +#include "menu.h" +#include "palette.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + +struct UnknownStruct2 +{ +    u8 unk0; +    u8 unk1; +    u8 unk2; +    u8 unk3; +    u8 unk4; +    u8 unk5; +    u8 unk6; +    u8 unk7; +    const u8 *title; +}; + +struct UnknownStruct1 +{ +    u8 unk0;  //state +    u8 unk1; +    u16 unk2; +    u16 unk4; +    u16 unk6; +    u16 unk8; +    u16 unkA; +    u8 unkC; +    u8 unkD; +    u8 unkE; +    u8 fillerF[2]; +    u8 unk11[0x10]; +    u8 filler21[0x13]; +    /*0x34*/ const struct UnknownStruct2 *unk34; +    /*0x38*/ u8 *nameBuffer; +    u16 unk3C;  //savedKeyRepeatStartDelay +    u16 unk3E; +    u16 unk40; +    u32 unk44; +    /*0x48*/ MainCallback returnCallback; +}; + +extern u16 gKeyRepeatStartDelay; + +extern u8 unk_2000000[]; + +#define EWRAM_000000 (*(struct UnknownStruct1 *)(unk_2000000)) + +extern const struct UnknownStruct2 *const gUnknown_083CE398[]; +extern u8 (*const gUnknown_083CE218[])(struct Task *); +extern u8 (*const gUnknown_083CE240[])(u8); + +void C2_NamingScreen(void); +void sub_80B5AA0(void); +//void AddNamingScreenTask(); +void AddNamingScreenTask(u8, u8 *, u16, u16, u32, MainCallback); +void NamingScreen_TurnOffScreen(void); +void NamingScreen_Init(void); +void NamingScreen_ClearVram(void); +void NamingScreen_ClearOam(void); +void NamingScreen_SetUpVideoRegs(void); +void sub_80B5DC8(void); +void NamingScreen_ResetObjects(void); +void sub_80B5DFC(void); +void sub_80B5E20(void); +void sub_80B5E3C(void); +void sub_80B5C04(void); +void NamingScreenDummyTask(u8); +void sub_80B7558(void); +void sub_80B753C(void); +void sub_80B7680(void); +void sub_80B75C4(void); +void sub_80B7794(void); +void sub_80B78A8(void); +void sub_80B7960(void); +void sub_80B6774(void); +void sub_80B6A80(void); +void sub_80B6CA8(void); +void sub_80B6D04(void); +void sub_80B6E44(void); +void sub_80B61D8(void); +void sub_80B6438(void); +void sub_80B5E50(void); +void sub_80B5E70(u8); +void sub_80B6210(u8); +void sub_80B68D8(); +u8 sub_80B60B8(void); +u8 sub_80B6938(void); +void sub_80B6878(void); +void sub_80B6B14(void); +void sub_80B65F0(void); +void sub_80B6888(); +void sub_80B6460(); +u8 sub_80B6610(void); +void sub_80B7614(void); +void sub_80B6858(); +void sub_80B680C(); +void sub_80B77F8(void); +void sub_80B74B0(void); +void sub_80B74FC(void); +u8 sub_80B6958(void); +u8 sub_80B61C8(void); +void sub_80B6FBC(void); +void sub_80B7090(void); +u8 sub_80B61EC(void); +u8 sub_80B7004(void); +void sub_80B6914(void); +void sub_80B623C(u8); + +void DoNamingScreen(u8 a, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +{ +    AddNamingScreenTask(a, nameBuffer, c, d, e, returnCallback); +    SetMainCallback2(C2_NamingScreen); +} + +void C2_NamingScreen(void) +{ +    switch (gMain.state) +    { +    case 0: +        NamingScreen_TurnOffScreen(); +        NamingScreen_Init(); +        gMain.state++; +        break; +    case 1: +        NamingScreen_ClearVram(); +        gMain.state++; +        break; +    case 2: +        NamingScreen_ClearOam(); +        gMain.state++; +        break; +    case 3: +        NamingScreen_SetUpVideoRegs(); +        gMain.state++; +        break; +    case 4: +        sub_80B5DC8(); +        gMain.state++; +        break; +    case 5: +        NamingScreen_ResetObjects(); +        gMain.state++; +        break; +    case 6: +        sub_80B5DFC(); +        gMain.state++; +        break; +    case 7: +        sub_80B5E20(); +        sub_80B5E3C(); +        sub_80B5C04(); +        SetMainCallback2(sub_80B5AA0); +        break; +    } +} + +void sub_80B5AA0(void) +{ +    RunTasks(); +    AnimateSprites(); +    BuildOamBuffer(); +    UpdatePaletteFade(); +} + +void sub_80B5AB8(void) +{ +    LoadOam(); +    ProcessSpriteCopyRequests(); +    TransferPlttBuffer(); +    REG_BG1VOFS = EWRAM_000000.unk4; +    REG_BG2VOFS = EWRAM_000000.unk6; +    REG_BG1CNT &= 0xFFFC; +    REG_BG1CNT |= EWRAM_000000.unk8; +    REG_BG2CNT &= 0xFFFC; +    REG_BG2CNT |= EWRAM_000000.unkA; +} + +void AddNamingScreenTask(u8 a, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +{ +    struct Task *task; +     +    task = &gTasks[CreateTask(NamingScreenDummyTask, 0xFF)]; +    task->data[0] = a; +    task->data[1] = c; +    task->data[2] = d; +    task->data[3] = e >> 16; +    task->data[4] = e; +    StoreWordInTwoHalfwords(&task->data[5], (u32)nameBuffer); +    StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback); +} + +void GetNamingScreenParameters(void) +{ +    u8 taskId; +    struct Task *task; +     +    taskId = FindTaskIdByFunc(NamingScreenDummyTask); +    task = &gTasks[taskId]; +    EWRAM_000000.unk1 = task->data[0]; +    EWRAM_000000.unk3E = task->data[1]; +    EWRAM_000000.unk40 = task->data[2]; +    EWRAM_000000.unk44 = (task->data[3] << 16) | (u16)task->data[4]; +    LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&EWRAM_000000.nameBuffer); +    LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&EWRAM_000000.returnCallback); +    DestroyTask(taskId); +} + +void NamingScreenDummyTask(u8 taskId) +{ +} + +void NamingScreen_TurnOffScreen(void) +{ +    SetVBlankCallback(NULL); +    SetHBlankCallback(NULL); +    REG_DISPCNT = 0; +} + +void sub_80B5C04(void) +{ +    u16 savedIme; +     +    SetVBlankCallback(sub_80B5AB8); +    savedIme = REG_IME; +    REG_IME = 0; +    REG_IE |= INTR_FLAG_VBLANK; +    REG_IME = savedIme; +    REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; +    REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; +} + +void NamingScreen_ClearVram(void) +{ +    u8 *addr = (void *)VRAM; +    u32 size = 0x10000; +     +    while (1) +    { +        DmaFill16(3, 0, addr, 0x1000); +        addr += 0x1000; +        size -= 0x1000; +        if (size <= 0x1000) +        { +            DmaFill16(3, 0, addr, size); +            break; +        } +    } +} + +void NamingScreen_ClearOam(void) +{ +    DmaClear16(3, (void *)OAM, 0x400); +} + +void NamingScreen_SetUpVideoRegs(void) +{ +    REG_BG0CNT = 0; +    REG_BG1CNT = 0; +    REG_BG2CNT = 0; +    REG_BG3CNT = 0; +    REG_BG0HOFS = 0; +    REG_BG0VOFS = 0; +    REG_BG1HOFS = 0; +    REG_BG1VOFS = 0; +    REG_BG2HOFS = 0; +    REG_BG2VOFS = 0; +    REG_BG3HOFS = 0; +    REG_BG3VOFS = 0; +    REG_BG0CNT = 0x1F00; +    REG_BG1CNT = 0x1C01; +    REG_BG2CNT = 0x1D0A; +    REG_BG3CNT = 0x1E03; +    REG_BLDCNT = 0x640; +    REG_BLDALPHA = 0x80C; +} + +void NamingScreen_Init(void) +{ +    GetNamingScreenParameters(); +    EWRAM_000000.unk0 = 0; +    EWRAM_000000.unk4 = 0; +    EWRAM_000000.unk6 = 0; +    EWRAM_000000.unk8 = 1; +    EWRAM_000000.unkA = 2; +    EWRAM_000000.unkC = 0; +    EWRAM_000000.unkD = 1; +    EWRAM_000000.unk34 = gUnknown_083CE398[EWRAM_000000.unk1]; +    EWRAM_000000.unkE = EWRAM_000000.unk34->unk4; +    EWRAM_000000.unk2 = 14 - EWRAM_000000.unk34->unk1 / 2; +    EWRAM_000000.unk3C = gKeyRepeatStartDelay; +    memset(EWRAM_000000.unk11, 0xFF, 0x10); +    if (EWRAM_000000.unk34->unk0 != 0) +        StringCopy(EWRAM_000000.unk11, EWRAM_000000.nameBuffer); +    gKeyRepeatStartDelay = 16; +} + +void sub_80B5DC8(void) +{ +    SetUpWindowConfig(&gWindowConfig_81E6E88); +    InitMenuWindow(&gWindowConfig_81E6E88); +} + +void NamingScreen_ResetObjects(void) +{ +    ResetPaletteFade(); +    ResetSpriteData(); +    FreeAllSpritePalettes(); +    ResetTasks(); +} + +void sub_80B5DFC(void) +{ +    sub_80B7558(); +    sub_80B753C(); +    sub_80B7680(); +    sub_80B75C4(); +    sub_80B7794(); +    sub_80B78A8(); +    sub_80B7960(); +} + +void sub_80B5E20(void) +{ +    sub_80B6774(); +    sub_80B6A80(); +    sub_80B6CA8(); +    sub_80B6D04(); +    sub_80B6E44(); +} + +void sub_80B5E3C(void) +{ +    sub_80B61D8(); +    sub_80B6438(); +    sub_80B5E50(); +} + +void sub_80B5E50(void) +{ +    u8 taskId; +     +    taskId = CreateTask(sub_80B5E70, 2); +    sub_80B5E70(taskId); +} + +void sub_80B5E70(u8 taskId) +{ +    while (gUnknown_083CE218[EWRAM_000000.unk0](&gTasks[taskId]) != 0) +        ; +} + +u8 sub_80B5EA8(struct Task *task) +{ +    BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); +    EWRAM_000000.unk0++; +    return 0; +} + +u8 sub_80B5ED0(struct Task *task) +{ +    if (!gPaletteFade.active) +    { +        sub_80B6210(1); +        sub_80B68D8(1); +        EWRAM_000000.unk0++; +    } +    return 0; +} + +u8 sub_80B5F00(struct Task *task) +{ +    return sub_80B60B8(); +} + +u8 sub_80B5F10(struct Task *task) +{ +    if (sub_80B6938() != 0) +    { +        sub_80B6210(1); +        sub_80B6878(); +        EWRAM_000000.unk0 = 2; +    } +    return 0; +} + +u8 sub_80B5F38(struct Task *task) +{ +    sub_80B6210(0); +    sub_80B6B14(); +    sub_80B65F0(); +    sub_80B6888(1); +    sub_80B6460(0, 0, 1); +    PlaySE(SE_WIN_OPEN); +    EWRAM_000000.unk0 = 5; +    return 0; +} + +u8 sub_80B5F70(struct Task *task) +{ +    s16 var1; +    s16 var2; +     +    if (sub_80B6610() != 0) +    { +        EWRAM_000000.unk0 = 2; +        EWRAM_000000.unkE++; +        EWRAM_000000.unkE %= 3; +        sub_80B7614(); +        sub_80B77F8(); +        sub_80B6210(1); +        sub_80B6858(&var1, &var2); +        if (EWRAM_000000.unkE == 2 && (u16)(var1 - 6) <= 1) +            var1 = 5; +        sub_80B680C(var1, var2); +        sub_80B6888(0); +    } +    return 0; +} + +u8 pokemon_store(struct Task *task) +{ +    sub_80B74B0(); +    sub_80B6210(0); +    sub_80B68D8(0); +    sub_80B6460(3, 0, 1); +    gKeyRepeatStartDelay = EWRAM_000000.unk3C; +    if (EWRAM_000000.unk1 == 2 && CalculatePlayerPartyCount() > 5) +    { +        sub_80B74FC(); +        EWRAM_000000.unk0 = 7; +        return 0; +    } +    else +    { +        EWRAM_000000.unk0 = 8; +        return 1; +    } +} + +u8 sub_80B604C(struct Task *task) +{ +    if (MenuUpdateWindowText()) +        EWRAM_000000.unk0++; +    return 0; +} + +u8 sub_80B606C(struct Task *task) +{ +    BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +    EWRAM_000000.unk0++; +    return 0; +} + +u8 sub_80B6094(struct Task *task) +{ +    if (!gPaletteFade.active) +        SetMainCallback2(EWRAM_000000.returnCallback); +    return 0; +} + +u8 sub_80B60B8(void) +{ +    u8 var = sub_80B61EC(); +    u8 r0 = sub_80B6958(); +     +    if (var == 8) +        return sub_80B61C8(); +    else if (var == 6) +    { +        sub_80B6FBC(); +        return 0; +    } +    else if (var == 7) +    { +        sub_80B7090(); +        return 0; +    } +    return gUnknown_083CE240[r0](var); +} + +u8 sub_80B6108(u8 a) +{ +    sub_80B6460(3, 0, 0); +    if (a == 5) +    { +        u8 var = sub_80B7004(); +         +        sub_80B6914(); +        if (var != 0) +        { +            sub_80B6210(0); +            EWRAM_000000.unk0 = 3; +        } +    } +    return 0; +} + +u8 sub_80B6148(u8 a) +{ +    sub_80B6460(0, 1, 0); +    if (a == 5) +        return sub_80B61C8(); +    else +        return 0; +} + +u8 sub_80B6170(u8 a) +{ +    sub_80B6460(1, 1, 0); +    if (a == 5) +        sub_80B6FBC(); +    return 0; +} + +u8 sub_80B6194(u8 a) +{ +    sub_80B6460(2, 1, 0); +    if (a == 5) +    { +        PlaySE(SE_SELECT); +        EWRAM_000000.unk0 = 6; +        return 1; +    } +    else +        return 0; +} + +u8 sub_80B61C8(void) +{ +    EWRAM_000000.unk0 = 4; +    return 1; +} + +void sub_80B61D8(void) +{ +    CreateTask(sub_80B623C, 1); +} + +u8 sub_80B61EC(void) +{ +    u8 taskId = FindTaskIdByFunc(sub_80B623C); +     +    return gTasks[taskId].data[1]; +} + +void sub_80B6210(u8 a) +{ +    u8 taskId = FindTaskIdByFunc(sub_80B623C); +     +    gTasks[taskId].data[0] = a; +} | 
