diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/battle_party_menu.c | 294 | 
1 files changed, 294 insertions, 0 deletions
| diff --git a/src/battle_party_menu.c b/src/battle_party_menu.c new file mode 100644 index 000000000..d8b5b48f3 --- /dev/null +++ b/src/battle_party_menu.c @@ -0,0 +1,294 @@ +#include "global.h" +#include "asm.h" +#include "main.h" +#include "palette.h" +#include "pokemon.h" +#include "songs.h" +#include "sound.h" +#include "task.h" +#include "text.h" + +struct PartyMenuItem +{ +    const u8 *text; +    void (*func)(void); +}; + +struct UnknownStruct2 +{ +    u8 unk0; +    u8 unk1; +    const u8 *unk4; +}; + +extern u8 IsLinkDoubleBattle(void); +extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); +extern void LoadHeldItemIconGraphics(void); +extern void CreateHeldItemIcons_806DC34(); +extern u8 sub_806BD58(u8, u8); +extern void PartyMenuPrintMonsLevelOrStatus(void); +extern void PrintPartyMenuMonNicknames(void); +extern void PartyMenuTryPrintMonsHP(void); +extern void nullsub_13(void); +extern void PartyMenuDrawHPBars(void); +extern u8 sub_806B58C(u8); +extern u8 GetItemEffectType(); +extern void sub_806E750(u8, const struct UnknownStruct2 *, const struct PartyMenuItem *, int); +extern u16 sub_806BD80(); +extern u8 sub_806CA38(); +extern void sub_806D5A4(void); +extern void sub_802E414(void); +extern void sub_8094D60(void); +extern void sub_80A6DCC(void); +extern void sub_806AF4C(); + +struct UnknownStruct1 +{ +    u8 filler0[0x259]; +    u8 unk259; +    u8 filler25A[6]; +    u8 unk260; +    u8 filler261[3]; +    s16 unk264; +    s16 unk266; +}; + +extern u8 unk_2000000[]; + +#define EWRAM_1B000 (*(struct UnknownStruct1 *)(unk_2000000 + 0x1B000)) + +extern u16 gScriptItemId; +extern u8 gUnknown_0202E8F4; +extern u8 gUnknown_02038473; +extern void (*gUnknown_03004AE4)();  //don't know types yet +extern const struct PartyMenuItem gUnknown_083B5FCC[]; +extern const struct UnknownStruct2 gUnknown_083B5FF4[]; + +void sub_80952E4(u8); +void sub_8095408(u8); +void sub_809527C(u8); +void sub_80952B4(u8); +void sub_8095330(u8); +void sub_809538C(void); + +int SetUpBattlePartyMenu(void) +{ +    switch (EWRAM_1B000.unk264) +    { +    case 0: +        //TODO: try to get rid of this duplicate code +        if (IsLinkDoubleBattle() == TRUE) +        { +            if (EWRAM_1B000.unk266 != 6) +            { +                TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); +                EWRAM_1B000.unk266++; +            } +            else +            { +                EWRAM_1B000.unk266 = 0; +                EWRAM_1B000.unk264++; +            } +        } +        else +        { +            if (EWRAM_1B000.unk266 <= 5) +            { +                TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]); +                EWRAM_1B000.unk266++; +            } +            else +            { +                EWRAM_1B000.unk266 = 0; +                EWRAM_1B000.unk264++; +            }                 +        } +        break; +    case 1: +        LoadHeldItemIconGraphics(); +        EWRAM_1B000.unk264++; +        break; +    case 2: +        CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260); +        EWRAM_1B000.unk264++; +        break; +    case 3: +        if (sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) == 1) +        { +            EWRAM_1B000.unk266 = 0; +            EWRAM_1B000.unk264++; +        } +        else +        { +            EWRAM_1B000.unk266++; +        } +        break; +    case 4: +        PartyMenuPrintMonsLevelOrStatus(); +        EWRAM_1B000.unk264++; +        break; +    case 5: +        PrintPartyMenuMonNicknames(); +        EWRAM_1B000.unk264++; +        break; +    case 6: +        PartyMenuTryPrintMonsHP(); +        EWRAM_1B000.unk264++; +        break; +    case 7: +        nullsub_13(); +        EWRAM_1B000.unk264++; +        break; +    case 8: +        PartyMenuDrawHPBars(); +        EWRAM_1B000.unk264++; +        break; +    case 9: +        if (sub_806B58C(EWRAM_1B000.unk266) == 1) +        { +            EWRAM_1B000.unk266 = 0; +            EWRAM_1B000.unk264++; +        } +        else +        { +            EWRAM_1B000.unk266++; +        } +        break; +    case 10: +        if (gUnknown_02038473 == 3) +        { +            if (GetItemEffectType(gScriptItemId) == 10) +                EWRAM_1B000.unk259 = 0xFF; +            else +                EWRAM_1B000.unk259 = 3; +        } +        return TRUE; +    } +    return FALSE; +} + +void sub_8095050(u8 a, u8 b) +{ +    if (!GetMonData(&gPlayerParty[b], MON_DATA_IS_EGG)) +    { +        if (gUnknown_02038473 == 1) +        { +            gTasks[EWRAM_1B000.unk260].data[4] = 1; +            gTasks[EWRAM_1B000.unk260].data[5] = 1; +        } +        else +        { +            gTasks[EWRAM_1B000.unk260].data[4] = 0; +            gTasks[EWRAM_1B000.unk260].data[5] = 0; +        } +    } +    else +    { +        gTasks[EWRAM_1B000.unk260].data[4] = 2; +        gTasks[EWRAM_1B000.unk260].data[5] = 2; +    } +    sub_806E750(gTasks[a].data[4], gUnknown_083B5FF4, gUnknown_083B5FCC, 0); +} + +void SetUpBattlePokemonMenu(u8 a) +{ +    if (!gPaletteFade.active) +    { +        if (gUnknown_02038473 == 3 && GetItemEffectType(gScriptItemId) == 10) +        { +            gUnknown_03004AE4(a, gScriptItemId, sub_80952E4); +            return; +        } +         +        switch (sub_806BD80(a)) +        { +        case 1: +            if (gUnknown_02038473 == 3) +            { +                if (GetMonData(&gPlayerParty[sub_806CA38(a)], MON_DATA_IS_EGG)) +                { +                    PlaySE(SE_HAZURE); +                } +                else +                { +                    sub_806D5A4(); +                    gUnknown_03004AE4(a, gScriptItemId, sub_80952E4); +                } +            } +            else +            { +                PlaySE(SE_SELECT); +                GetMonNickname(&gPlayerParty[sub_806CA38(a)], gStringVar1); +                sub_8095050(a, sub_806CA38(a)); +                SetTaskFuncWithFollowupFunc(a, sub_8095408, SetUpBattlePokemonMenu); +            } +            break; +        case 2: +            if (gUnknown_02038473 == 1) +            { +                PlaySE(SE_HAZURE); +            } +            else +            { +                PlaySE(SE_SELECT); +                if (gUnknown_02038473 == 3) +                { +                    gUnknown_0202E8F4 = 0; +                    gTasks[a].func = sub_80952E4; +                } +                else +                { +                    gUnknown_0202E8F4 = 0; +                    gTasks[a].func = sub_809527C; +                } +            } +            break; +        } +    } +} + +void sub_809527C(u8 taskId) +{ +    BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +    gTasks[taskId].func = sub_80952B4; +} + +void sub_80952B4(u8 taskId) +{ +    if (!gPaletteFade.active) +    { +        sub_8094D60(); +        DestroyTask(taskId); +        SetMainCallback2(sub_802E414); +    } +} + +void sub_80952E4(u8 taskId) +{ +    if (gUnknown_0202E8F4 != 0) +    { +        sub_809527C(taskId); +    } +    else +    { +        BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +        gTasks[taskId].func = sub_8095330; +    } +} + +void sub_8095330(u8 taskId) +{ +    if (!gPaletteFade.active) +    { +        sub_8094D60(); +        DestroyTask(taskId); +        sub_80A6DCC(); +    } +} + +void sub_809535C(u8 taskId) +{ +    gPaletteFade.bufferTransferDisabled = TRUE; +    sub_806AF4C(1, 0xFF, SetUpBattlePokemonMenu, 5); +    SetMainCallback2(sub_809538C); +} | 
