diff options
author | Seth Barberee <seth.barberee@gmail.com> | 2021-03-30 13:11:51 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-30 13:11:51 -0500 |
commit | a2d206665c6fffbd962375f262b7fbb05c7b7478 (patch) | |
tree | 6710109c4d9098b74da68ca8f18024d6c184ebc2 /src | |
parent | 2fd4f339b42c010191c199772b09ac34c580de94 (diff) |
Move some data and Splitting (#32)
* move friend area settings to src
* split out playtime into different C file and decomp a few more funcs
* time -> play_time
* fix include
* split out more wonder mail stuff
* unify 203B2C0 and unkDungeon structs. snuck in a decomp func too
* split out more menu screens
* work some more on trade items
* doc a few more things
* add a close nonmatch and decomp nullsub and small func
* rollback struct attempt since it causes nonmatchings
* only one func left in asm
* death to trade_item asm and unify into one C file
* more docing and cleanup
* label main menu and trade items menu global menu struct
* doc itemMode
Diffstat (limited to 'src')
-rw-r--r-- | src/code_2.c | 2 | ||||
-rw-r--r-- | src/code_80118A4.c | 2 | ||||
-rw-r--r-- | src/code_8040094.c | 2 | ||||
-rw-r--r-- | src/code_8041AD0.c | 15 | ||||
-rw-r--r-- | src/code_80428A0.c | 7 | ||||
-rw-r--r-- | src/code_8048480.c | 60 | ||||
-rw-r--r-- | src/code_8094F88.c | 212 | ||||
-rw-r--r-- | src/code_8098BDC.c | 2 | ||||
-rw-r--r-- | src/friend_area.c | 589 | ||||
-rw-r--r-- | src/main_menu.c | 66 | ||||
-rw-r--r-- | src/main_menu_1.c | 22 | ||||
-rw-r--r-- | src/main_menu_mid.c | 20 | ||||
-rw-r--r-- | src/play_time.c | 93 | ||||
-rw-r--r-- | src/trade_items_menu.c | 1120 | ||||
-rw-r--r-- | src/wonder_mail.c | 68 | ||||
-rw-r--r-- | src/wonder_mail_mid.c | 6 | ||||
-rw-r--r-- | src/wonder_mail_pre.c | 101 |
17 files changed, 1841 insertions, 546 deletions
diff --git a/src/code_2.c b/src/code_2.c index 3cc18e9..94f3632 100644 --- a/src/code_2.c +++ b/src/code_2.c @@ -6,7 +6,7 @@ #include "input.h" #include "memory.h" #include "music.h" -#include "time.h" +#include "play_time.h" #include "save.h" extern void NDS_DebugInit(void); diff --git a/src/code_80118A4.c b/src/code_80118A4.c index a427dea..39cc12b 100644 --- a/src/code_80118A4.c +++ b/src/code_80118A4.c @@ -3,7 +3,7 @@ #include "global.h" #include "music.h" #include "constants/bg_music.h" -#include "time.h" +#include "play_time.h" #include "bg.h" #include "input.h" #include "config.h" diff --git a/src/code_8040094.c b/src/code_8040094.c index 691f2df..bd3c104 100644 --- a/src/code_8040094.c +++ b/src/code_8040094.c @@ -1,5 +1,5 @@ #include "global.h" -#include "time.h" +#include "play_time.h" #include "file_system.h" struct unkStruct_203B418 diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index 9358ddb..f90ca13 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -1,10 +1,5 @@ #include "global.h" - -struct unkDungeon_8041D5C -{ - u8 padding[0x70]; - u8 *unk70[100]; -}; +#include "code_8041D5C.h" struct unk_struct_8041F08 { @@ -295,13 +290,11 @@ void nullsub_81(void) void sub_8041D5C(struct unkDungeon_8041D5C *r0) { - u8 *temp; if(sub_8042768(r0) == 0) { return; } - temp = *r0->unk70; - sub_803ED30(temp[0x89 << 1] , r0, 1, 0xB); + sub_803ED30(r0->unk70->unk112 , r0, 1, 0xB); } void sub_8041D84(struct unkDungeon_8041D5C * r0) @@ -687,9 +680,7 @@ void sub_8042208(struct unkDungeon_8041D5C *r0, u8 r1) void sub_8042238(u32 r0, struct unkDungeon_8041D5C *r1) { - u8 *temp; - temp = *r1->unk70; - if(temp[6] != 0) + if(r1->unk70->unk6 != 0) sub_8083E38(0x157); else sub_8083E38(0xAB << 1); diff --git a/src/code_80428A0.c b/src/code_80428A0.c index 6c7d48d..1596c4b 100644 --- a/src/code_80428A0.c +++ b/src/code_80428A0.c @@ -1,10 +1,5 @@ #include "global.h" - -struct unkDungeon_8041D5C -{ - u8 padding[0x70]; - u8 *unk70[100]; -}; +#include "code_8041D5C.h" extern void sub_804151C(struct unkDungeon_8041D5C *r0, u32 r1, u8 r2); diff --git a/src/code_8048480.c b/src/code_8048480.c index 880bf05..64bf949 100644 --- a/src/code_8048480.c +++ b/src/code_8048480.c @@ -1,13 +1,8 @@ #include "global.h" - -struct unkDungeon_8041D5C -{ - u8 padding[0x70]; - u8 *unk70[100]; -}; +#include "code_8041D5C.h" extern u32 gUnknown_80F89F4; -extern u32 gAvailablePokemonNames; +extern u8 gAvailablePokemonNames[0x58]; extern u32 gUnknown_80FB580; extern s16 gUnknown_80F4FB6; extern s16 gUnknown_80F4FB8; @@ -22,7 +17,7 @@ extern void sub_8072008(u32 r0, struct unkDungeon_8041D5C *r1, u32 r2, u8 r3, u3 extern void sub_8076D10(u32 r0, struct unkDungeon_8041D5C *r1); extern void sub_807232C(u32 r0, struct unkDungeon_8041D5C *r1, u32 r2); -extern void sub_8045B94(u32 *r0, struct unkDungeon_8041D5C *r1, u32); +extern void sub_8045B94(u8 *r0, struct unkDungeon_8041D5C *r1, u32); extern void sub_807A290(u32, struct unkDungeon_8041D5C *r1); extern void sub_80522F4(u32 r0, struct unkDungeon_8041D5C *r1, u32); extern void sub_8079270(u32 r0, struct unkDungeon_8041D5C *r1); @@ -32,19 +27,11 @@ extern void sub_8079140(u32, struct unkDungeon_8041D5C *r1); extern void sub_8077C44(u32, struct unkDungeon_8041D5C *r1, s16, s16, u32); extern void sub_80792F8(u32, struct unkDungeon_8041D5C *r1, u32); extern void sub_8079F20(u32, struct unkDungeon_8041D5C *r1, u32, u8); -extern void sub_806F370(u32, struct unkDungeon_8041D5C *r1, u32, u32); +extern void sub_806F370(u32, struct unkDungeon_8041D5C *r1, u32, u32, u32, u32, u32, u32, u32, u32); void sub_8048340(u32 r0, struct unkDungeon_8041D5C *r1, u32 r2) { - u32 temp[6]; - - temp[0] = 0; - temp[1] = 0; - temp[2] = 528; - temp[3] = 0; - temp[4] = 0; - temp[5] = 0; - sub_806F370(r0, r1, r2, 1); + sub_806F370(r0, r1, r2, 1, 0, 0, 528, 0, 0, 0); } void sub_8048364(u32 r0, struct unkDungeon_8041D5C *r1, u8 r2) @@ -63,7 +50,6 @@ void sub_804839C(u32 r0, struct unkDungeon_8041D5C *r1) sub_8077C44(r0, r1, gUnknown_80F4FBA, gUnknown_80F4FBC, 1); } - void sub_80483C4(u32 r0, struct unkDungeon_8041D5C *r1) { sub_80792F8(r0, r1, 999); @@ -96,26 +82,20 @@ void sub_804841C(u32 r0, struct unkDungeon_8041D5C *r1) void sub_8048428(u32 r0, struct unkDungeon_8041D5C *r1) { - u8 *temp; - temp = r1->unk70[0]; - if(temp[0xAC] == 4) - { + if(r1->unk70->unkAC == 4) sub_807A290(r0, r1); - return; - } - sub_80522F4(r0, r1, gUnknown_80F89F4); + else + // Pointer to "But nothing happened!" + sub_80522F4(r0, r1, gUnknown_80F89F4); } void sub_8048450(u32 r0, struct unkDungeon_8041D5C *r1) { - u8 *temp; - temp = r1->unk70[0]; - if((u8)(temp[0xAC] - 2) <= 1) - { + if((u8)(r1->unk70->unkAC - 2) <= 1) sub_807A290(r0, r1); - return; - } - sub_80522F4(r0, r1, gUnknown_80F89F4); + else + // Pointer to "But nothing happened!" + sub_80522F4(r0, r1, gUnknown_80F89F4); } void sub_8048480(u32 r0, struct unkDungeon_8041D5C *r1) @@ -145,6 +125,7 @@ void sub_80484BC(u32 r0, struct unkDungeon_8041D5C *r1) void sub_80484C8(u32 r0, struct unkDungeon_8041D5C *r1) { + // Pointer to "But nothing happened!" sub_80522F4(r0, r1, gUnknown_80F89F4); } @@ -155,13 +136,12 @@ void sub_80484DC(u32 r0, struct unkDungeon_8041D5C *r1) void sub_80484E8(u32 r0, struct unkDungeon_8041D5C *r1) { - u8 *temp; - temp = r1->unk70[0]; - if(temp[0xAC] == 1) - { + if(r1->unk70->unkAC == 1) sub_807A290(r0, r1); - return; + else + { + sub_8045B94(gAvailablePokemonNames, r1, 0); + // Pointer to "But nothing happened!" + sub_80522F4(r0, r1, gUnknown_80FB580); } - sub_8045B94(&gAvailablePokemonNames, r1, 0); - sub_80522F4(r0, r1, gUnknown_80FB580); } diff --git a/src/code_8094F88.c b/src/code_8094F88.c index d3ed115..5bd3a29 100644 --- a/src/code_8094F88.c +++ b/src/code_8094F88.c @@ -1,134 +1,160 @@ #include "global.h" -#include "time.h" +#include "memory.h" -extern struct PlayTimeStruct *gPlayTimeRef; -extern struct PlayTimeStruct gPlayTime; +struct unkStruct_203B480 +{ + //size of 48 + u8 unk0; + u8 fill1[0x22 - 1]; + u8 unk22; + u8 fill23[0x2D - 0x23]; + u8 unk2D; +}; + +struct unkStruct_203B48C +{ + s32 unk0; + s32 unk4[0x20]; +}; -extern u8 gUnknown_2038C88; +extern struct unkStruct_203B480 gUnknown_2038C88; extern u8 gUnknown_2039288; extern u32 gUnknown_20392E8; -extern u32 gUnknown_20393C0; -extern u8 *gUnknown_203B480; +extern struct unkStruct_203B48C gUnknown_20393C0; extern u8 *gUnknown_203B484; extern u32 *gUnknown_203B488; -extern u32 *gUnknown_203B48C; -extern void sub_809488C(u8 *r0, u8 *r1, u32); -extern void sub_8094924(u8 *r0, u8 *r1, u32); +extern struct unkStruct_203B480 *gUnknown_203B480; +extern struct unkStruct_203B48C *gUnknown_203B48C; // def a pointer -void InitializePlayTime(void) -{ - gPlayTimeRef = &gPlayTime; - ResetPlayTime(&gPlayTime); -} -struct PlayTimeStruct *GetPlayTime(void) +void sub_80950BC(void) { - return &gPlayTime; + gUnknown_203B480 = &gUnknown_2038C88; + gUnknown_203B484 = &gUnknown_2039288; + gUnknown_203B488 = &gUnknown_20392E8; + gUnknown_203B48C = &gUnknown_20393C0; } -void ResetPlayTime(struct PlayTimeStruct *Time) +struct unkStruct_203B480 *sub_80950F8(void) { - Time->frames = 0; - Time->seconds = 0; - Time->minutes = 0; - Time->hours = 0; + return &gUnknown_2038C88; } -void IncrementPlayTime(struct PlayTimeStruct *Time) +u8 *sub_8095100(void) { - u16 temp_store16; - - Time->frames++; - if(Time->frames <= 59) - return; - Time->frames = 0; - - Time->seconds++; - if(Time->seconds <= 59) - return; - Time->seconds = 0; - - Time->minutes++; - if(Time->minutes <= 59) - return; - Time->minutes = 0; - - // Casting here for unsigned comparison - temp_store16 = Time->hours; - if(Time->hours <= 9998) - { - temp_store16++; - Time->hours = temp_store16; - } - else - { - Time->seconds = 59; - Time->minutes = 59; - Time->hours= 9999; - } + return &gUnknown_2039288; } -void DeconstructPlayTime(struct PlayTimeStruct *r0, u32 *outHours, u32 *outMinutes, u32 *outSeconds) +u32 *sub_8095108(void) { - if(r0->hours <= 9999) - { - *outHours = r0->hours; - *outMinutes = r0->minutes; - *outSeconds = r0->seconds; - } - else - { - *outHours = 9999; - *outMinutes = 59; - *outSeconds = 59; - } + return &gUnknown_20392E8; } -void sub_8095044(u8 *r0) +struct unkStruct_203B48C *sub_8095110(void) { - sub_809488C(r0, (&(gPlayTimeRef->frames)), 6); - sub_809488C(r0, (&(gPlayTimeRef->seconds)), 6); - sub_809488C(r0, (&(gPlayTimeRef->minutes)), 6); - sub_809488C(r0, (u8 *)(&(gPlayTimeRef->hours)), 14); + return &gUnknown_20393C0; } -void sub_8095080(u8 *r0) -{ - sub_8094924(r0, (&(gPlayTimeRef->frames)), 6); - sub_8094924(r0, (&(gPlayTimeRef->seconds)), 6); - sub_8094924(r0, (&(gPlayTimeRef->minutes)), 6); - sub_8094924(r0, (u8 *)(&(gPlayTimeRef->hours)), 14); -} -void sub_80950BC(void) +#ifdef NONMATCHING +void sub_8095118(void) { - gUnknown_203B480 = &gUnknown_2038C88; - gUnknown_203B484 = &gUnknown_2039288; - gUnknown_203B488 = &gUnknown_20392E8; - gUnknown_203B48C = &gUnknown_20393C0; + int iVar1; + + MemoryFill8((u8*)gUnknown_203B480,0,0x600); + MemoryFill8(gUnknown_203B484,0,0x5c); + for(iVar1 = 0; iVar1 < 0x20; iVar1++){ + // NOTE: when it adds the index regs flip + // Instead of add r0, r0, r1 -> add r0, r1, r0 + // Everything else matches... + gUnknown_203B480[iVar1].unk0 = 0; + gUnknown_203B480[iVar1].unk22 = 0; + gUnknown_203B480[iVar1].unk2D = 0; + } + gUnknown_203B48C->unk0 = 0; + for(iVar1 = 0; iVar1 < 0x20; iVar1++){ + gUnknown_203B48C->unk4[iVar1] = -1; + } } - -u8 *sub_80950F8(void) +#else +NAKED +void sub_8095118(void) { - return &gUnknown_2038C88; + asm_unified("\tpush {r4,lr}\n" + "\tldr r4, _0809517C\n" + "\tldr r0, [r4]\n" + "\tmovs r2, 0xC0\n" + "\tlsls r2, 3\n" + "\tmovs r1, 0\n" + "\tbl MemoryFill8\n" + "\tldr r0, _08095180\n" + "\tldr r0, [r0]\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0x5C\n" + "\tbl MemoryFill8\n" + "\tmovs r2, 0\n" + "\tmovs r1, 0\n" + "\tmovs r3, 0x1F\n" +"_0809513A:\n" + "\tldr r0, [r4]\n" + "\tadds r0, r1\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, r1\n" + "\tadds r0, 0x22\n" + "\tstrb r2, [r0]\n" + "\tldr r0, [r4]\n" + "\tadds r0, r1\n" + "\tadds r0, 0x2D\n" + "\tstrb r2, [r0]\n" + "\tadds r1, 0x30\n" + "\tsubs r3, 0x1\n" + "\tcmp r3, 0\n" + "\tbge _0809513A\n" + "\tldr r2, _08095184\n" + "\tldr r1, [r2]\n" + "\tmovs r0, 0\n" + "\tstr r0, [r1]\n" + "\tmovs r3, 0\n" + "\tmovs r4, 0x1\n" + "\tnegs r4, r4\n" +"_08095166:\n" + "\tldr r0, [r2]\n" + "\tlsls r1, r3, 2\n" + "\tadds r0, 0x4\n" + "\tadds r0, r1\n" + "\tstr r4, [r0]\n" + "\tadds r3, 0x1\n" + "\tcmp r3, 0x1F\n" + "\tble _08095166\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_0809517C: .4byte gUnknown_203B480\n" +"_08095180: .4byte gUnknown_203B484\n" +"_08095184: .4byte gUnknown_203B48C"); } +#endif -u8 *sub_8095100(void) +void nullsub_206(void) { - return &gUnknown_2039288; } -u32 *sub_8095108(void) +void nullsub_207(void) { - return &gUnknown_20392E8; } -u32 *sub_8095110(void) +s32 sub_8095190(void) { - return &gUnknown_20393C0; + int index; + + for(index = 2; index < 0x20; index++){ + if(gUnknown_203B480[index].unk0 == 0) + return index; + } + return -1; } - - diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c index 66bb85a..f4a745f 100644 --- a/src/code_8098BDC.c +++ b/src/code_8098BDC.c @@ -1,5 +1,5 @@ #include "global.h" -#include "time.h" +#include "play_time.h" #include "input.h" extern struct PlayTimeStruct *gPlayTimeRef; diff --git a/src/friend_area.c b/src/friend_area.c index 4288720..5180eba 100644 --- a/src/friend_area.c +++ b/src/friend_area.c @@ -6,8 +6,6 @@ extern bool8 gBoughtFriendAreas[NUM_FRIEND_AREAS]; extern bool8 *gFriendAreas; -extern struct FriendAreaSettings gFriendAreaSettings[NUM_FRIEND_AREAS]; - struct unkStruct_203B45C { // size: 0x58? @@ -30,300 +28,299 @@ extern const char gUnknown_81098AC; extern void sub_800D158(u8 *buffer, const char *r2, ...); extern void sub_8090FEC(u32, u32 *r1, u32); - -//const struct FriendAreaSettings gFriendAreaSettings[NUM_FRIEND_AREAS] = -//{ -// [NONE] = { -// .num_pokemon = 0, -// .unlock_condition = 0, -// .price = 0, -// }, -// [BOUNTIFUL_SEA] = { -// .num_pokemon = 9, -// .unlock_condition = 1, -// .price = 5500, -// }, -// [TREASURE_SEA] = { -// .num_pokemon = 10, -// .unlock_condition = 1, -// .price = 4500, -// }, -// [SERENE_SEA] = { -// .num_pokemon = 4, -// .unlock_condition = 1, -// .price = 8000, -// }, -// [DEEP_SEA_FLOOR] = { -// .num_pokemon = 12, -// .unlock_condition = 1, -// .price = 5500, -// }, -// [DEEP_SEA_CURRENT] = { -// .num_pokemon = 1, -// .unlock_condition = 3, -// .price = 0, -// }, -// [SEAFLOOR_CAVE] = { -// .num_pokemon = 0, -// .unlock_condition = 0, -// .price = 0, -// }, -// [SHALLOW_CAVE] = { -// .num_pokemon = 5, -// .unlock_condition = 1, -// .price = 5000, -// }, -// [MT_DEEPGREEN] = { -// .num_pokemon = 12, -// .unlock_condition = 0, -// .price = 130, -// }, -// [MT_CLEFT] = { -// .num_pokemon = 9, -// .unlock_condition = 1, -// .price = 5000, -// }, -// [MT_MOONVIEW] = { -// .num_pokemon = 6, -// .unlock_condition = 2, -// .price = 0, -// }, -// [RAINBOW_PEAK] = { -// .num_pokemon = 1, -// .unlock_condition = 1, -// .price = 6500, -// }, -// [WILD_PLAINS] = { -// .num_pokemon = 13, -// .unlock_condition = 0, -// .price = 100, -// }, -// [BEAU_PLAINS] = { -// .num_pokemon = 12, -// .unlock_condition = 0, -// .price = 600, -// }, -// [SKY_BLUE_PLAINS] = { -// .num_pokemon = 13, -// .unlock_condition = 2, -// .price = 0, -// }, -// [SAFARI] = { -// .num_pokemon = 15, -// .unlock_condition = 0, -// .price = 700, -// }, -// [SCORCHED_PLAINS] = { -// .num_pokemon = 10, -// .unlock_condition = 1, -// .price = 5000, -// }, -// [SACRED_FIELD] = { -// .num_pokemon = 3, -// .unlock_condition = 1, -// .price = 6500 -// }, -// [MIST_RISE_FOREST] = { -// .num_pokemon = 14, -// .unlock_condition = 0, -// .price = 150 -// }, -// [FLYAWAY_FOREST] = { -// .num_pokemon = 12, -// .unlock_condition = 0, -// .price = 550 -// }, -// [OVERGROWN_FOREST] = { -// .num_pokemon = 9, -// .unlock_condition = 0, -// .price = 600 -// }, -// [ENERGETIC_FOREST] = { -// .num_pokemon = 15, -// .unlock_condition = 1, -// .price = 5000 -// }, -// [MUSHROOM_FOREST] = { -// .num_pokemon = 7, -// .unlock_condition = 0, -// .price = 500 -// }, -// [HEALING_FOREST] = { -// .num_pokemon = 1, -// .unlock_condition = 3, -// .price = 0 -// }, -// [TRANSFORM_FOREST] = { -// .num_pokemon = 6, -// .unlock_condition = 0, -// .price = 500 -// }, -// [SECRETIVE_FOREST] = { -// .num_pokemon = 9, -// .unlock_condition = 1, -// .price = 6500 -// }, -// [RUB_A_DUB_RIVER] = { -// .num_pokemon = 7, -// .unlock_condition = 0, -// .price = 500 -// }, -// [TADPOLE_POND] = { -// .num_pokemon = 9, -// .unlock_condition = 0, -// .price = 500 -// }, -// [TURTLESHELL_POND] = { -// .num_pokemon = 10, -// .unlock_condition = 1, -// .price = 5500 -// }, -// [MYSTIC_LAKE] = { -// .num_pokemon = 4, -// .unlock_condition = 1, -// .price = 2500 -// }, -// [WATERFALL_LAKE] = { -// .num_pokemon = 4, -// .unlock_condition = 1, -// .price = 3500 -// }, -// [PEANUT_SWAMP] = { -// .num_pokemon = 7, -// .unlock_condition = 0, -// .price = 2500 -// }, -// [POISON_SWAMP] = { -// .num_pokemon = 6, -// .unlock_condition = 1, -// .price = 8500 -// }, -// [ECHO_CAVE] = { -// .num_pokemon = 11, -// .unlock_condition = 1, -// .price = 7500 -// }, -// [CRYPTIC_CAVE] = { -// .num_pokemon = 1, -// .unlock_condition = 1, -// .price = 6500 -// }, -// [DRAGON_CAVE] = { -// .num_pokemon = 3, -// .unlock_condition = 2, -// .price = 0 -// }, -// [BOULDER_CAVE] = { -// .num_pokemon = 4, -// .unlock_condition = 2, -// .price = 0 -// }, -// [JUNGLE] = { -// .num_pokemon = 13, -// .unlock_condition = 0, -// .price = 800 -// }, -// [DECRPEPIT_LAB] = { -// .num_pokemon = 7, -// .unlock_condition = 0, -// .price = 1000 -// }, -// [MT_DISCIPLINE] = { -// .num_pokemon = 11, -// .unlock_condition = 0, -// .price = 1200 -// }, -// [THUNDER_MEADOW] = { -// .num_pokemon = 11, -// .unlock_condition = 0, -// .price = 1000 -// }, -// [POWER_PLANT] = { -// .num_pokemon = 6, -// .unlock_condition = 0, -// .price = 600 -// }, -// [CRATER] = { -// .num_pokemon = 7, -// .unlock_condition = 1, -// .price = 7500 -// }, -// [FURNACE_DESERT] = { -// .num_pokemon = 7, -// .unlock_condition = 1, -// .price = 8500 -// }, -// [AGED_CHAMBER_AN] = { -// .num_pokemon = 14, -// .unlock_condition = 1, -// .price = 5500 -// }, -// [AGED_CHAMBER_O_EXCLAIM] = { -// .num_pokemon = 14, -// .unlock_condition = 1, -// .price = 5500 -// }, -// [ANCIENT_RELIC] = { -// .num_pokemon = 6, -// .unlock_condition = 1, -// .price = 8000 -// }, -// [DARKNESS_RIDGE] = { -// .num_pokemon = 13, -// .unlock_condition = 3, -// .price = 0 -// }, -// [FRIGID_CAVERN] = { -// .num_pokemon = 7, -// .unlock_condition = 1, -// .price = 9000 -// }, -// [ICE_FLOE_BEACH] = { -// .num_pokemon = 5, -// .unlock_condition = 1, -// .price = 9500 -// }, -// [VOLCANIC_PIT] = { -// .num_pokemon = 1, -// .unlock_condition = 3, -// .price = 0 -// }, -// [STRATOS_LOOKOUT] = { -// .num_pokemon = 1, -// .unlock_condition = 3, -// .price = 0 -// }, -// [RAVAGED_FIELD] = { -// .num_pokemon = 5, -// .unlock_condition = 0, -// .price = 1000 -// }, -// [MAGNETIC_QUARRY] = { -// .num_pokemon = 3, -// .unlock_condition = 0, -// .price = 1000 -// }, -// [LEGENDARY_ISLAND] = { -// .num_pokemon = 3, -// .unlock_condition = 3, -// .price = 7500 -// }, -// [SOUTHERN_ISLAND] = { -// .num_pokemon = 2, -// .unlock_condition = 1, -// .price = 9500 -// }, -// [ENCLOSED_ISLAND] = { -// .num_pokemon = 1, -// .unlock_condition = 3, -// .price = 0 -// }, -// [FINAL_ISLAND] = { -// .num_pokemon = 1, -// .unlock_condition = 1, -// .price = 8500 -// }, -//}; +const struct FriendAreaSettings gFriendAreaSettings[NUM_FRIEND_AREAS] = +{ + [NONE] = { + .num_pokemon = 0, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 0, + }, + [BOUNTIFUL_SEA] = { + .num_pokemon = 9, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 5500, + }, + [TREASURE_SEA] = { + .num_pokemon = 10, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 4500, + }, + [SERENE_SEA] = { + .num_pokemon = 4, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 8000, + }, + [DEEP_SEA_FLOOR] = { + .num_pokemon = 12, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 5500, + }, + [DEEP_SEA_CURRENT] = { + .num_pokemon = 1, + .unlock_condition = UNLOCK_LEGENDARY_REQUEST, + .price = 0, + }, + [SEAFLOOR_CAVE] = { + .num_pokemon = 1, + .unlock_condition = UNLOCK_LEGENDARY_REQUEST, + .price = 0, + }, + [SHALLOW_BEACH] = { + .num_pokemon = 5, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 5000, + }, + [MT_DEEPGREEN] = { + .num_pokemon = 12, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 130, + }, + [MT_CLEFT] = { + .num_pokemon = 9, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 5000, + }, + [MT_MOONVIEW] = { + .num_pokemon = 6, + .unlock_condition = UNLOCK_WONDER_MAIL, + .price = 0, + }, + [RAINBOW_PEAK] = { + .num_pokemon = 1, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 6500, + }, + [WILD_PLAINS] = { + .num_pokemon = 13, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 100, + }, + [BEAU_PLAINS] = { + .num_pokemon = 12, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 600, + }, + [SKY_BLUE_PLAINS] = { + .num_pokemon = 13, + .unlock_condition = UNLOCK_WONDER_MAIL, + .price = 0, + }, + [SAFARI] = { + .num_pokemon = 15, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 700, + }, + [SCORCHED_PLAINS] = { + .num_pokemon = 10, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 5000, + }, + [SACRED_FIELD] = { + .num_pokemon = 3, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 6500 + }, + [MIST_RISE_FOREST] = { + .num_pokemon = 14, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 150 + }, + [FLYAWAY_FOREST] = { + .num_pokemon = 12, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 550 + }, + [OVERGROWN_FOREST] = { + .num_pokemon = 9, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 600 + }, + [ENERGETIC_FOREST] = { + .num_pokemon = 15, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 5000 + }, + [MUSHROOM_FOREST] = { + .num_pokemon = 7, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 500 + }, + [HEALING_FOREST] = { + .num_pokemon = 1, + .unlock_condition = UNLOCK_LEGENDARY_REQUEST, + .price = 0 + }, + [TRANSFORM_FOREST] = { + .num_pokemon = 6, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 500 + }, + [SECRETIVE_FOREST] = { + .num_pokemon = 9, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 6500 + }, + [RUB_A_DUB_RIVER] = { + .num_pokemon = 7, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 500 + }, + [TADPOLE_POND] = { + .num_pokemon = 9, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 500 + }, + [TURTLESHELL_POND] = { + .num_pokemon = 10, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 5500 + }, + [MYSTIC_LAKE] = { + .num_pokemon = 4, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 2500 + }, + [WATERFALL_LAKE] = { + .num_pokemon = 4, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 3500 + }, + [PEANUT_SWAMP] = { + .num_pokemon = 7, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 2500 + }, + [POISON_SWAMP] = { + .num_pokemon = 6, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 8500 + }, + [ECHO_CAVE] = { + .num_pokemon = 11, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 7500 + }, + [CRYPTIC_CAVE] = { + .num_pokemon = 1, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 6500 + }, + [DRAGON_CAVE] = { + .num_pokemon = 3, + .unlock_condition = UNLOCK_WONDER_MAIL, + .price = 0 + }, + [BOULDER_CAVE] = { + .num_pokemon = 4, + .unlock_condition = UNLOCK_WONDER_MAIL, + .price = 0 + }, + [JUNGLE] = { + .num_pokemon = 13, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 800 + }, + [DECRPEPIT_LAB] = { + .num_pokemon = 7, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 1000 + }, + [MT_DISCIPLINE] = { + .num_pokemon = 11, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 1200 + }, + [THUNDER_MEADOW] = { + .num_pokemon = 11, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 1000 + }, + [POWER_PLANT] = { + .num_pokemon = 6, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 600 + }, + [CRATER] = { + .num_pokemon = 7, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 7500 + }, + [FURNACE_DESERT] = { + .num_pokemon = 7, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 8500 + }, + [AGED_CHAMBER_AN] = { + .num_pokemon = 14, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 5500 + }, + [AGED_CHAMBER_O_EXCLAIM] = { + .num_pokemon = 14, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 5500 + }, + [ANCIENT_RELIC] = { + .num_pokemon = 6, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 8000 + }, + [DARKNESS_RIDGE] = { + .num_pokemon = 13, + .unlock_condition = UNLOCK_LEGENDARY_REQUEST, + .price = 0 + }, + [FRIGID_CAVERN] = { + .num_pokemon = 7, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 9000 + }, + [ICE_FLOE_BEACH] = { + .num_pokemon = 5, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 9500 + }, + [VOLCANIC_PIT] = { + .num_pokemon = 1, + .unlock_condition = UNLOCK_LEGENDARY_REQUEST, + .price = 0 + }, + [STRATOS_LOOKOUT] = { + .num_pokemon = 1, + .unlock_condition = UNLOCK_LEGENDARY_REQUEST, + .price = 0 + }, + [RAVAGED_FIELD] = { + .num_pokemon = 5, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 1000 + }, + [MAGNETIC_QUARRY] = { + .num_pokemon = 3, + .unlock_condition = UNLOCK_SHOP_STORY, + .price = 1000 + }, + [LEGENDARY_ISLAND] = { + .num_pokemon = 3, + .unlock_condition = UNLOCK_LEGENDARY_REQUEST, + .price = 7500 + }, + [SOUTHERN_ISLAND] = { + .num_pokemon = 2, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 9500 + }, + [ENCLOSED_ISLAND] = { + .num_pokemon = 1, + .unlock_condition = UNLOCK_LEGENDARY_REQUEST, + .price = 0 + }, + [FINAL_ISLAND] = { + .num_pokemon = 1, + .unlock_condition = UNLOCK_SHOP_POST_GAME, + .price = 8500 + }, +}; void LoadFriendAreas(void) { diff --git a/src/main_menu.c b/src/main_menu.c index 71db487..3c0840a 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -16,7 +16,7 @@ // Deletes the Save -extern struct MainMenu *gUnknown_203B348; +extern struct MainMenu *gMainMenu; extern void* MemoryAlloc(u32 a, u32 b); extern void MemoryFill8(u8 *dest, u8 value, s32 size); void sub_8035DA0(void); @@ -63,34 +63,34 @@ extern void sub_8038604(void); void InitMainMenu(void) { - if (gUnknown_203B348 == NULL) { - gUnknown_203B348 = MemoryAlloc(sizeof(struct MainMenu),8); - MemoryFill8((u8 *)gUnknown_203B348, 0, sizeof(struct MainMenu)); + if (gMainMenu == NULL) { + gMainMenu = MemoryAlloc(sizeof(struct MainMenu),8); + MemoryFill8((u8 *)gMainMenu, 0, sizeof(struct MainMenu)); } - gUnknown_203B348->currMenu = 0xffdc; - gUnknown_203B348->nextMenu = MENU_MAIN_SCREEN; - gUnknown_203B348->lastMenu = MENU_MAIN_SCREEN; - gUnknown_203B348->unk38 = -1; - gUnknown_203B348->unk3C = -1; - gUnknown_203B348->sub.unk2E = 0; - gUnknown_203B348->sub.unk2C = 1; - gUnknown_203B348->sub.unk2D = 0; + gMainMenu->currMenu = 0xffdc; + gMainMenu->nextMenu = MENU_MAIN_SCREEN; + gMainMenu->lastMenu = MENU_MAIN_SCREEN; + gMainMenu->unk38 = -1; + gMainMenu->unk3C = -1; + gMainMenu->sub.unk2E = 0; + gMainMenu->sub.unk2C = 1; + gMainMenu->sub.unk2D = 0; sub_8035DA0(); - gUnknown_203B348->unk3A = 0; + gMainMenu->unk3A = 0; } void DeleteMainMenu(void) { - if(gUnknown_203B348){ - MemoryFree(gUnknown_203B348); - gUnknown_203B348 = NULL; + if(gMainMenu){ + MemoryFree(gMainMenu); + gMainMenu = NULL; } } void SetUpMenu(void) { - if (gUnknown_203B348->currMenu != gUnknown_203B348->nextMenu) { - switch(gUnknown_203B348->nextMenu) { + if (gMainMenu->currMenu != gMainMenu->nextMenu) { + switch(gMainMenu->nextMenu) { case MENU_MAIN_SCREEN: sub_8094C14(); sub_8099690(0); @@ -100,14 +100,14 @@ void SetUpMenu(void) case MENU_CONTINUE: case MENU_DELETE_SAVE_PROMPT: case 9: - CreateLoadScreen(gUnknown_203B348->nextMenu); + CreateLoadScreen(gMainMenu->nextMenu); break; case MENU_TRADE_ITEMS: CreateTradeItemsMenu(); break; case MENU_COMMUNICATION_1: case MENU_COMMUNICATION_2: - sub_8036FDC(sub_8035DB4(gUnknown_203B348->nextMenu)); + sub_8036FDC(sub_8035DB4(gMainMenu->nextMenu)); break; case MENU_FRIEND_RESCUE: CreateFriendRescueMenu(); @@ -123,7 +123,7 @@ void SetUpMenu(void) break; case MENU_DISPLAY_RESCUE_PASSWORD: case MENU_RESCUE_PASSWORD_ENTRY: - CreateRescuePasswordMenu(gUnknown_203B348->nextMenu); + CreateRescuePasswordMenu(gMainMenu->nextMenu); break; case MENU_ADVENTURE_LOG: CreateAdventureLogMenu(); @@ -134,13 +134,13 @@ void SetUpMenu(void) case 0x2c: case 0x2d: case 0x2e: - sub_803850C(gUnknown_203B348->nextMenu); + sub_803850C(gMainMenu->nextMenu); break; case MENU_DEBUG: CreateDebugMenu(); break; } - gUnknown_203B348->currMenu = gUnknown_203B348->nextMenu; + gMainMenu->currMenu = gMainMenu->nextMenu; } } @@ -150,7 +150,7 @@ s32 UpdateMenu(void) s32 nextMenu; nextMenu = MENU_NO_SCREEN_CHANGE; - switch(gUnknown_203B348->nextMenu) { + switch(gMainMenu->nextMenu) { case MENU_MAIN_SCREEN: nextMenu = UpdateMainMenu(); break; @@ -222,15 +222,15 @@ s32 UpdateMenu(void) break; } if (nextMenu != MENU_NO_SCREEN_CHANGE) { - gUnknown_203B348->nextMenu = nextMenu; + gMainMenu->nextMenu = nextMenu; } return nextMenu; } void CleanUpMenu(void) { - if (gUnknown_203B348->lastMenu != gUnknown_203B348->nextMenu) { - switch(gUnknown_203B348->lastMenu) { + if (gMainMenu->lastMenu != gMainMenu->nextMenu) { + switch(gMainMenu->lastMenu) { case MENU_MAIN_SCREEN: CleanMainMenu(); break; @@ -285,25 +285,25 @@ void CleanUpMenu(void) DeleteDebugMenu(); break; } - gUnknown_203B348->lastMenu = gUnknown_203B348->nextMenu; + gMainMenu->lastMenu = gMainMenu->nextMenu; } } // Unused void sub_8035C00(struct MainMenuSub *param) { - gUnknown_203B348->sub = *param; + gMainMenu->sub = *param; } // Unused struct MainMenuSub *sub_8035C10(void) { - return &gUnknown_203B348->sub; + return &gMainMenu->sub; } void sub_8035C1C(void) { - gUnknown_203B348->sub.unk2E = 0; - gUnknown_203B348->sub.unk2C = 1; - gUnknown_203B348->sub.unk2D = 0; + gMainMenu->sub.unk2E = 0; + gMainMenu->sub.unk2C = 1; + gMainMenu->sub.unk2D = 0; } diff --git a/src/main_menu_1.c b/src/main_menu_1.c new file mode 100644 index 0000000..d79a420 --- /dev/null +++ b/src/main_menu_1.c @@ -0,0 +1,22 @@ +#include "global.h" + +s32 sub_8011FA8(void); +s32 sub_8095324(u32); +s32 sub_8011C1C(void); + +bool8 sub_8039844(void) +{ + int iVar1; + bool8 return_var; + + iVar1 = sub_8011FA8(); + return_var = 0; + if (sub_8095324(1) != 0 || sub_8095324(7) != 0) + { + if (iVar1 == 0xf1207) + return_var = 1; + } + else if (sub_8011C1C() == 2 && iVar1 == 0xf1207) + return_var = 1; + return return_var; +} diff --git a/src/main_menu_mid.c b/src/main_menu_mid.c index ebe2abb..d606e4d 100644 --- a/src/main_menu_mid.c +++ b/src/main_menu_mid.c @@ -8,14 +8,14 @@ struct unkData }; -extern struct MainMenu *gUnknown_203B348; +extern struct MainMenu *gMainMenu; extern struct unkData gUnknown_80E59A8; -extern void sub_8006518(); +extern void sub_8006518(struct unkData *); extern void sub_800641C(struct unkData *, u32, u32); void sub_8035CC0(struct unkData *dataArray, u32 index) { - sub_8006518(); + sub_8006518(dataArray); dataArray[index] = gUnknown_80E59A8; ResetUnusedInputStruct(); sub_800641C(dataArray, 1, 1); @@ -46,35 +46,35 @@ void sub_8035CF4(void * Menu, u32 index, u8 r2) void sub_8035D1C(void) { - gUnknown_203B348->unk38 = -1; + gMainMenu->unk38 = -1; } void sub_8035D30(s32 r0) { - gUnknown_203B348->unk38 = r0; + gMainMenu->unk38 = r0; } s16 sub_8035D3C(void) { - return gUnknown_203B348->unk38; + return gMainMenu->unk38; } s32 *sub_8035D4C(void) { - return &gUnknown_203B348->currMenu; + return &gMainMenu->currMenu; } void sub_8035D58(void) { - gUnknown_203B348->unk3C = -1; + gMainMenu->unk3C = -1; } void sub_8035D68(s32 r0) { - gUnknown_203B348->unk3C = r0; + gMainMenu->unk3C = r0; } s32 sub_8035D74(void) { - return gUnknown_203B348->unk3C; + return gMainMenu->unk3C; } diff --git a/src/play_time.c b/src/play_time.c new file mode 100644 index 0000000..37af5fe --- /dev/null +++ b/src/play_time.c @@ -0,0 +1,93 @@ +#include "global.h" +#include "play_time.h" + +extern struct PlayTimeStruct *gPlayTimeRef; +extern struct PlayTimeStruct gPlayTime; + +extern void sub_809488C(u8 *r0, u8 *r1, u32); +extern void sub_8094924(u8 *r0, u8 *r1, u32); + +void InitializePlayTime(void) +{ + gPlayTimeRef = &gPlayTime; + ResetPlayTime(&gPlayTime); +} + +struct PlayTimeStruct *GetPlayTime(void) +{ + return &gPlayTime; +} + +void ResetPlayTime(struct PlayTimeStruct *Time) +{ + Time->frames = 0; + Time->seconds = 0; + Time->minutes = 0; + Time->hours = 0; +} + +void IncrementPlayTime(struct PlayTimeStruct *Time) +{ + u16 temp_store16; + + Time->frames++; + if(Time->frames <= 59) + return; + Time->frames = 0; + + Time->seconds++; + if(Time->seconds <= 59) + return; + Time->seconds = 0; + + Time->minutes++; + if(Time->minutes <= 59) + return; + Time->minutes = 0; + + // Casting here for unsigned comparison + temp_store16 = Time->hours; + if(Time->hours <= 9998) + { + temp_store16++; + Time->hours = temp_store16; + } + else + { + Time->seconds = 59; + Time->minutes = 59; + Time->hours= 9999; + } +} + +void DeconstructPlayTime(struct PlayTimeStruct *r0, u32 *outHours, u32 *outMinutes, u32 *outSeconds) +{ + if(r0->hours <= 9999) + { + *outHours = r0->hours; + *outMinutes = r0->minutes; + *outSeconds = r0->seconds; + } + else + { + *outHours = 9999; + *outMinutes = 59; + *outSeconds = 59; + } +} + +void sub_8095044(u8 *r0) +{ + sub_809488C(r0, (&(gPlayTimeRef->frames)), 6); + sub_809488C(r0, (&(gPlayTimeRef->seconds)), 6); + sub_809488C(r0, (&(gPlayTimeRef->minutes)), 6); + sub_809488C(r0, (u8 *)(&(gPlayTimeRef->hours)), 14); +} + +void sub_8095080(u8 *r0) +{ + sub_8094924(r0, (&(gPlayTimeRef->frames)), 6); + sub_8094924(r0, (&(gPlayTimeRef->seconds)), 6); + sub_8094924(r0, (&(gPlayTimeRef->minutes)), 6); + sub_8094924(r0, (u8 *)(&(gPlayTimeRef->hours)), 14); +} diff --git a/src/trade_items_menu.c b/src/trade_items_menu.c new file mode 100644 index 0000000..2582931 --- /dev/null +++ b/src/trade_items_menu.c @@ -0,0 +1,1120 @@ +#include "global.h" +#include "input.h" +#include "trade_items_menu.h" + +extern struct TradeItemsMenu *gTradeItemsMenu; + +struct unkStruct_203B460 +{ + u8 unk0[0x50]; + u16 unk50[10]; +}; + + +extern struct unkStruct_203B460 *gUnknown_203B460; // TODO unify this +extern u32 gUnknown_202DE30; +extern u32 gUnknown_202DE58; +extern struct unkData gUnknown_80E6174; + +// Trade Items Menu Link Error Messages +extern u32 gTradeItemsCommunicationError; +extern u32 gUnknown_80E639C; +extern u32 gUnknown_80E63F8; +extern u32 gUnknown_80E6448; +extern u32 gUnknown_80E64AC; +extern u32 gTradeItemsHowManyText; +extern u32 gUnknown_80E60A0; +extern u32 gUnknown_80E60D4; +extern u32 gUnknown_80E61A4; +extern u32 gUnknown_80E61C0; +extern u32 gUnknown_80E60EC; +extern u32 gUnknown_80E6104; +extern u32 gUnknown_80E6154; +extern u32 gUnknown_80E61E4; + +extern u32 gUnknown_80E6214; +extern u32 gUnknown_80E618C; +extern u32 gUnknown_80E6268; +extern u32 gUnknown_80E62C4; +extern u32 gUnknown_80E6358; +extern u32 gUnknown_80E6314; + +extern void sub_8013AA0(u32 *); + +extern void *MemoryAlloc(u32, u32); +extern void MemoryFill8(u8 *, u32, u32); +extern void MemoryFree(void *); +extern void sub_800641C(u32 *, u32, u32); +extern void sub_8035C1C(); +extern void sub_8035DA0(); +extern s32 sub_80144A4(s32 *); +extern u32 sub_801CA08(u32); +extern void sub_801CBB8(); +extern u8 sub_801CB24(); +extern void sub_8006518(u32 *); +extern void sub_801B3C0(u8 *); +extern u8 sub_8012FD8(u32 *); +extern void sub_8013114(u32 *, s32 *); +extern void sub_8035CC0(struct unkData *, u32); +extern void sub_801CCD8(); +extern u32 sub_801B410(); +extern void sub_801B450(); +extern void sub_801CB5C(u32); +extern void sub_8035CF4(u32 *, u32, u32); +extern u32 sub_8013BBC(u32 *); +void sub_8036F30(); +extern void sub_80369D0(); +extern void sub_8012574(u32); +extern void sub_80141B4(u32 *, u32, u32, u32); + +extern void sub_8012574(u32); +extern u8 sub_8012600(void); +extern void sub_8012750(); + +extern void sub_8008C54(u32); +extern void sub_80073B8(u32); +extern void sub_8013C68(u32 *); +extern void sub_80073E0(u32); +extern void xxx_call_draw_string(u32, u32, u32 *, u32, u32); +extern u8 sub_801CF14(u32); +extern u32 sub_801D008(); +extern void sub_8090DC4(u32 *, u8, u32); +extern void sub_801C8C4(u32, u32, s32 *, u32); + + + + +void SetTradeItemMenu(u32); +void PrintTradeItemsLinkError(u32); +void sub_803652C(); +void sub_8036590(); +void sub_80365AC(); +void sub_8036674(); +void sub_8036788(); +void sub_8036728(); +extern void sub_8036830(); +void sub_803689C(); +void sub_80368D4(); +void sub_8036934(); +void sub_8036950(); +void sub_8036AA4(); +void sub_80369FC(); +void sub_8036A18(); +void sub_8036A34(); +void sub_8036A7C(); +void sub_8036A54(); +void sub_8036ADC(); + +// 11 was another saving too? +enum TradeItemsScreens +{ + TRADE_ITEMS_MAIN_MENU, + TRADE_ITEMS_SEND_ITEM, + TRADE_ITEMS_SEND_ITEM_SELECTION, + TRADE_ITEMS_SEND_ITEM_POPUP_MENU, + TRADE_ITEMS_SEND_ITEM_NUMBER, + TRADE_ITEMS_ITEM_INFO, + TRADE_ITEMS_SEND_ITEM_CONFIRM, + TRADE_ITEMS_RECEIVE_ITEM, + TRADE_ITEMS_IN_COMMUNICATION = 9, + TRADE_ITEMS_PREPARE_TRADE_SAVING = 15, + TRADE_ITEMS_EXIT = 18, +}; + +enum TradeItemsModes +{ + TRADE_ITEMS_SEND_ITEM_MODE, + TRADE_ITEMS_RECEIVE_ITEM_MODE +}; + + +u32 CreateTradeItemsMenu(void) +{ + + ResetUnusedInputStruct(); + sub_800641C(0,1,1); + gTradeItemsMenu = MemoryAlloc(sizeof(struct TradeItemsMenu), 8); + MemoryFill8((u8 *)gTradeItemsMenu, 0, sizeof(struct TradeItemsMenu)); + sub_8035C1C(); + sub_8035DA0(); + gTradeItemsMenu->unk4 = 0x13; + SetTradeItemMenu(TRADE_ITEMS_MAIN_MENU); + return 1; +} + +u32 UpdateTradeItemsMenu(void) +{ + + switch(gTradeItemsMenu->currMenu) { + case TRADE_ITEMS_MAIN_MENU: + sub_803652C(); + break; + case TRADE_ITEMS_SEND_ITEM: + sub_8036590(); + break; + case TRADE_ITEMS_SEND_ITEM_SELECTION: + sub_80365AC(); + break; + case TRADE_ITEMS_SEND_ITEM_POPUP_MENU: + sub_8036674(); + break; + case TRADE_ITEMS_ITEM_INFO: + sub_8036728(); + break; + case TRADE_ITEMS_SEND_ITEM_NUMBER: + sub_8036788(); + break; + case TRADE_ITEMS_SEND_ITEM_CONFIRM: + sub_8036830(); + break; + case TRADE_ITEMS_RECEIVE_ITEM: + sub_803689C(); + break; + case 8: + sub_80368D4(); + break; + case TRADE_ITEMS_PREPARE_TRADE_SAVING: + sub_8036A7C(); + break; + case TRADE_ITEMS_IN_COMMUNICATION: + sub_8036934(); + break; + case 10: + sub_8036950(); + break; + case 0xb: + sub_8036AA4(); + break; + case 0xc: + sub_80369FC(); + break; + case 0xe: + sub_8036A34(); + break; + case 0x10: + sub_8036A54(); + break; + case 0xd: + sub_8036A18(); + break; + case 0x11: + sub_8036ADC(); + break; + case TRADE_ITEMS_EXIT: // when you exit the menu to Main + return 3; + } + return 0; +} + +void sub_803652C(void) +{ + s32 menuAction; + + if (sub_80144A4(&menuAction) == 0) { + switch(menuAction) + { + case 1: + // Send Item + gTradeItemsMenu->itemMode = TRADE_ITEMS_SEND_ITEM_MODE; + gTradeItemsMenu->unk10 = 1; + SetTradeItemMenu(TRADE_ITEMS_SEND_ITEM); + break; + case 2: + // Receive Item + gTradeItemsMenu->itemMode = TRADE_ITEMS_RECEIVE_ITEM_MODE; + gTradeItemsMenu->unk10 = 2; + SetTradeItemMenu(TRADE_ITEMS_RECEIVE_ITEM); + break; + case 0: + case 7: + // Cancel + SetTradeItemMenu(TRADE_ITEMS_EXIT); + } + } +} + +void sub_8036590(void) +{ + s32 iVar1; + + if (sub_80144A4(&iVar1) == 0) + SetTradeItemMenu(TRADE_ITEMS_SEND_ITEM_SELECTION); +} + +void sub_80365AC(void) +{ + gTradeItemsMenu->unk25E = 0; + gTradeItemsMenu->unk25D = 1; + gTradeItemsMenu->unk25C = 0; + switch(sub_801CA08(1)){ + case 2: + // Cancel + sub_801CBB8(); + SetTradeItemMenu(TRADE_ITEMS_MAIN_MENU); + break; + case 3: + // Pop up menu with Confirm, Info, Cancel + gTradeItemsMenu->unk25E = sub_801CB24(); + gTradeItemsMenu->unk25D = 1; + SetTradeItemMenu(TRADE_ITEMS_SEND_ITEM_POPUP_MENU); + break; + case 4: + gTradeItemsMenu->unk4 = 2; + gTradeItemsMenu->unk25E = sub_801CB24(); + gTradeItemsMenu->unk25D = 1; + sub_8006518(&gTradeItemsMenu->unk1E4); + ResetUnusedInputStruct(); + sub_800641C(0,1,1); + sub_801B3C0(&gTradeItemsMenu->unk25C); + SetTradeItemMenu(TRADE_ITEMS_ITEM_INFO); + break; + } +} + +void sub_8036674(void) +{ + int menuAction; + + menuAction = -1; + sub_801CA08(0); + if (sub_8012FD8(&gTradeItemsMenu->unk134) == '\0') { + sub_8013114(&gTradeItemsMenu->unk134, &menuAction); + } + switch(menuAction){ + case 3: // confirm + SetTradeItemMenu(TRADE_ITEMS_SEND_ITEM_NUMBER); + break; + case 4: // Info + gTradeItemsMenu->unk4 = 0x13; + sub_8006518(&gTradeItemsMenu->unk1E4); + ResetUnusedInputStruct(); + sub_800641C(0,1,1); + sub_801B3C0(&gTradeItemsMenu->unk25C); + SetTradeItemMenu(TRADE_ITEMS_ITEM_INFO); + break; + case 7: + case 0: + // Cancel + sub_8035CC0(gTradeItemsMenu->unk184, 3); + sub_801CCD8(); + SetTradeItemMenu(TRADE_ITEMS_SEND_ITEM_SELECTION); + break; + } +} + +void sub_8036728(void) +{ + switch(sub_801B410()) + { + case 2: + case 3: + sub_801B450(); + ResetUnusedInputStruct(); + sub_800641C(&gTradeItemsMenu->unk1E4, 1, 1); + sub_801CB5C(1); + if (gTradeItemsMenu->unk4 == 0x13) { + sub_8035CF4(&gTradeItemsMenu->unk44, 3, 1); + SetTradeItemMenu(TRADE_ITEMS_SEND_ITEM_POPUP_MENU); + } + else { + SetTradeItemMenu(gTradeItemsMenu->unk4); + } + default: + case 1: + break; + } +} + +void sub_8036788(void) +{ + sub_8012FD8(&gTradeItemsMenu->unk134); + sub_801CA08(0); + switch(sub_8013BBC(&gTradeItemsMenu->unk14)){ + case 1: + // When you change the # + sub_801CCD8(); + sub_8035CF4(&gTradeItemsMenu->unk44, 3, 0); + sub_8036F30(); + break; + case 2: + // If you back out of the # selection + sub_8035CC0(gTradeItemsMenu->unk184, 2); + sub_801CCD8(); + sub_8035CF4(&gTradeItemsMenu->unk44, 3, 1); + SetTradeItemMenu(TRADE_ITEMS_SEND_ITEM_POPUP_MENU); + break; + case 3: + // Confirm # of item + gTradeItemsMenu->unk25D = gTradeItemsMenu->unk14; + gTradeItemsMenu->unk254.unk0 = gTradeItemsMenu->unk25E; + gTradeItemsMenu->unk254.unk4 = gTradeItemsMenu->unk14; + sub_801CBB8(); + SetTradeItemMenu(TRADE_ITEMS_SEND_ITEM_CONFIRM); + break; + case 0: + break; + } +} + +void sub_8036830(void) +{ + int menuAction; + u16 load; + + if (sub_80144A4(&menuAction) == 0) + { + switch(menuAction){ + case 5: + sub_801CBB8(); + // Used temp var to get correct statements + load = gUnknown_203B460->unk50[gTradeItemsMenu->unk25E]; + load -= gTradeItemsMenu->unk14; + gUnknown_203B460->unk50[gTradeItemsMenu->unk25E] = load; + SetTradeItemMenu(TRADE_ITEMS_PREPARE_TRADE_SAVING); + sub_8012574(0); + break; + case 6: + case 0: + SetTradeItemMenu(TRADE_ITEMS_MAIN_MENU); + break; + } + } +} + +void sub_803689C(void) +{ + int menuAction; + + if (sub_80144A4(&menuAction) == 0) { + switch(menuAction){ + case 5: + SetTradeItemMenu(TRADE_ITEMS_IN_COMMUNICATION); + break; + case 7: + case 0: + SetTradeItemMenu(TRADE_ITEMS_EXIT); + break; + } + } +} + +void sub_80368D4(void) +{ + int menuAction; + + if (sub_80144A4(&menuAction) == 0) { + switch(menuAction){ + case 5: + SetTradeItemMenu(TRADE_ITEMS_IN_COMMUNICATION); + break; + case 7: + case 0: + if ((gTradeItemsMenu->unk254.unk0 != 0) && (gTradeItemsMenu->unk254.unk4 != 0)) + { + sub_80369D0(); + SetTradeItemMenu(0x11); + sub_8012574(0); + } + break; + } + } +} + +void sub_8036934(void) +{ + s32 iVar1; + + if (sub_80144A4(&iVar1) == 0) { + SetTradeItemMenu(10); + } +} + +void sub_8036950(void) +{ + s32 iVar1; + + if (sub_80144A4(&iVar1) == 0) { + if (gTradeItemsMenu->linkStatus == 0) { + switch(gTradeItemsMenu->itemMode){ + case TRADE_ITEMS_SEND_ITEM_MODE: + SetTradeItemMenu(0xd); + break; + case TRADE_ITEMS_RECEIVE_ITEM_MODE: + SetTradeItemMenu(0xe); + break; + default: + break; + } + } + else { + if (((gTradeItemsMenu->itemMode == TRADE_ITEMS_SEND_ITEM_MODE) && (gTradeItemsMenu->unk254.unk0 != 0)) + && (gTradeItemsMenu->unk254.unk4 != 0)) { + // Link Failure + sub_80369D0(); // Add back the item + SetTradeItemMenu(0xb); + sub_8012574(0); + } + else { + PrintTradeItemsLinkError(gTradeItemsMenu->linkStatus); + SetTradeItemMenu(0xc); + } + } + } +} + +void sub_80369D0(void) +{ + // Use temp var to get correct statements + u16 load; + load = gUnknown_203B460->unk50[gTradeItemsMenu->unk254.unk0]; + load += gTradeItemsMenu->unk254.unk4; + gUnknown_203B460->unk50[gTradeItemsMenu->unk254.unk0] = load; +} + +void sub_80369FC(void) +{ + s32 temp; + if(sub_80144A4(&temp) == 0) + { + SetTradeItemMenu(TRADE_ITEMS_MAIN_MENU); + } +} + + +void sub_8036A18(void) +{ + s32 temp; + if(sub_80144A4(&temp) == 0) + { + SetTradeItemMenu(TRADE_ITEMS_EXIT); + } +} + +void sub_8036A34(void) +{ + s32 temp; + if(sub_80144A4(&temp) == 0) + { + SetTradeItemMenu(0x10); + sub_8012574(0); + } +} + +void sub_8036A54(void) +{ + s32 temp; + if(sub_80144A4(&temp) == 0) + { + if(sub_8012600() == 0) + { + sub_8012750(); + SetTradeItemMenu(TRADE_ITEMS_EXIT); + } + } +} + +void sub_8036A7C(void) +{ + s32 temp; + if(sub_80144A4(&temp) == 0) + { + if(sub_8012600() == 0) + { + sub_8012750(); // cleans up from Save Message + SetTradeItemMenu(0x8); + } + } +} + +void sub_8036AA4(void) +{ + s32 temp; + if(sub_80144A4(&temp) == 0) + { + if(sub_8012600() == 0) + { + sub_8012750(); + PrintTradeItemsLinkError(gTradeItemsMenu->linkStatus); + SetTradeItemMenu(0xC); + } + } +} + +void sub_8036ADC(void) +{ + s32 temp; + if(sub_80144A4(&temp) == 0) + { + if(sub_8012600() == 0) + { + sub_8012750(); + SetTradeItemMenu(TRADE_ITEMS_EXIT); + } + } +} + +void CleanTradeItemsMenu(void) +{ + if(gTradeItemsMenu != NULL) + { + MemoryFree(gTradeItemsMenu); + gTradeItemsMenu = NULL; + sub_801CBB8(); + } +} + +void nullsub_52(void) +{ +} + +#ifdef NONMATCHING +void sub_8036B28(void) +{ + int iVar3; + u32 uVar4; + s32 local_10; + u32 load_1; + u32 load_2; + struct TradeSubStruct *temp; + struct TradeSubStruct *temp2; + + switch(gTradeItemsMenu->currMenu) { + case 0: + if (sub_801CF14(0) != '\0') { + sub_8014248(&gUnknown_80E61A4,0,1,&gUnknown_80E60D4,0,4,0,0,0x101); + } + else { + sub_8014248(&gUnknown_80E61A4,0,1,&gUnknown_80E60A0,0,4,0,0,0x101); + } + break; + case 1: + sub_80141B4(&gUnknown_80E61C0,0,0,0x101); + break; + case 2: + if (sub_801D008() == 0) { + ResetUnusedInputStruct(); + sub_800641C(0,1,1); + local_10 = 0x20003; + sub_801C8C4(0,1,&local_10,9); + } + break; + case 3: + sub_8006518(gTradeItemsMenu->unk184); + SetMenuItems(&gTradeItemsMenu->unk44,gTradeItemsMenu->unk184,3,&gUnknown_80E60EC, + &gUnknown_80E6104,1,0,0); + sub_801CCD8(); + sub_8035CF4(&gTradeItemsMenu->unk44,3,1); + break; + case 4: + sub_8036F74(); + break; + case 6: + gUnknown_202DE30 = gTradeItemsMenu->unk14; + sub_8090DC4(&gUnknown_202DE58,gTradeItemsMenu->unk25E,0); + sub_8014248(&gUnknown_80E61E4,0,5, &gUnknown_80E6154,0,4,0,0,0x101); + break; + case 7: + sub_8014248(&gUnknown_80E6214,0,5,&gUnknown_80E618C,0,4,0,0,0x101); + break; + case 8: + sub_8014248(&gUnknown_80E6268,0,5,&gUnknown_80E618C,0,4,0,0,0x101); + break; + case 9: + nullsub_23(0); + sub_80141B4(&gUnknown_80E62C4,0,0,0); + break; + case 10: + gTradeItemsMenu->linkStatus = 0; + // TODO + // Regs mess up here + // Needs a mov r2, 0 + // and mov r3, 0 + temp = &gTradeItemsMenu->unk244; + temp->unk0 = 0; + temp->unk4 = 0; + + temp += 1; // move to unk24C + + temp->unk0 = 0; + temp->unk4 = 0; + // Regs are fixed back up after + + sub_8011830(); + iVar3 = sub_8037B28(gTradeItemsMenu->itemMode); + gTradeItemsMenu->linkStatus = iVar3; + if(iVar3 == 0){ + switch(gTradeItemsMenu->itemMode){ + // Fallthrough needed on each case + case TRADE_ITEMS_SEND_ITEM_MODE: + temp = &gTradeItemsMenu->unk244; + temp2 = &gTradeItemsMenu->unk254; + load_2 = temp2->unk4; + temp->unk0 = temp2->unk0; + temp->unk4 = load_2; + case TRADE_ITEMS_RECEIVE_ITEM_MODE: + gTradeItemsMenu->linkStatus = sub_8037D64(gTradeItemsMenu->itemMode,&gTradeItemsMenu->unk244,&gTradeItemsMenu->unk24C); + default: + break; + } + } + // Needed this check for code generation + if(gTradeItemsMenu->linkStatus == 0 && gTradeItemsMenu->itemMode <= 1){ + gTradeItemsMenu->linkStatus = sub_80381F4(gTradeItemsMenu->itemMode,&gTradeItemsMenu->unk244,&gTradeItemsMenu->unk24C); + } + xxx_call_start_bg_music(); + break; + case 0xe: + if (gTradeItemsMenu->unk24C.unk4 == 0) { + gUnknown_202DE30 = gTradeItemsMenu->unk244.unk4; + // Cast is needed + sub_8090DC4(&gUnknown_202DE58,(u8)gTradeItemsMenu->unk244.unk0,0); + } + else { + gUnknown_202DE30 = gTradeItemsMenu->unk24C.unk4; + // Cast is needed + sub_8090DC4(&gUnknown_202DE58,(u8)gTradeItemsMenu->unk24C.unk0,0); + } + sub_80141B4(&gUnknown_80E6314,0,0,0x101); + break; + case 0xd: + gUnknown_202DE30 = gTradeItemsMenu->unk14; + sub_8090DC4(&gUnknown_202DE58,gTradeItemsMenu->unk25E,0); + sub_80141B4(&gUnknown_80E6358,0,0,0x101); + break; + case 0xB: + case 0xC: + case 0xF: + case 0x10: + case 0x11: + case 0x12: + default: + break; + } +} +#else +NAKED +void sub_8036B28(void) +{ + asm_unified("\tpush {r4,r5,lr}\n" + "\tsub sp, 0x18\n" + "\tldr r1, _08036B44\n" + "\tldr r0, [r1]\n" + "\tldr r0, [r0]\n" + "\tadds r5, r1, 0\n" + "\tcmp r0, 0x12\n" + "\tbls _08036B3A\n" + "\tb _08036DFA\n" +"_08036B3A:\n" + "\tlsls r0, 2\n" + "\tldr r1, _08036B48\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" +"_08036B44: .4byte gTradeItemsMenu\n" +"_08036B48: .4byte _08036B4C\n" + "\t.align 2, 0\n" +"_08036B4C:\n" + "\t.4byte _08036B98\n" + "\t.4byte _08036BDC\n" + "\t.4byte _08036BE4\n" + "\t.4byte _08036C14\n" + "\t.4byte _08036C58\n" + "\t.4byte _08036DFA\n" + "\t.4byte _08036C5E\n" + "\t.4byte _08036C90\n" + "\t.4byte _08036C98\n" + "\t.4byte _08036CC0\n" + "\t.4byte _08036CD8\n" + "\t.4byte _08036DFA\n" + "\t.4byte _08036DFA\n" + "\t.4byte _08036DD8\n" + "\t.4byte _08036D70\n" + "\t.4byte _08036DFA\n" + "\t.4byte _08036DFA\n" + "\t.4byte _08036DFA\n" + "\t.4byte _08036DFA\n" +"_08036B98:\n" + "\tmovs r0, 0\n" + "\tbl sub_801CF14\n" + "\tlsls r0, 24\n" + "\tlsrs r2, r0, 24\n" + "\tcmp r2, 0\n" + "\tbeq _08036BB8\n" + "\tldr r0, _08036BB0\n" + "\tldr r3, _08036BB4\n" + "\tmovs r2, 0\n" + "\tb _08036BBC\n" + "\t.align 2, 0\n" +"_08036BB0: .4byte gUnknown_80E61A4\n" +"_08036BB4: .4byte gUnknown_80E60D4\n" +"_08036BB8:\n" + "\tldr r0, _08036BD4\n" + "\tldr r3, _08036BD8\n" +"_08036BBC:\n" + "\tstr r2, [sp]\n" + "\tmovs r1, 0x4\n" + "\tstr r1, [sp, 0x4]\n" + "\tstr r2, [sp, 0x8]\n" + "\tstr r2, [sp, 0xC]\n" + "\tadds r1, 0xFD\n" + "\tstr r1, [sp, 0x10]\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0x1\n" + "\tbl sub_8014248\n" + "\tb _08036DFA\n" + "\t.align 2, 0\n" +"_08036BD4: .4byte gUnknown_80E61A4\n" +"_08036BD8: .4byte gUnknown_80E60A0\n" +"_08036BDC:\n" + "\tldr r0, _08036BE0\n" + "\tb _08036DBA\n" + "\t.align 2, 0\n" +"_08036BE0: .4byte gUnknown_80E61C0\n" +"_08036BE4:\n" + "\tbl sub_801D008\n" + "\tcmp r0, 0\n" + "\tbeq _08036BEE\n" + "\tb _08036DFA\n" +"_08036BEE:\n" + "\tbl ResetUnusedInputStruct\n" + "\tmovs r0, 0\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x1\n" + "\tbl sub_800641C\n" + "\tldr r0, _08036C10\n" + "\tstr r0, [sp, 0x14]\n" + "\tmovs r0, 0\n" + "\tmovs r1, 0x1\n" + "\tadd r2, sp, 0x14\n" + "\tmovs r3, 0x9\n" + "\tbl sub_801C8C4\n" + "\tb _08036DFA\n" + "\t.align 2, 0\n" +"_08036C10: .4byte 0x00020003\n" +"_08036C14:\n" + "\tldr r0, [r5]\n" + "\tmovs r4, 0xC2\n" + "\tlsls r4, 1\n" + "\tadds r0, r4\n" + "\tbl sub_8006518\n" + "\tldr r1, [r5]\n" + "\tadds r0, r1, 0\n" + "\tadds r0, 0x44\n" + "\tadds r1, r4\n" + "\tldr r3, _08036C50\n" + "\tldr r2, _08036C54\n" + "\tstr r2, [sp]\n" + "\tmovs r2, 0x1\n" + "\tstr r2, [sp, 0x4]\n" + "\tmovs r2, 0\n" + "\tstr r2, [sp, 0x8]\n" + "\tstr r2, [sp, 0xC]\n" + "\tmovs r2, 0x3\n" + "\tbl SetMenuItems\n" + "\tbl sub_801CCD8\n" + "\tldr r0, [r5]\n" + "\tadds r0, 0x44\n" + "\tmovs r1, 0x3\n" + "\tmovs r2, 0x1\n" + "\tbl sub_8035CF4\n" + "\tb _08036DFA\n" + "\t.align 2, 0\n" +"_08036C50: .4byte gUnknown_80E60EC\n" +"_08036C54: .4byte gUnknown_80E6104\n" +"_08036C58:\n" + "\tbl sub_8036F74\n" + "\tb _08036DFA\n" +"_08036C5E:\n" + "\tldr r2, _08036C7C\n" + "\tldr r1, [r5]\n" + "\tldr r0, [r1, 0x14]\n" + "\tstr r0, [r2]\n" + "\tldr r0, _08036C80\n" + "\tldr r2, _08036C84\n" + "\tadds r1, r2\n" + "\tldrb r1, [r1]\n" + "\tmovs r2, 0\n" + "\tbl sub_8090DC4\n" + "\tldr r0, _08036C88\n" + "\tldr r3, _08036C8C\n" + "\tb _08036C9C\n" + "\t.align 2, 0\n" +"_08036C7C: .4byte gUnknown_202DE30\n" +"_08036C80: .4byte gUnknown_202DE58\n" +"_08036C84: .4byte 0x0000025e\n" +"_08036C88: .4byte gUnknown_80E61E4\n" +"_08036C8C: .4byte gUnknown_80E6154\n" +"_08036C90:\n" + "\tldr r0, _08036C94\n" + "\tb _08036C9A\n" + "\t.align 2, 0\n" +"_08036C94: .4byte gUnknown_80E6214\n" +"_08036C98:\n" + "\tldr r0, _08036CB8\n" +"_08036C9A:\n" + "\tldr r3, _08036CBC\n" +"_08036C9C:\n" + "\tmovs r2, 0\n" + "\tstr r2, [sp]\n" + "\tmovs r1, 0x4\n" + "\tstr r1, [sp, 0x4]\n" + "\tstr r2, [sp, 0x8]\n" + "\tstr r2, [sp, 0xC]\n" + "\tadds r1, 0xFD\n" + "\tstr r1, [sp, 0x10]\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0x5\n" + "\tbl sub_8014248\n" + "\tb _08036DFA\n" + "\t.align 2, 0\n" +"_08036CB8: .4byte gUnknown_80E6268\n" +"_08036CBC: .4byte gUnknown_80E618C\n" +"_08036CC0:\n" + "\tmovs r0, 0\n" + "\tbl nullsub_23\n" + "\tldr r0, _08036CD4\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0\n" + "\tmovs r3, 0\n" + "\tbl sub_80141B4\n" + "\tb _08036DFA\n" + "\t.align 2, 0\n" +"_08036CD4: .4byte gUnknown_80E62C4\n" +"_08036CD8:\n" + "\tldr r4, _08036D18\n" + "\tldr r1, [r4]\n" + "\tmovs r0, 0\n" + "\tstr r0, [r1, 0xC]\n" + "\tmovs r2, 0\n" + "\tmovs r3, 0\n" + "\tmovs r5, 0x91\n" + "\tlsls r5, 2\n" + "\tadds r0, r1, r5\n" + "\tstr r2, [r0]\n" + "\tstr r3, [r0, 0x4]\n" + "\tmovs r0, 0x93\n" + "\tlsls r0, 2\n" + "\tadds r1, r0\n" + "\tstr r2, [r1]\n" + "\tstr r3, [r1, 0x4]\n" + "\tbl sub_8011830\n" + "\tldr r0, [r4]\n" + "\tldr r0, [r0, 0x8]\n" + "\tbl sub_8037B28\n" + "\tldr r4, [r4]\n" + "\tstr r0, [r4, 0xC]\n" + "\tcmp r0, 0\n" + "\tbne _08036D44\n" + "\tldr r0, [r4, 0x8]\n" + "\tcmp r0, 0\n" + "\tbeq _08036D1C\n" + "\tcmp r0, 0x1\n" + "\tbeq _08036D2C\n" + "\tb _08036D44\n" + "\t.align 2, 0\n" +"_08036D18: .4byte gTradeItemsMenu\n" +"_08036D1C:\n" + "\tadds r2, r4, r5\n" + "\tmovs r1, 0x95\n" + "\tlsls r1, 2\n" + "\tadds r0, r4, r1\n" + "\tldr r1, [r0, 0x4]\n" + "\tldr r0, [r0]\n" + "\tstr r0, [r2]\n" + "\tstr r1, [r2, 0x4]\n" +"_08036D2C:\n" + "\tldr r4, _08036D6C\n" + "\tldr r2, [r4]\n" + "\tldr r0, [r2, 0x8]\n" + "\tmovs r3, 0x91\n" + "\tlsls r3, 2\n" + "\tadds r1, r2, r3\n" + "\tadds r3, 0x8\n" + "\tadds r2, r3\n" + "\tbl sub_8037D64\n" + "\tldr r1, [r4]\n" + "\tstr r0, [r1, 0xC]\n" +"_08036D44:\n" + "\tldr r4, _08036D6C\n" + "\tldr r2, [r4]\n" + "\tldr r0, [r2, 0xC]\n" + "\tcmp r0, 0\n" + "\tbne _08036D66\n" + "\tldr r0, [r2, 0x8]\n" + "\tcmp r0, 0x1\n" + "\tbhi _08036D66\n" + "\tmovs r3, 0x91\n" + "\tlsls r3, 2\n" + "\tadds r1, r2, r3\n" + "\tadds r3, 0x8\n" + "\tadds r2, r3\n" + "\tbl sub_80381F4\n" + "\tldr r1, [r4]\n" + "\tstr r0, [r1, 0xC]\n" +"_08036D66:\n" + "\tbl xxx_call_start_bg_music\n" + "\tb _08036DFA\n" + "\t.align 2, 0\n" +"_08036D6C: .4byte gTradeItemsMenu\n" +"_08036D70:\n" + "\tldr r2, [r5]\n" + "\tmovs r1, 0x94\n" + "\tlsls r1, 2\n" + "\tadds r0, r2, r1\n" + "\tldr r1, [r0]\n" + "\tcmp r1, 0\n" + "\tbne _08036DA4\n" + "\tldr r1, _08036D9C\n" + "\tmovs r3, 0x92\n" + "\tlsls r3, 2\n" + "\tadds r0, r2, r3\n" + "\tldr r0, [r0]\n" + "\tstr r0, [r1]\n" + "\tldr r0, _08036DA0\n" + "\tsubs r3, 0x4\n" + "\tadds r1, r2, r3\n" + "\tldrb r1, [r1]\n" + "\tmovs r2, 0\n" + "\tbl sub_8090DC4\n" + "\tb _08036DB8\n" + "\t.align 2, 0\n" +"_08036D9C: .4byte gUnknown_202DE30\n" +"_08036DA0: .4byte gUnknown_202DE58\n" +"_08036DA4:\n" + "\tldr r0, _08036DC8\n" + "\tstr r1, [r0]\n" + "\tldr r0, _08036DCC\n" + "\tmovs r3, 0x93\n" + "\tlsls r3, 2\n" + "\tadds r1, r2, r3\n" + "\tldrb r1, [r1]\n" + "\tmovs r2, 0\n" + "\tbl sub_8090DC4\n" +"_08036DB8:\n" + "\tldr r0, _08036DD0\n" +"_08036DBA:\n" + "\tldr r3, _08036DD4\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0\n" + "\tbl sub_80141B4\n" + "\tb _08036DFA\n" + "\t.align 2, 0\n" +"_08036DC8: .4byte gUnknown_202DE30\n" +"_08036DCC: .4byte gUnknown_202DE58\n" +"_08036DD0: .4byte gUnknown_80E6314\n" +"_08036DD4: .4byte 0x00000101\n" +"_08036DD8:\n" + "\tldr r2, _08036E04\n" + "\tldr r1, [r5]\n" + "\tldr r0, [r1, 0x14]\n" + "\tstr r0, [r2]\n" + "\tldr r0, _08036E08\n" + "\tldr r2, _08036E0C\n" + "\tadds r1, r2\n" + "\tldrb r1, [r1]\n" + "\tmovs r2, 0\n" + "\tbl sub_8090DC4\n" + "\tldr r0, _08036E10\n" + "\tldr r3, _08036E14\n" + "\tmovs r1, 0\n" + "\tmovs r2, 0\n" + "\tbl sub_80141B4\n" +"_08036DFA:\n" + "\tadd sp, 0x18\n" + "\tpop {r4,r5}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_08036E04: .4byte gUnknown_202DE30\n" +"_08036E08: .4byte gUnknown_202DE58\n" +"_08036E0C: .4byte 0x0000025e\n" +"_08036E10: .4byte gUnknown_80E6358\n" +"_08036E14: .4byte 0x00000101"); +} +#endif + +void PrintTradeItemsLinkError(u32 errorNum) +{ + switch(errorNum) { + case 0: + break; + case 1: + sub_80141B4(&gTradeItemsCommunicationError, 0, 0, 0x101); + break; + case 3: + sub_80141B4(&gUnknown_80E639C, 0, 0, 0x101); + break; + case 2: + sub_80141B4(&gUnknown_80E63F8, 0, 0, 0x101); + break; + case 4: + sub_80141B4(&gUnknown_80E6448, 0, 0, 0x101); + break; + case 5: + sub_80141B4(&gTradeItemsCommunicationError, 0, 0, 0x101); + break; + case 0xe: + sub_80141B4(&gTradeItemsCommunicationError, 0, 0, 0x101); + break; + case 0xf: + sub_80141B4(&gUnknown_80E64AC, 0, 0, 0x101); + break; + default: + case 0x6: + case 0x7: + case 0x8: + case 0x9: + case 0xA: + case 0xB: + case 0xC: + case 0xD: + sub_80141B4(&gTradeItemsCommunicationError, 0, 0, 0x101); + break; + } +} + +void sub_8036ECC(u32 index, u32 r1) +{ + gTradeItemsMenu->unk24 = 3; + gTradeItemsMenu->unk18 = 1; + gTradeItemsMenu->unk1C = 1; + gTradeItemsMenu->unk20 = r1; + gTradeItemsMenu->unk30 = 0x2c; + gTradeItemsMenu->unk34 = 0x12; + gTradeItemsMenu->unk28 = index; + gTradeItemsMenu->unk2C = &gTradeItemsMenu->unk184[index]; + sub_8013AA0(&gTradeItemsMenu->unk14); + gTradeItemsMenu->unk184[index] = gUnknown_80E6174; + ResetUnusedInputStruct(); + sub_800641C((u32 *)&gTradeItemsMenu->unk184, 1, 1); +} + +void sub_8036F30(void) +{ + u32 uVar1; + + uVar1 = gTradeItemsMenu->unk28; + sub_8008C54(uVar1); + sub_80073B8(uVar1); + // Draw "How many?" + xxx_call_draw_string(2, 0, &gTradeItemsHowManyText, uVar1, 0); + sub_8013C68(&gTradeItemsMenu->unk14); + sub_80073E0(uVar1); +} + +void sub_8036F74(void) +{ + sub_8006518((u32 *)&gTradeItemsMenu->unk184); + sub_8036ECC(2, gUnknown_203B460->unk50[gTradeItemsMenu->unk25E]); + sub_801CCD8(); + sub_8035CF4(&gTradeItemsMenu->unk44, 3, 0); + sub_8036F30(); +} + +void SetTradeItemMenu(u32 newMenu) +{ + gTradeItemsMenu->currMenu = newMenu; + nullsub_52(); + sub_8036B28(); +} diff --git a/src/wonder_mail.c b/src/wonder_mail.c index d4b7196..da8f44c 100644 --- a/src/wonder_mail.c +++ b/src/wonder_mail.c @@ -3,37 +3,7 @@ #include "pokemon.h" #include "file_system.h" #include "constants/species.h" - -// Wonder Mail Related -struct WonderMailStruct_203B2C0 -{ - // size: 0x548 - u32 unk0; - u32 unk4; - u8 unk8[0x38]; - u32 unk40; - u32 unk44; - u16 unk48[232]; - u8 unk218; - u8 padding7[3]; - u32 unk21C; - u8 padding[0x7C]; - u32 unk29C; - u8 padding6[0x6C]; - u32 unk30C; - u8 padding8[0x4C]; - u32 unk35C; - u8 padding5[0x5C]; - u32 unk3BC; - u8 padding4[0x60]; - u32 unk420; // Is this supposed to be a File like 203B2C4? - u8 padding3[0x110]; - u32 unk534; - s32 unk538; // A7 << 3 - u32 unk53C; - u32 unk540; // A8 << 4 - s16 unk544; -}; +#include "wonder_mail.h" struct unkStruct_203B2C4 { @@ -44,7 +14,7 @@ struct unkStruct_203B2C4 u8 unk8[0x36]; // Probably a buffer for entry u8 unk3E; u32 unk40; - u32 unk44; // another link status + u32 linkError; // another link status u8 filler48[0x218 - 0x48]; s8 unk218; u32 unk21C; @@ -246,43 +216,43 @@ void sub_8028B1C(u32 r0) break; case 1: case 2: - sub_80141B4(gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailErrorText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 3: - sub_80141B4(gWonderMailNumGBAsText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailNumGBAsText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 4: - sub_80141B4(gWonderMailWrongModeText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailWrongModeText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 5: - sub_80141B4(gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailErrorText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 6: - sub_80141B4(gWonderMailStorageFullText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailStorageFullText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 7: - sub_80141B4(gWonderMailDuplicateText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailDuplicateText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 8: break; case 9: - sub_80141B4(gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailNotEligibleReceiveText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 10: break; case 11: - sub_80141B4(gWonderMailNotEligibleReceiveText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailNotEligibleReceiveText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 12: break; case 13: - sub_80141B4(gWonderMailNoRoomText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailNoRoomText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 14: - sub_80141B4(gWonderMailErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailErrorText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; case 15: - sub_80141B4(gWonderMailFriendErrorText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailFriendErrorText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); break; default: break; @@ -829,7 +799,7 @@ void sub_80292EC(void) { return; } - if(gUnknown_203B2C0->unk44 == 0) + if(gUnknown_203B2C0->linkError == 0) { switch(gUnknown_203B2C0->unk538) { @@ -843,7 +813,7 @@ void sub_80292EC(void) } else { - sub_8028B1C(gUnknown_203B2C0->unk44); + sub_8028B1C(gUnknown_203B2C0->linkError); sub_8028B04(0x7); } } @@ -939,15 +909,15 @@ void sub_80293F4(void) case 9: break; case 10: - sub_8014248(gWonderMailPasswordIncorrectText, 0, 8, &gUnknown_80DDA48, 0, 4, 0, &gUnknown_203B2C0->unk420, 0xC); + sub_8014248(gWonderMailPasswordIncorrectText, 0, 8, &gUnknown_80DDA48, 0, 4, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0xC); sub_8028B04(0x28); break; case 11: - sub_80141B4(gWonderMailSOSPasswordIncorrectText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailSOSPasswordIncorrectText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); sub_8028B04(7); break; case 0: - sub_80141B4(gWonderMailDuplicateText, 0, &gUnknown_203B2C0->unk420, 0x10d); + sub_80141B4(gWonderMailDuplicateText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x10d); sub_8028B04(7); break; case 12: @@ -958,7 +928,7 @@ void sub_80293F4(void) sub_8095274(temp.unk10); temp.unkArray[0] = 2; // Some sort of Ack? sub_80951BC(temp.unkArray); - sub_80141B4(gWonderMailAOKMailReceivedText, 0, &gUnknown_203B2C0->unk420, 0x101); + sub_80141B4(gWonderMailAOKMailReceivedText, 0, (u32 *)&gUnknown_203B2C0->faceFile, 0x101); sub_8028B04(0x23); break; case 16: diff --git a/src/wonder_mail_mid.c b/src/wonder_mail_mid.c index 0256019..62755b1 100644 --- a/src/wonder_mail_mid.c +++ b/src/wonder_mail_mid.c @@ -10,7 +10,7 @@ struct unkStruct_203B2C4 u8 unk8[0x36]; u8 unk3E; u32 unk40; - u32 unk44; // another link status + u32 linkError; // another link status u8 filler48[0x218 - 0x48]; s8 unk218; u32 unk21C; @@ -94,7 +94,7 @@ void sub_8029F98(void) gUnknown_203B2C4->unk41C[2] = 0; gUnknown_203B2C4->unk41C[1] = 1; gUnknown_203B2C4->unk41C[0] = 0; - if (gUnknown_203B2C4->unk44 == 0) { + if (gUnknown_203B2C4->linkError == 0) { switch(gUnknown_203B2C4->unk40) { case 6: @@ -121,7 +121,7 @@ void sub_8029F98(void) } else { - PrintWonderMailLinkError(gUnknown_203B2C4->unk44); + PrintWonderMailLinkError(gUnknown_203B2C4->linkError); sub_802B2BC(0x1F); } } diff --git a/src/wonder_mail_pre.c b/src/wonder_mail_pre.c new file mode 100644 index 0000000..94ab51f --- /dev/null +++ b/src/wonder_mail_pre.c @@ -0,0 +1,101 @@ +#include "global.h" +#include "file_system.h" +#include "input.h" +#include "pokemon.h" +#include "constants/species.h" +#include "wonder_mail.h" + + +extern void* MemoryAlloc(u32 a, u32 b); +extern void MemoryFill8(u8 *dest, u8 value, s32 size); +extern char* GetMonSpecies(u32); +extern void sub_800641C(void *r0, u8, u8); +void sub_808D8E0(u8 *, u32); + +extern struct WonderMailStruct_203B2C0 *gUnknown_203B2C0; +extern char gUnknown_202E5D8[0x50]; +extern char gAvailablePokemonNames[0x50]; + +extern void sub_8029B34(); +extern void sub_8029AD8(); +extern void sub_8029AF4(); +extern void sub_8029A88(); +extern void sub_8029AB0(); +extern void sub_80297B8(); +extern void sub_80297D4(); +extern void sub_8029884(); +extern void sub_8029944(); +extern void sub_80299AC(); +extern void sub_80299D8(); +extern void sub_8029A6C(); +extern void sub_8028CE0(); +extern void sub_8028BF0(); +extern void sub_8029A18(); +extern void sub_80295A8(); +extern void sub_8029668(); +extern void sub_8029684(); +extern void sub_8029740(); +extern void sub_80295D8(); +extern void sub_802979C(); +extern void sub_8029358(); +extern void sub_8029374(); +extern void sub_802939C(); +extern void sub_8028F58(); +extern void sub_8028F30(); +extern void sub_8028F04(); +extern void sub_8028ED4(); +extern void sub_80293D8(); +extern void sub_80293F4(); +extern void sub_8028DE8(u32); +extern void sub_8028EAC(); +extern void sub_802955C(); +extern void sub_80292A4(); +extern void sub_80292EC(); +extern void sub_802933C(); +extern void sub_802958C(); +extern void sub_8029208(); +extern void sub_8028E84(); +extern void sub_8028F80(); +extern void sub_8028FC0(); +extern void sub_8028FDC(); +extern void sub_8028E54(); +extern void sub_8028E24(); +extern void sub_8028E08(); +extern void sub_80290D4(); +extern void sub_80290F0(); +extern void sub_80291AC(); +extern void sub_8029044(); +extern void sub_8028CFC(); +extern void sub_8028D4C(); + +u32 sub_8027F88(void) +{ + char *monName; + struct OpenedFile *faceFile; + s32 counter; + + ResetUnusedInputStruct(); + sub_800641C(0, 1, 1); + gUnknown_203B2C0 = MemoryAlloc(sizeof(struct WonderMailStruct_203B2C0), 8); + MemoryFill8((u8 *)gUnknown_203B2C0, 0, sizeof(struct WonderMailStruct_203B2C0)); + gUnknown_203B2C0->unk53C = 0; + gUnknown_203B2C0->unk218 = -1; + gUnknown_203B2C0->unk544 = -1; + sub_808D8E0(gUnknown_202E5D8, SPECIES_PELIPPER); + monName = GetMonSpecies(SPECIES_PELIPPER); + strcpy(gAvailablePokemonNames, monName); + faceFile = GetDialogueSpriteDataPtr(SPECIES_PELIPPER); + gUnknown_203B2C0->faceFile = faceFile; + gUnknown_203B2C0->faceData = faceFile->data; + gUnknown_203B2C0->unk42C = 0; + gUnknown_203B2C0->unk42D = 0; + gUnknown_203B2C0->unk42E = 0; + gUnknown_203B2C0->unk428 = 2; + gUnknown_203B2C0->unk42A = 8; + for(counter = 0; counter < 0x36; counter++){ + gUnknown_203B2C0->unk8[counter] = 0; + } + gUnknown_203B2C0->unk0 = 0x3D; + sub_8028B04(0); // Set initial state to 0? + return 1; +} |