diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/pokemon_jump.c | 419 |
1 files changed, 401 insertions, 18 deletions
diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index d893768f9..7af1d496a 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -2,6 +2,7 @@ #include "alloc.h" #include "item.h" #include "link.h" +#include "link_rfu.h" #include "main.h" #include "menu.h" #include "palette.h" @@ -90,9 +91,10 @@ struct PokemonJump1 u8 unk71; u16 unk72; u16 unk74; - int unk78; + u32 unk78; u8 unk7C[MAX_RFU_PLAYERS]; - u8 filler81[0xA]; + u8 unk81[MAX_RFU_PLAYERS]; + u8 unk86[MAX_RFU_PLAYERS]; u8 unk8B[MAX_RFU_PLAYERS]; u16 unk90[MAX_RFU_PLAYERS]; u16 unk9A[MAX_RFU_PLAYERS]; @@ -167,18 +169,31 @@ static void sub_802C0E8(void); static void sub_802C114(void); static bool32 sub_802C130(u16); static void sub_802C164(void); -void sub_802C1DC(void); -void sub_802C260(void); -void sub_802C270(void); -void sub_802C43C(void); -void sub_802C808(u16, u16 *, u16 *); -bool32 sub_802C538(void); -bool32 sub_802C650(void); -bool32 sub_802C5DC(void); -bool32 sub_802C70C(void); -bool32 sub_802C7BC(void); -u16 sub_802C7E0(void); +static void sub_802C1DC(void); +static void sub_802C240(void); +static void sub_802C260(void); +static void sub_802C270(void); +static void sub_802C280(void); +static void sub_802C398(int); +static void sub_802C43C(void); +static bool32 sub_802C538(void); +static bool32 sub_802C5DC(void); +static bool32 sub_802C618(void); +static bool32 sub_802C650(void); +static void sub_802C688(int); +static int sub_802C6B0(void); +static bool32 sub_802C70C(void); +static int sub_802C73C(u8 *); +static void sub_802C780(void); +static int sub_802C790(int); +static void sub_802C7A0(u16); +static bool32 sub_802C7BC(void); +static u16 sub_802C7E0(void); +static void sub_802C808(u16, u16 *, u16 *); +static u16 sub_802C818(void); +u16 sub_802C838(void); u16 sub_802C880(u16, u16); +void sub_802DC9C(u32); void sub_802D074(void *); void sub_802D0AC(void); void sub_802D0C8(int); @@ -190,9 +205,13 @@ void sub_802D884(u16); void sub_802D8FC(u16); bool32 sub_802D974(void); void sub_802DA14(void); +void sub_802DC80(int, s8); +void sub_802DD88(u8); bool32 sub_802DA44(void); void sub_802DD64(int); s8 sub_802DA8C(void); +int sub_802DCCC(u8); +void sub_802DD74(u16); void sub_802DDA0(u8); int sub_802DDB8(int); void sub_802DDCC(void); @@ -343,6 +362,11 @@ bool32 (* const gUnknown_082FB618[])(void) = extern const u16 gUnknown_082FB63C[]; extern const u16 gUnknown_082FB64C[4]; +extern const u16 gUnknown_082FB654[]; +extern s8 gUnknown_082FB65C[][48]; +extern int gUnknown_082FB6EC[]; +extern int gUnknown_082FB714[]; +extern u16 gUnknown_082FB704[8]; void sub_802A9A8(u16 partyIndex, MainCallback callback) { @@ -383,7 +407,7 @@ static void sub_802AA60(struct PokemonJump1 *arg0) arg0->unk72 = 0; sub_802AB20(); sub_802AA94(arg0); - if (arg0->unk5 == 5) + if (arg0->unk5 == MAX_RFU_PLAYERS) sub_802E3A8(); } @@ -614,7 +638,7 @@ static void sub_802ACA0(u8 taskId) } } -void sub_802AE14(int arg0) +static void sub_802AE14(int arg0) { if (arg0 == 0) { @@ -1650,7 +1674,7 @@ static void sub_802C0B8(void) sub_802C270(); } -int sub_802C0DC(void) +static int sub_802C0DC(void) { return gUnknown_02022CFC->unk10; } @@ -1683,7 +1707,7 @@ static void sub_802C164(void) gUnknown_02022CFC->unk83AC->unk10 = 1; } -void sub_802C18C(void) +static void sub_802C18C(void) { gUnknown_02022CFC->unk83AC->unk12 = gUnknown_02022CFC->unk83AC->unk10; gUnknown_02022CFC->unk83AC->unk10 = 2; @@ -1691,8 +1715,367 @@ void sub_802C18C(void) gUnknown_02022CFC->unk83AC->unk14 = 2; } -void sub_802C1BC(void) +static void sub_802C1BC(void) { gUnknown_02022CFC->unk83AC->unk12 = gUnknown_02022CFC->unk83AC->unk10; gUnknown_02022CFC->unk83AC->unk10 = 0; } + +static void sub_802C1DC(void) +{ + if (gUnknown_02022CFC->unk5C) + { + sub_802DD64(gUnknown_02022CFC->unk78); + gUnknown_02022CFC->unk5C = 0; + if (gUnknown_02022CFC->unk4D) + { + int index = sub_802DCCC(gUnknown_02022CFC->unk71); + PlaySE(gUnknown_082FB654[index - 2]); + gUnknown_02022CFC->unk4D = 0; + } + } + + sub_802DD74(gUnknown_02022CFC->unk74); + sub_802C280(); + sub_802C240(); +} + +static void sub_802C240(void) +{ + if (gUnknown_02022CFC->unk46) + sub_802DC9C(gUnknown_02022CFC->unk14); +} + +static void sub_802C260(void) +{ + gUnknown_02022CFC->unk46 = 0; +} + +static void sub_802C270(void) +{ + gUnknown_02022CFC->unk46 = 1; +} + +static void sub_802C280(void) +{ + int i; + int whichSound = 0; + int numLinkPlayers = gUnknown_02022CFC->unk5; + + for (i = 0; i < numLinkPlayers; i++) + { + switch (gUnknown_02022CFC->unk82E4[i].unk10) + { + case 0: + sub_802DC80(i, 0); + break; + case 1: + if (gUnknown_02022CFC->unk82E4[i].unk12 != 1 || gUnknown_02022CFC->unk82E4[i].unkE != gUnknown_02022CFC->unk9A[i]) + { + if (i == gUnknown_02022CFC->unk6) + gUnknown_02022CFC->unk82E4[i].unk12 = 1; + + whichSound |= 0x1; + gUnknown_02022CFC->unk82E4[i].unk4 = 0x7FFFFFFF; + gUnknown_02022CFC->unk9A[i] = gUnknown_02022CFC->unk82E4[i].unkE; + } + + sub_802C398(i); + break; + case 2: + if (gUnknown_02022CFC->unk82E4[i].unk12 != 2) + { + if (i == gUnknown_02022CFC->unk6) + gUnknown_02022CFC->unk82E4[i].unk12 = 2; + + whichSound |= 0x2; + sub_802DD88(i); + } + break; + } + } + + if (whichSound & 0x2) + PlaySE(SE_RG_NAWAMISS); + else if (whichSound & 0x1) + PlaySE(SE_DANSA); +} + +static void sub_802C398(int multiplayerId) +{ + int var0; + int var1; + struct PokemonJump1_82E4 *player; + + if (gUnknown_02022CFC->unk68) + return; + + player = &gUnknown_02022CFC->unk82E4[multiplayerId]; + if (player->unk4 != 0x7FFFFFFF) + { + player->unk4++; + var0 = player->unk4; + } + else + { + var0 = gUnknown_02022CFC->unk4A - player->unkE; + if (var0 >= 65000) + { + var0 -= 65000; + var0 += gUnknown_02022CFC->unk4A; + } + + player->unk4 = var0; + } + + if (var0 < 4) + return; + + var0 -= 4; + if (var0 < 48) + var1 = gUnknown_082FB65C[player->unkC][var0]; + else + var1 = 0; + + sub_802DC80(multiplayerId, var1); + if (!var1 && multiplayerId == gUnknown_02022CFC->unk6) + sub_802C1BC(); + + player->unk0 = var1; +} + +static void sub_802C43C(void) +{ + if (gUnknown_02022CFC->unk14 == 8 && gUnknown_02022CFC->unk18 == 7) + { + if (gUnknown_02022CFC->unk58 == 0) + { + sub_802C780(); + gUnknown_02022CFC->unk54 = 0; + gUnknown_02022CFC->unk58 = 1; + gUnknown_02022CFC->unk71 = 0; + } + else + { + if (gUnknown_02022CFC->unk54 == 5) + { + gUnknown_02022CFC->unkC++; + sub_802C7A0(gUnknown_02022CFC->unkC); + } + else + { + gUnknown_02022CFC->unkC = 0; + } + + if (gUnknown_02022CFC->unk54 > 1) + { + gUnknown_02022CFC->unk64 = 1; + memcpy(gUnknown_02022CFC->unk86, gUnknown_02022CFC->unk81, sizeof(u8) * MAX_RFU_PLAYERS); + } + + sub_802C780(); + gUnknown_02022CFC->unk54 = 0; + gUnknown_02022CFC->unk58 = 1; + gUnknown_02022CFC->unk71 = 0; + if (gUnknown_02022CFC->unk74 < 9999) + gUnknown_02022CFC->unk74++; + + sub_802C688(10); + sub_802AE14(3); + } + } + + if (gUnknown_02022CFC->unk64 && (sub_802C618() == TRUE || !gUnknown_02022CFC->unk14)) + { + int var0 = sub_802C73C(gUnknown_02022CFC->unk86); + sub_802C688(sub_802C790(var0)); + sub_802AE14(3); + gUnknown_02022CFC->unk64 = 0; + } + + if (gUnknown_02022CFC->unk58) + { + int var1 = sub_802C6B0(); + if (var1 > gUnknown_02022CFC->unk54) + { + gUnknown_02022CFC->unk54 = var1; + memcpy(gUnknown_02022CFC->unk81, gUnknown_02022CFC->unk7C, sizeof(u8) * MAX_RFU_PLAYERS); + } + } +} + +static bool32 sub_802C538(void) +{ + int i; + + if (gUnknown_02022CFC->unk14 == 6 && !gUnknown_02022CFC->unk83AC->unk0) + { + if (gUnknown_02022CFC->unk83AC->unk12 == 1 && sub_802C0DC() == 1) + { + gUnknown_02022CFC->unk83AC->unk14 = 1; + } + else + { + sub_802C18C(); + sub_802AE14(3); + } + } + + if (gUnknown_02022CFC->unk14 == 7 + && gUnknown_02022CFC->unk18 == 6 + && gUnknown_02022CFC->unk83AC->unk10 != 2) + { + gUnknown_02022CFC->unk83AC->unk14 = 1; + sub_802AE14(3); + } + + for (i = 0; i < gUnknown_02022CFC->unk5; i++) + { + if (gUnknown_02022CFC->unk82E4[i].unk10 == 2) + return FALSE; + } + + return TRUE; +} + +static bool32 sub_802C5DC(void) +{ + int i; + int numPlayers = gUnknown_02022CFC->unk5; + int count = 0; + for (i = 0; i < numPlayers; i++) + { + if (gUnknown_02022CFC->unk82E4[i].unk14) + count++; + } + + return count == numPlayers; +} + +static bool32 sub_802C618(void) +{ + int i; + for (i = 0; i < gUnknown_02022CFC->unk5; i++) + { + if (gUnknown_02022CFC->unk82E4[i].unk14 != 1) + return FALSE; + } + + return TRUE; +} + +static bool32 sub_802C650(void) +{ + int i; + + if (gUnknown_02022CFC->unk45 == 1) + return FALSE; + + for (i = 1; i < gUnknown_02022CFC->unk5; i++) + { + if (gUnknown_02022CFC->unk90[i] == 1) + return FALSE; + } + + return TRUE; +} + +static void sub_802C688(int arg0) +{ + gUnknown_02022CFC->unk78 += arg0; + gUnknown_02022CFC->unk5C = 1; + if (gUnknown_02022CFC->unk78 >= 99990) + gUnknown_02022CFC->unk78 = 99990; +} + +static int sub_802C6B0(void) +{ + int i; + int count = 0; + int numPlayers = gUnknown_02022CFC->unk5; + + for (i = 0; i < numPlayers; i++) + { + if (gUnknown_02022CFC->unk82E4[i].unk0 == -30) + { + gUnknown_02022CFC->unk7C[i] = 1; + count++; + } + else + { + gUnknown_02022CFC->unk7C[i] = 0; + } + } + + return count; +} + +static bool32 sub_802C70C(void) +{ + return !gUnknown_03005000.unk_124.unk_8c2 && !gUnknown_03005000.unk_9e8.unk_232; +} + +static int sub_802C73C(u8 *arg0) +{ + int i; + int flags; + int count; + + for (i = 0, flags = 0, count = 0; i < MAX_RFU_PLAYERS; i++) + { + if (arg0[i]) + { + flags |= 1 << i; + count++; + } + } + + gUnknown_02022CFC->unk71 = flags; + if (flags) + gUnknown_02022CFC->unk4D = 1; + + return count; +} + +static void sub_802C780(void) +{ + gUnknown_02022CFC->unk44 = 0; +} + +static int sub_802C790(int arg0) +{ + return gUnknown_082FB6EC[arg0]; +} + +static void sub_802C7A0(u16 arg0) +{ + if (arg0 > gUnknown_02022CFC->unkE) + gUnknown_02022CFC->unkE = arg0; +} + +static bool32 sub_802C7BC(void) +{ + if (gUnknown_02022CFC->unk78 >= gUnknown_082FB714[0]) + return TRUE; + else + return FALSE; +} + +static u16 sub_802C7E0(void) +{ + u16 lo = sub_802C818(); + u16 hi = sub_802C838(); + return (hi << 12) | (lo & 0xFFF); +} + +static void sub_802C808(u16 arg0, u16 *arg1, u16 *arg2) +{ + *arg2 = arg0 >> 12; + *arg1 = arg0 & 0xFFF; +} + +static u16 sub_802C818(void) +{ + u16 index = Random() % ARRAY_COUNT(gUnknown_082FB704); + return gUnknown_082FB704[index]; +} |