diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_party_menu.c | 309 | ||||
-rw-r--r-- | src/party_menu.c | 2 | ||||
-rw-r--r-- | src/rom_8094928.c | 135 |
3 files changed, 303 insertions, 143 deletions
diff --git a/src/battle_party_menu.c b/src/battle_party_menu.c index 514ef9ca7..7b4eb0258 100644 --- a/src/battle_party_menu.c +++ b/src/battle_party_menu.c @@ -12,6 +12,30 @@ #include "task.h" #include "text.h" +#define DATA_COUNT (6) + +extern u8 ewram[]; + +struct Unk201B000 +{ + //u8 filler0[0x260]; + struct Pokemon unk0[6]; + u8 filler258[1]; + u8 unk259; + u8 filler25A[6]; + u8 unk260; + u8 unk261; + u8 filler262[2]; + s16 unk264[DATA_COUNT * 2]; // This may be a union + u8 filler27C[2]; + s16 unk27E; + s16 unk280; + s16 unk282; +}; + +#define ewram1B000 (*(struct Unk201B000 *)(ewram + 0x1B000)) +#define UNK_201606C_ARRAY (ewram + 0x1606C) // lazy define but whatever. + extern u8 IsLinkDoubleBattle(void); extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); extern void LoadHeldItemIconGraphics(void); @@ -29,7 +53,6 @@ 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(); extern u8 sub_80F9344(void); @@ -41,12 +64,12 @@ extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, con extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(u8), int); extern void sub_806E7D0(u8, const struct PartyPopupMenu *); extern u8 *sub_8040D08(); -extern u8 sub_8094C20(); extern void sub_8040B8C(void); -extern u8 pokemon_order_func(u8); -extern void sub_8094C98(u8, u8); extern void sub_806E6F0(); extern void sub_806D538(); +extern void nullsub_14(); +extern void OpenPartyMenu(); +extern u8 sub_803FBBC(void); extern u16 gScriptItemId; extern u8 gPlayerPartyCount; @@ -56,10 +79,17 @@ extern u8 gUnknown_02024E6C; extern u8 gUnknown_0202E8F4; extern u8 gUnknown_0202E8F5; extern u8 gUnknown_0202E8F6; +extern u8 gUnknown_02038470[3]; extern u8 gUnknown_02038473; extern u8 gUnknown_020384F0; extern void (*gUnknown_03004AE4)(); //don't know types yet +extern struct PokemonStorage gPokemonStorage; +void sub_8094C98(u8, u8); +static void sub_8094998(u8[3], u8); +static void sub_8094A74(u8[3], u8, u32); +u8 pokemon_order_func(u8); +static void sub_8094D60(void); static void Task_809527C(u8); static void Task_80952B4(u8); static void Task_80952E4(u8); @@ -87,11 +117,276 @@ static const struct PartyPopupMenu sBattlePartyPopupMenus[] = {ARRAY_COUNT(Unknown_83B5FF2), 9, Unknown_83B5FF2}, }; -// rom_8094928 is part of this file, has yet to be decompiled. +void unref_sub_8094928(struct PokemonStorage *ptr) +{ + *ptr = gPokemonStorage; +} + +void unref_sub_8094940(struct PokemonStorage *ptr) +{ + gPokemonStorage = *ptr; +} + +void sub_8094958(void) +{ + sub_8094998(gUnknown_02038470, sub_803FBBC()); +} + +void sub_8094978(u8 arg1, u8 arg2) +{ + sub_8094A74((UNK_201606C_ARRAY) + arg1 * 3, arg2, arg1); +} + +static void sub_8094998(u8 arg[3], u8 player_number) +{ + int i; + u32 pos; + u8 temp[6]; + if (IsLinkDoubleBattle() == TRUE) + { + if (player_number) + { + *arg = 0x30; + arg[1] = 0x45; + arg[2] = 0x12; + } + else + { + *arg = 0x03; + arg[1] = 0x12; + arg[2] = 0x45; + } + } + else + { + if (!IsDoubleBattle()) + { + pos = 1; + *temp = gUnknown_02024A6A[battle_get_side_with_given_state(0)]; + for (i = 0; i <= 5; i++) + if (i != *temp) + temp[pos++] = i; + } + else + { + pos = 2; + *temp = gUnknown_02024A6A[battle_get_side_with_given_state(0)]; + temp[1] = gUnknown_02024A6A[battle_get_side_with_given_state(2)]; + for (i = 0; i <= 5; i++) + if ((i != *temp) && (i != temp[1])) + temp[pos++] = i; + } + for (i = 0; i <= 2; i++) + arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; + } +} + +static void sub_8094A74(u8 arg[3], u8 player_number, u32 arg3) +{ + int i, j; + u8 temp[6]; + if (!battle_side_get_owner(arg3)) + { + i = battle_get_side_with_given_state(0); + j = battle_get_side_with_given_state(2); + } + else + { + i = battle_get_side_with_given_state(1); + j = battle_get_side_with_given_state(3); + } + if (IsLinkDoubleBattle() == TRUE) + { + if (player_number) + { + *arg = 0x30; + arg[1] = 0x45; + arg[2] = 0x12; + } + else + { + *arg = 0x03; + arg[1] = 0x12; + arg[2] = 0x45; + } + } + else + { + if (!IsDoubleBattle()) + { + int pos = 1; + *temp = gUnknown_02024A6A[i]; + for (i = 0; i <= 5; i++) + if (i != *temp) + temp[pos++] = i; + } + else + { + int pos = 2; + *temp = gUnknown_02024A6A[i]; + temp[1] = gUnknown_02024A6A[j]; + for (i = 0; i <= 5; i++) + if ((i != *temp) && (i != temp[1])) + temp[pos++] = i; + } + for (i = 0; i <= 2; i++) + arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; + } +} + +void sub_8094B6C(u8 a, u8 b, u8 c) +{ + s32 i; + s32 j; + u8 temp[6]; + u8 r3; + u8 r7 = 0; + + if (IsLinkDoubleBattle()) + { + u8 *arr = ewram + 0x1606C + a * 3; + + for (i = 0, j = 0; i < 3; i++) + { + temp[j++] = arr[i] >> 4; + temp[j++] = arr[i] & 0xF; + } + r3 = temp[c]; + for (i = 0; i < 6; i++) + { + if (temp[i] == b) + { + r7 = temp[i]; + temp[i] = r3; + break; + } + } + if (i != 6) + { + temp[c] = r7; + + arr[0] = (temp[0] << 4) | temp[1]; + arr[1] = (temp[2] << 4) | temp[3]; + arr[2] = (temp[4] << 4) | temp[5]; + } + } +} + +u8 sub_8094C20(u8 a) +{ + u8 retVal; + u8 val = a & 1; + + a /= 2; + if (val) + retVal = gUnknown_02038470[a] & 0xF; + else + retVal = gUnknown_02038470[a] >> 4; + return retVal; +} + +void sub_8094C54(u8 a, u8 b) +{ + u8 val = a & 1; + + a /= 2; + if (val) + gUnknown_02038470[a] = (gUnknown_02038470[a] & 0xF0) | b; + else + gUnknown_02038470[a] = (gUnknown_02038470[a] & 0xF) | (b << 4); +} + +void sub_8094C98(u8 a, u8 b) +{ + u8 r4 = sub_8094C20(a); + u8 r1 = sub_8094C20(b); + + sub_8094C54(a, r1); + sub_8094C54(b, r4); +} + +u8 pokemon_order_func(u8 a) +{ + u8 i; + u8 r2; + + for (i = 0, r2 = 0; i < 3; i++) + { + if ((gUnknown_02038470[i] >> 4) == a) + return r2; + r2++; + if ((gUnknown_02038470[i] & 0xF) == a) + return r2; + r2++; + } + return 0; +} + +void pokemon_change_order(void) +{ + u8 i; + + memcpy(ewram1B000.unk0, gPlayerParty, sizeof(gPlayerParty)); + for (i = 0; i < 6; i++) + { + u8 n = pokemon_order_func(i); + + memcpy(&gPlayerParty[n], &ewram1B000.unk0[i], sizeof(struct Pokemon)); + } +} + +static void sub_8094D60(void) +{ + struct Pokemon temp[6]; + u8 i; + + memcpy(temp, gPlayerParty, sizeof(gPlayerParty)); + for (i = 0; i < 6; i++) + { + u8 n = sub_8094C20(i); + + memcpy(&gPlayerParty[n], &temp[i], sizeof(struct Pokemon)); + } +} + +void unref_sub_8094DB0(void) +{ + u8 i; + u8 r4; + + for (i = 1; i < 6; i++) + { + u8 n = sub_8094C20(i); + + if (GetMonData(&gPlayerParty[n], MON_DATA_SPECIES) != 0 + && GetMonData(&gPlayerParty[n], MON_DATA_HP) != 0) + { + r4 = sub_8094C20(0); + sub_8094C98(0, i); + sub_806E6F0(&gPlayerParty[r4], &gPlayerParty[n]); + break; + } + } +} + +void sub_8094E20(u8 a) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + gUnknown_02038473 = a; + nullsub_14(); + pokemon_change_order(); + OpenPartyMenu(1, 0xFF); +} + +void sub_8094E4C(void) +{ + sub_8094E20(3); +} int SetUpBattlePartyMenu(void) { switch (EWRAM_1B000.unk264) + //switch (ewram1B000.unk264[0]) { case 0: //TODO: try to get rid of this duplicate code @@ -172,9 +467,9 @@ int SetUpBattlePartyMenu(void) if (gUnknown_02038473 == 3) { if (GetItemEffectType(gScriptItemId) == 10) - EWRAM_1B000.unk259 = 0xFF; + ewram1B000.unk259 = 0xFF; else - EWRAM_1B000.unk259 = 3; + ewram1B000.unk259 = 3; } return TRUE; } diff --git a/src/party_menu.c b/src/party_menu.c index b08180645..ad0007695 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -31,7 +31,7 @@ struct Unk201B000 u8 unk260; u8 unk261; u8 filler262[2]; - s16 unk264[DATA_COUNT * 2]; + s16 unk264[DATA_COUNT * 2]; // This may be a union u8 filler27C[2]; s16 unk27E; s16 unk280; diff --git a/src/rom_8094928.c b/src/rom_8094928.c deleted file mode 100644 index 794fc78f6..000000000 --- a/src/rom_8094928.c +++ /dev/null @@ -1,135 +0,0 @@ -#include "global.h" -#include "pokemon.h" - -#define UNK_201606C_ARRAY (unk_2000000 + 0x1606C) // lazy define but whatever. - -extern u8 unk_2000000[]; - -extern struct PokemonStorage gPokemonStorage; -extern u8 IsLinkDoubleBattle(void); -extern u8 IsDoubleBattle(void); -extern u8 battle_get_side_with_given_state(u8); -extern u8 battle_side_get_owner(u8); -void sub_8094998(u8[3], u8); -void sub_8094A74(u8[3], u8, u32); - -extern u8 gUnknown_02038470[3]; -extern u8 sub_803FBBC(void); -extern u16 gUnknown_02024A6A[]; - -void unref_sub_8094928(struct PokemonStorage *ptr) -{ - *ptr = gPokemonStorage; -} - -void unref_sub_8094940(struct PokemonStorage *ptr) -{ - gPokemonStorage = *ptr; -} - -void sub_8094958(void) -{ - sub_8094998(gUnknown_02038470, sub_803FBBC()); -} - -void sub_8094978(u8 arg1, u8 arg2) -{ - sub_8094A74((UNK_201606C_ARRAY) + arg1 * 3, arg2, arg1); -} - -void sub_8094998(u8 arg[3], u8 player_number) -{ - int i; - u32 pos; - u8 temp[6]; - if (IsLinkDoubleBattle() == TRUE) - { - if (player_number) - { - *arg = 0x30; - arg[1] = 0x45; - arg[2] = 0x12; - } - else - { - *arg = 0x03; - arg[1] = 0x12; - arg[2] = 0x45; - } - } - else - { - if (!IsDoubleBattle()) - { - pos = 1; - *temp = gUnknown_02024A6A[battle_get_side_with_given_state(0)]; - for (i = 0; i <= 5; i++) - if (i != *temp) - temp[pos++] = i; - } - else - { - pos = 2; - *temp = gUnknown_02024A6A[battle_get_side_with_given_state(0)]; - temp[1] = gUnknown_02024A6A[battle_get_side_with_given_state(2)]; - for (i = 0; i <= 5; i++) - if ((i != *temp) && (i != temp[1])) - temp[pos++] = i; - } - for (i = 0; i <= 2; i++) - arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; - } -} - -void sub_8094A74(u8 arg[3], u8 player_number, u32 arg3) -{ - int i, j; - u8 temp[6]; - if (!battle_side_get_owner(arg3)) - { - i = battle_get_side_with_given_state(0); - j = battle_get_side_with_given_state(2); - } - else - { - i = battle_get_side_with_given_state(1); - j = battle_get_side_with_given_state(3); - } - if (IsLinkDoubleBattle() == TRUE) - { - if (player_number) - { - *arg = 0x30; - arg[1] = 0x45; - arg[2] = 0x12; - } - else - { - *arg = 0x03; - arg[1] = 0x12; - arg[2] = 0x45; - } - } - else - { - if (!IsDoubleBattle()) - { - int pos = 1; - *temp = gUnknown_02024A6A[i]; - for (i = 0; i <= 5; i++) - if (i != *temp) - temp[pos++] = i; - } - else - { - int pos = 2; - *temp = gUnknown_02024A6A[i]; - temp[1] = gUnknown_02024A6A[j]; - for (i = 0; i <= 5; i++) - if ((i != *temp) && (i != temp[1])) - temp[pos++] = i; - } - for (i = 0; i <= 2; i++) - arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1]; - } -} |