diff options
-rw-r--r-- | include/pokemon_jump.h | 113 | ||||
-rw-r--r-- | ld_script.txt | 9 | ||||
-rw-r--r-- | src/pokemon_jump.c | 3979 | ||||
-rw-r--r-- | src/pokemon_jump_2.c | 2034 | ||||
-rw-r--r-- | src/pokemon_jump_3.c | 167 | ||||
-rw-r--r-- | src/pokemon_jump_4.c | 922 | ||||
-rw-r--r-- | src/pokemon_jump_5.c | 637 | ||||
-rw-r--r-- | src/pokemon_jump_6.c | 140 | ||||
-rw-r--r-- | sym_ewram.txt | 3 |
9 files changed, 3980 insertions, 4024 deletions
diff --git a/include/pokemon_jump.h b/include/pokemon_jump.h index 83e28d2fd..fa4105a0e 100644 --- a/include/pokemon_jump.h +++ b/include/pokemon_jump.h @@ -2,122 +2,9 @@ #define GUARD_POKEMON_JUMP_H #include "main.h" -#include "link.h" - -struct PokemonJump1_MonInfo -{ - u16 species; - u32 otId; - u32 personality; -}; - -struct PokemonJump1_82E4 -{ - int unk0; - int unk4; - u8 filler8[0x4]; - u16 unkC; - u16 unkE; - u16 unk10; - u16 unk12; - int unk14; - int unk18; - u8 unk1C[11]; -}; - -struct PokemonJump2 -{ - int unk0; - u16 unk4; - u8 unk6; - u8 filler7[0xa - 0x7]; - u8 unkA; - u8 unkB; - u8 unkC; - u8 unkD; - u8 unkE; - u8 unkF; - u16 filler10; - u16 unk12; - u16 unk14; - u32 unk18; - u16 unk1C[5]; - u8 txtBuff[2][0x40]; - u8 strBuff[0x100]; - u16 tilemapBuffer[0x4000]; // Bug: way larger than it should be - struct Sprite *unk81A8[MAX_RFU_PLAYERS]; - struct Sprite *unk81BC[MAX_RFU_PLAYERS]; - struct Sprite *unk81D0[8]; - u8 filler81F0[0xC]; - u8 unk81FC[MAX_RFU_PLAYERS]; -}; - -struct PokemonJump1Sub -{ - u8 unk0; - u8 unk1; - u16 unk2; - u16 unk4; - u32 unk8; -}; void ResetPokeJumpResults(void); bool32 IsSpeciesAllowedInPokemonJump(u16 species); void StartPokemonJump(u16 species, MainCallback callback); -u16 sub_81499A4(void); -u16 sub_81499B4(void); -struct PokemonJump1_MonInfo *sub_81499C0(u8 multiplayerId); -u8 *sub_81499E0(u8 multiplayerId); - -void sub_814A95C(int id); -void sub_8149CEC(struct PokemonJump2 *); -void sub_8149D24(void); -void sub_8149D40(int); -bool32 sub_8149D68(void); -void sub_814A3E4(void); -bool32 sub_814A408(void); -void sub_814A468(u16 itemId, u16 quantity); -void sub_814A53C(u16 itemId); -void sub_814A5B4(u16 itemId); -bool32 sub_814A62C(void); -void sub_814A6CC(void); -void sub_814A940(u32 id, s16 y); -void sub_814AA48(u8 multiplayerId); -bool32 sub_814A6FC(void); -void sub_814AA24(int); -s8 sub_814A744(void); -int sub_814A98C(u8 flags); -void sub_814AA34(u16); -void sub_814AA60(u8 multiplayerId); -int sub_814AA78(int multiplayerId); -void sub_814AA8C(void); -void sub_814AAA0(void); -void sub_814AAB4(int); -int sub_814AAC8(void); -void sub_8149A6C(struct PokemonJump1_MonInfo *arg0); -bool32 sub_8149A90(int multiplayerId, struct PokemonJump1_MonInfo *arg0); -void sub_8149AF8(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1); -bool32 sub_8149B7C(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1); -void sub_8149BF4(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2); -bool32 sub_8149C24(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3); -bool32 sub_8149C90(struct PokemonJump1_82E4 *arg0, int multiplayerId); -bool32 sub_814B494(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow); -void sub_814B4E8(void); - -void sub_814AD6C(struct PokemonJump2 *); -void sub_814B294(struct PokemonJump2 *); -void sub_814B43C(struct PokemonJump2 *); -bool32 sub_814B460(void); -void sub_814B348(struct PokemonJump2 *, int); -void sub_814AF0C(struct PokemonJump2 *, int); -void sub_814ADCC(struct PokemonJump2 *, struct PokemonJump1_MonInfo *,s16, s16, u8); -void sub_814B240(struct PokemonJump2 *,s16, s16, u8); -void sub_814AFE8(struct PokemonJump2 *, int multiplayerId); -void sub_814B080(struct PokemonJump2 *, int multiplayerId); -bool32 sub_814B010(struct PokemonJump2 *, int multiplayerId); -void sub_814B0A8(struct PokemonJump2 *); -void sub_814B134(struct PokemonJump2 *); -void sub_814B168(struct PokemonJump2 *, int multiplayerId); -bool32 sub_814B190(struct PokemonJump2 *); #endif // GUARD_POKEMON_JUMP_H diff --git a/ld_script.txt b/ld_script.txt index a637721dd..aa4e7906d 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -285,11 +285,6 @@ SECTIONS { src/menews_jisan.o(.text); src/seagallop.o(.text); src/pokemon_jump.o(.text); - src/pokemon_jump_2.o(.text); - src/pokemon_jump_3.o(.text); - src/pokemon_jump_4.o(.text); - src/pokemon_jump_5.o(.text); - src/pokemon_jump_6.o(.text); src/berry_crush.o(.text); src/wireless_communication_status_screen.o(.text); src/braille_text.o(.text); @@ -588,10 +583,6 @@ SECTIONS { src/menews_jisan.o(.rodata.str1.4); src/seagallop.o(.rodata); src/pokemon_jump.o(.rodata); - src/pokemon_jump_2.o(.rodata); - src/pokemon_jump_4.o(.rodata); - src/pokemon_jump_5.o(.rodata); - src/pokemon_jump_6.o(.rodata); src/berry_crush.o(.rodata); src/wireless_communication_status_screen.o(.rodata); src/braille_text.o(.rodata); diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index ef9f92e4e..26f2e18f1 100644 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -2,16 +2,312 @@ #include "gflib.h" #include "battle_anim.h" #include "decompress.h" +#include "digit_obj_util.h" +#include "dynamic_placeholder_text_util.h" +#include "event_data.h" +#include "item.h" #include "link.h" #include "link_rfu.h" +#include "menu.h" +#include "minigame_countdown.h" +#include "new_menu_helpers.h" +#include "pokemon_jump.h" +#include "random.h" +#include "save.h" +#include "script.h" +#include "strings.h" #include "task.h" +#include "text_window.h" +#include "trig.h" +#include "constants/items.h" #include "constants/songs.h" +struct PokemonJump1_MonInfo +{ + u16 species; + u32 otId; + u32 personality; +}; + +struct PokemonJump1_82E4 +{ + int unk0; + int unk4; + u8 filler8[0x4]; + u16 unkC; + u16 unkE; + u16 unk10; + u16 unk12; + int unk14; + int unk18; + u8 unk1C[11]; +}; + +struct PokemonJump2 +{ + int unk0; + u16 unk4; + u8 unk6; + u8 filler7[0xa - 0x7]; + u8 unkA; + u8 unkB; + u8 unkC; + u8 unkD; + u8 unkE; + u8 unkF; + u16 filler10; + u16 unk12; + u16 unk14; + u32 unk18; + u16 unk1C[5]; + u8 txtBuff[2][0x40]; + u8 strBuff[0x100]; + u16 tilemapBuffer[0x4000]; // Bug: way larger than it should be + struct Sprite *unk81A8[MAX_RFU_PLAYERS]; + struct Sprite *unk81BC[MAX_RFU_PLAYERS]; + struct Sprite *unk81D0[8]; + u8 filler81F0[0xC]; + u8 unk81FC[MAX_RFU_PLAYERS]; +}; + +struct PokemonJump1Sub +{ + u8 unk0; + u8 unk1; + u16 unk2; + u16 unk4; + u32 unk8; +}; + +struct MonInfoPacket +{ + u8 id; // packet id + u16 species; + u32 personality; + u32 otId; +}; + +struct PokemonJump1 +{ + MainCallback returnCallback; + u8 unk4; + u8 unk5; + u8 unk6; + u8 unk7; + u16 unk8; + u16 unkA; + u16 unkC; + u16 unkE; + int unk10; + u32 unk14; + u32 unk18; + int unk1C; + u32 unk20; + u32 unk24; + u32 unk28; + int unk2C; + u32 unk30; + u16 unk34; + u16 unk36; + u8 filler38[0x2]; + u16 unk3A; + u16 unk3C; + u16 unk3E; + u16 unk40; + u16 unk42; + u8 unk44; + u8 unk45; + u8 unk46; + u8 isLeader; + u8 unk48; + u8 unk49; + u16 unk4A; + u8 unk4C; + u8 unk4D; + u16 unk4E; + u8 unk50; + u8 unk51; + u8 filler52[0x2]; + int unk54; + int unk58; + int unk5C; + int unk60; + int unk64; + int unk68; + int unk6C; + struct PokemonJump1Sub unk70; + u8 unk7C[MAX_RFU_PLAYERS]; + 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]; + struct PokemonJump2 unkA4; + struct PokemonJump1_MonInfo unk82A8[MAX_RFU_PLAYERS]; + struct PokemonJump1_82E4 unk82E4[MAX_RFU_PLAYERS]; + struct PokemonJump1_82E4 *unk83AC; +}; + + static void sub_8147654(u8 taskId); static void sub_81477C0(u8 taskId); static void sub_814784C(u8 taskId); static void sub_81479D4(u8 taskId); static void sub_8147A34(u8 taskId); +static void sub_8147B60(struct PokemonJump1 *); +static void sub_8147B94(struct PokemonJump1 *); +static void sub_8147C20(void); +static void sub_8147C98(void); +static s16 GetPokemonJumpSpeciesIdx(u16 species); +static void sub_8147D2C(struct PokemonJump1_MonInfo *monInfo, struct Pokemon *mon); +static void sub_8147D6C(void); +static void sub_8147DA0(u8 taskId); +static void sub_814807C(u8 taskId); +static void sub_8148104(void); +static void sub_8148290(u8 taskId); +static void sub_81482F8(void); +static bool32 sub_8148344(void); +static bool32 sub_81483D0(void); +static bool32 sub_8148464(void); +static bool32 sub_81484D0(void); +static bool32 sub_814856C(void); +static bool32 sub_81485C8(void); +static bool32 sub_8148664(void); +static bool32 sub_81486C4(void); +static bool32 sub_8148724(void); +static bool32 sub_8148760(void); +static bool32 sub_81487B4(void); +static bool32 sub_8148800(void); +static bool32 sub_814881C(void); +static bool32 sub_81488DC(void); +static bool32 sub_81489C8(void); +static bool32 sub_8148A60(void); +static bool32 sub_8148398(void); +static bool32 sub_8148418(void); +static bool32 sub_81484B0(void); +static bool32 sub_8148B54(void); +static bool32 sub_8148C80(void); +static bool32 sub_8148D5C(void); +static bool32 sub_8148E2C(void); +static void sub_8148E80(u8 taskId); +static void sub_8148F5C(TaskFunc func, u8 taskPriority); +static void sub_8148F7C(void); +static void sub_8148F9C(void); +static void sub_8148FE0(void); +static int sub_8149044(void); +static void sub_8149078(void); +static int sub_8149194(void); +static void sub_81491B4(void); +static void sub_81491E4(void); +static void sub_8149210(void); +static bool32 sub_814922C(u16); +static void sub_8149260(void); +static void sub_81492D8(void); +static void sub_814933C(void); +static void sub_814935C(void); +static void sub_814936C(void); +static void sub_814937C(void); +static void sub_8149490(int); +static void sub_8149534(void); +static bool32 sub_8149630(void); +static bool32 sub_81496D4(void); +static bool32 sub_8149710(void); +static bool32 sub_8149748(void); +static void sub_8149780(int); +static int sub_81497A8(void); +static bool32 sub_8149804(void); +static int sub_8149834(u8 *); +static void sub_8149878(void); +static int sub_8149888(int); +static void sub_8149898(u16); +static bool32 sub_81498B4(void); +static u16 sub_81498D8(void); +static void sub_8149900(u16, u16 *, u16 *); +static u16 sub_8149910(void); +static u16 sub_8149930(void); +static u16 sub_8149978(u16 item, u16 quantity); +static void sub_8149D80(void (*func)(void)); +static void sub_8149DA4(u8 taskId); +static void sub_8149DC8(void); +static void sub_8149F64(void); +static void sub_8149FD0(void); +static void sub_814A03C(void); +static void sub_814A0C8(void); +static void sub_814A174(void); +static void sub_814A218(void); +static void sub_814A264(void); +static void sub_814A308(void); +static void sub_814A3AC(void); +static u32 sub_814A754(u32 left, u32 top, u32 width, u32 height); +static void sub_814A7D0(u16 left, u16 top, u8 cursorPos); +static void sub_814A84C(void); +static void sub_814A8B8(void); +static void sub_814A9C8(void); +static void sub_814AADC(void); +static void sub_814AC30(bool32 arg0); +static void sub_814AC94(void); +static void sub_814ACCC(u8 arg0); +static void sub_814AD50(u8 taskId); +static void sub_8149D34(struct PokemonJump2 *); +static void sub_814AF74(struct Sprite *sprite); +static void sub_814B038(struct Sprite *sprite); +static void sub_814B100(struct Sprite *sprite); +static void sub_814B1CC(struct Sprite *sprite); +static void Task_ShowPokemonJumpRecords(u8 taskId); +static void TruncateToFirstWordOnly(u8 *str); +static void sub_814B5C4(u16 windowId); +void sub_814A95C(int id); +void sub_8149CEC(struct PokemonJump2 *); +void sub_8149D24(void); +void sub_8149D40(int); +bool32 sub_8149D68(void); +void sub_814A3E4(void); +bool32 sub_814A408(void); +void sub_814A468(u16 itemId, u16 quantity); +void sub_814A53C(u16 itemId); +void sub_814A5B4(u16 itemId); +bool32 sub_814A62C(void); +void sub_814A6CC(void); +void sub_814A940(u32 id, s16 y); +void sub_814AA48(u8 multiplayerId); +bool32 sub_814A6FC(void); +void sub_814AA24(int); +s8 sub_814A744(void); +int sub_814A98C(u8 flags); +void sub_814AA34(u16); +void sub_814AA60(u8 multiplayerId); +int sub_814AA78(int multiplayerId); +void sub_814AA8C(void); +void sub_814AAA0(void); +void sub_814AAB4(int); +int sub_814AAC8(void); +void sub_8149A6C(struct PokemonJump1_MonInfo *arg0); +bool32 sub_8149A90(int multiplayerId, struct PokemonJump1_MonInfo *arg0); +void sub_8149AF8(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1); +bool32 sub_8149B7C(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1); +void sub_8149BF4(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2); +bool32 sub_8149C24(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3); +bool32 sub_8149C90(struct PokemonJump1_82E4 *arg0, int multiplayerId); +bool32 sub_814B494(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow); +void sub_814B4E8(void); +void sub_814AD6C(struct PokemonJump2 *); +void sub_814B294(struct PokemonJump2 *); +void sub_814B43C(struct PokemonJump2 *); +bool32 sub_814B460(void); +void sub_814B348(struct PokemonJump2 *, int); +void sub_814AF0C(struct PokemonJump2 *, int); +void sub_814ADCC(struct PokemonJump2 *, struct PokemonJump1_MonInfo *,s16, s16, u8); +void sub_814B240(struct PokemonJump2 *,s16, s16, u8); +void sub_814AFE8(struct PokemonJump2 *, int multiplayerId); +void sub_814B080(struct PokemonJump2 *, int multiplayerId); +bool32 sub_814B010(struct PokemonJump2 *, int multiplayerId); +void sub_814B0A8(struct PokemonJump2 *); +void sub_814B134(struct PokemonJump2 *); +void sub_814B168(struct PokemonJump2 *, int multiplayerId); +bool32 sub_814B190(struct PokemonJump2 *); + +EWRAM_DATA static struct PokemonJump1 *gUnknown_203F3D4 = NULL; +EWRAM_DATA static struct PokemonJump2 *gUnknown_203F3D8 = NULL; static const u16 gUnknown_846AFE8[] = INCBIN_U16("graphics/misc/unk_846B008.gbapal"); static const u32 gUnknown_846B008[] = INCBIN_U32("graphics/misc/unk_846B008.4bpp.lz"); @@ -80,6 +376,146 @@ static const TaskFunc gUnknown_846B4AC[][4] = { { sub_81477C0, sub_814784C, sub_81479D4, sub_8147A34 } }; +/* + According to the clerk, the Pokémon allowed in + Pokémon Jump are all <= 28 inches, and do not + only swim, burrow, or fly. +*/ +static const struct PokemonJumpMons +{ + u16 species; + u16 unk2; +} sPkmnJumpSpecies[] = +{ + { .species = SPECIES_BULBASAUR, .unk2 = 2, }, + { .species = SPECIES_CHARMANDER, .unk2 = 1, }, + { .species = SPECIES_SQUIRTLE, .unk2 = 0, }, + { .species = SPECIES_CATERPIE, .unk2 = 1, }, + { .species = SPECIES_METAPOD, .unk2 = 1, }, + { .species = SPECIES_WEEDLE, .unk2 = 1, }, + { .species = SPECIES_KAKUNA, .unk2 = 1, }, + { .species = SPECIES_RATTATA, .unk2 = 1, }, + { .species = SPECIES_RATICATE, .unk2 = 1, }, + { .species = SPECIES_PIKACHU, .unk2 = 0, }, + { .species = SPECIES_SANDSHREW, .unk2 = 0, }, + { .species = SPECIES_NIDORAN_F, .unk2 = 0, }, + { .species = SPECIES_NIDORAN_M, .unk2 = 0, }, + { .species = SPECIES_CLEFAIRY, .unk2 = 0, }, + { .species = SPECIES_VULPIX, .unk2 = 0, }, + { .species = SPECIES_JIGGLYPUFF, .unk2 = 2, }, + { .species = SPECIES_ODDISH, .unk2 = 2, }, + { .species = SPECIES_PARAS, .unk2 = 1, }, + { .species = SPECIES_MEOWTH, .unk2 = 0, }, + { .species = SPECIES_PSYDUCK, .unk2 = 2, }, + { .species = SPECIES_MANKEY, .unk2 = 1, }, + { .species = SPECIES_GROWLITHE, .unk2 = 1, }, + { .species = SPECIES_POLIWAG, .unk2 = 2, }, + { .species = SPECIES_BELLSPROUT, .unk2 = 2, }, + { .species = SPECIES_SHELLDER, .unk2 = 1, }, + { .species = SPECIES_KRABBY, .unk2 = 1, }, + { .species = SPECIES_EXEGGCUTE, .unk2 = 2, }, + { .species = SPECIES_CUBONE, .unk2 = 0, }, + { .species = SPECIES_DITTO, .unk2 = 2, }, + { .species = SPECIES_EEVEE, .unk2 = 0, }, + { .species = SPECIES_OMANYTE, .unk2 = 1, }, + { .species = SPECIES_KABUTO, .unk2 = 1, }, + { .species = SPECIES_CHIKORITA, .unk2 = 2, }, + { .species = SPECIES_CYNDAQUIL, .unk2 = 1, }, + { .species = SPECIES_TOTODILE, .unk2 = 0, }, + { .species = SPECIES_SPINARAK, .unk2 = 1, }, + { .species = SPECIES_PICHU, .unk2 = 0, }, + { .species = SPECIES_CLEFFA, .unk2 = 0, }, + { .species = SPECIES_IGGLYBUFF, .unk2 = 2, }, + { .species = SPECIES_TOGEPI, .unk2 = 2, }, + { .species = SPECIES_MAREEP, .unk2 = 0, }, + { .species = SPECIES_BELLOSSOM, .unk2 = 2, }, + { .species = SPECIES_MARILL, .unk2 = 2, }, + { .species = SPECIES_SUNKERN, .unk2 = 2, }, + { .species = SPECIES_WOOPER, .unk2 = 2, }, + { .species = SPECIES_PINECO, .unk2 = 2, }, + { .species = SPECIES_SNUBBULL, .unk2 = 0, }, + { .species = SPECIES_SHUCKLE, .unk2 = 2, }, + { .species = SPECIES_TEDDIURSA, .unk2 = 0, }, + { .species = SPECIES_SLUGMA, .unk2 = 2, }, + { .species = SPECIES_SWINUB, .unk2 = 0, }, + { .species = SPECIES_HOUNDOUR, .unk2 = 1, }, + { .species = SPECIES_PHANPY, .unk2 = 0, }, + { .species = SPECIES_PORYGON2, .unk2 = 0, }, + { .species = SPECIES_TYROGUE, .unk2 = 1, }, + { .species = SPECIES_SMOOCHUM, .unk2 = 2, }, + { .species = SPECIES_ELEKID, .unk2 = 1, }, + { .species = SPECIES_MAGBY, .unk2 = 1, }, + { .species = SPECIES_LARVITAR, .unk2 = 1, }, + { .species = SPECIES_TREECKO, .unk2 = 1, }, + { .species = SPECIES_TORCHIC, .unk2 = 2, }, + { .species = SPECIES_MUDKIP, .unk2 = 0, }, + { .species = SPECIES_MARSHTOMP, .unk2 = 0, }, + { .species = SPECIES_POOCHYENA, .unk2 = 1, }, + { .species = SPECIES_ZIGZAGOON, .unk2 = 0, }, + { .species = SPECIES_LINOONE, .unk2 = 0, }, + { .species = SPECIES_WURMPLE, .unk2 = 1, }, + { .species = SPECIES_SILCOON, .unk2 = 2, }, + { .species = SPECIES_CASCOON, .unk2 = 2, }, + { .species = SPECIES_LOTAD, .unk2 = 2, }, + { .species = SPECIES_SEEDOT, .unk2 = 1, }, + { .species = SPECIES_RALTS, .unk2 = 0, }, + { .species = SPECIES_KIRLIA, .unk2 = 0, }, + { .species = SPECIES_SURSKIT, .unk2 = 2, }, + { .species = SPECIES_SHROOMISH, .unk2 = 2, }, + { .species = SPECIES_NINCADA, .unk2 = 1, }, + { .species = SPECIES_WHISMUR, .unk2 = 0, }, + { .species = SPECIES_AZURILL, .unk2 = 2, }, + { .species = SPECIES_SKITTY, .unk2 = 0, }, + { .species = SPECIES_SABLEYE, .unk2 = 0, }, + { .species = SPECIES_MAWILE, .unk2 = 0, }, + { .species = SPECIES_ARON, .unk2 = 1, }, + { .species = SPECIES_MEDITITE, .unk2 = 2, }, + { .species = SPECIES_ELECTRIKE, .unk2 = 1, }, + { .species = SPECIES_PLUSLE, .unk2 = 1, }, + { .species = SPECIES_MINUN, .unk2 = 1, }, + { .species = SPECIES_VOLBEAT, .unk2 = 0, }, + { .species = SPECIES_ILLUMISE, .unk2 = 0, }, + { .species = SPECIES_ROSELIA, .unk2 = 2, }, + { .species = SPECIES_GULPIN, .unk2 = 2, }, + { .species = SPECIES_NUMEL, .unk2 = 2, }, + { .species = SPECIES_TORKOAL, .unk2 = 2, }, + { .species = SPECIES_SPOINK, .unk2 = 0, }, + { .species = SPECIES_TRAPINCH, .unk2 = 2, }, + { .species = SPECIES_CACNEA, .unk2 = 2, }, + { .species = SPECIES_ANORITH, .unk2 = 1, }, + { .species = SPECIES_WYNAUT, .unk2 = 0, }, + { .species = SPECIES_SNORUNT, .unk2 = 0, }, + { .species = SPECIES_CLAMPERL, .unk2 = 1, }, + { .species = SPECIES_BAGON, .unk2 = 1, }, +}; + +static bool32 (* const gUnknown_846B64C[])(void) = +{ + sub_8148344, + sub_81483D0, + sub_8148464, + sub_81484D0, + sub_81485C8, + sub_81486C4, + sub_8148760, + sub_81487B4, + sub_814881C, +}; + + +static bool32 (* const gUnknown_846B670[])(void) = +{ + sub_8148398, + sub_8148418, + sub_81484B0, + sub_814856C, + sub_8148664, + sub_8148724, + sub_8148760, + sub_8148800, + sub_814881C, +}; + // Unused, but looks like it was intended to be a hook UNUSED u8 sub_81475C0(u8 data1, u8 priority) { @@ -252,3 +688,3546 @@ static void sub_8147A34(u8 taskId) data[11]++; } } + +void StartPokemonJump(u16 partyIndex, MainCallback callback) +{ + u8 taskId; + + if (gReceivedRemoteLinkPlayers) + { + gUnknown_203F3D4 = Alloc(sizeof(*gUnknown_203F3D4)); + if (gUnknown_203F3D4 != NULL) + { + ResetTasks(); + taskId = CreateTask(sub_8147DA0, 1); + gUnknown_203F3D4->unk8 = 0; + gUnknown_203F3D4->returnCallback = callback; + gUnknown_203F3D4->unk4 = taskId; + gUnknown_203F3D4->unk6 = GetMultiplayerId(); + sub_8147D2C(&gUnknown_203F3D4->unk82A8[gUnknown_203F3D4->unk6], &gPlayerParty[partyIndex]); + sub_8147B60(gUnknown_203F3D4); + SetWordTaskArg(taskId, 2, (uintptr_t)gUnknown_203F3D4); + SetMainCallback2(sub_8147D6C); + return; + } + } + + SetMainCallback2(callback); +} + +static void sub_8147B48(void) +{ + sub_8149D24(); + Free(gUnknown_203F3D4); +} + +static void sub_8147B60(struct PokemonJump1 *arg0) +{ + arg0->unk5 = GetLinkPlayerCount(); + arg0->unk70.unk0 = 5; + arg0->unk70.unk2 = 0; + sub_8147C20(); + sub_8147B94(arg0); + if (arg0->unk5 == MAX_RFU_PLAYERS) + sub_814B4E8(); +} + +static void sub_8147B94(struct PokemonJump1 *arg0) +{ + int i; + + arg0->unk14 = 6; + arg0->unk18 = 6; + arg0->unk4A = 0; + arg0->unk1C = 0; + arg0->unk5C = 0; + arg0->isLeader = GetMultiplayerId() == 0; + arg0->unk8 = 0; + arg0->unkA = 0; + arg0->unkC = 0; + arg0->unkE = 0; + arg0->unk58 = 0; + arg0->unk3A = 0; + arg0->unk44 = 0; + arg0->unk54 = 0; + arg0->unk46 = 0; + arg0->unk49 = 0; + arg0->unk48 = 1; + arg0->unk70.unk8 = 0; + arg0->unk70.unk1 = 0; + arg0->unk70.unk4 = 0; + arg0->unk60 = 1; + arg0->unk4D = 0; + arg0->unk68 = 0; + arg0->unk64 = 0; + arg0->unk2C = 0; + arg0->unk30 = 0; + sub_8147C98(); + sub_81491E4(); + + for (i = 0; i < MAX_RFU_PLAYERS; i++) + { + arg0->unk7C[i] = 0; + arg0->unk9A[i] = 0; + } +} + +static void sub_8147C20(void) +{ + int i, index; + + for (i = 0; i < MAX_RFU_PLAYERS; i++) + { + index = GetPokemonJumpSpeciesIdx(gUnknown_203F3D4->unk82A8[i].species); + gUnknown_203F3D4->unk82E4[i].unkC = sPkmnJumpSpecies[index].unk2; + } + + gUnknown_203F3D4->unk83AC = &gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6]; +} + +static void sub_8147C98(void) +{ + int i; + + for (i = 0; i < MAX_RFU_PLAYERS; i++) + { + gUnknown_203F3D4->unk82E4[i].unkE = 0; + gUnknown_203F3D4->unk82E4[i].unk10 = 0; + gUnknown_203F3D4->unk82E4[i].unk12 = 0; + gUnknown_203F3D4->unk82E4[i].unk0 = 0; + gUnknown_203F3D4->unk82E4[i].unk4 = 0x7FFFFFFF; + gUnknown_203F3D4->unk82E4[i].unk14 = 0; + gUnknown_203F3D4->unk8B[i] = 9; + } +} + +static s16 GetPokemonJumpSpeciesIdx(u16 species) +{ + u32 i; + for (i = 0; i < NELEMS(sPkmnJumpSpecies); i++) + { + if (sPkmnJumpSpecies[i].species == species) + return i; + } + + return -1; // species isnt allowed +} + +static void sub_8147D2C(struct PokemonJump1_MonInfo *monInfo, struct Pokemon *mon) +{ + monInfo->species = GetMonData(mon, MON_DATA_SPECIES); + monInfo->otId = GetMonData(mon, MON_DATA_OT_ID); + monInfo->personality = GetMonData(mon, MON_DATA_PERSONALITY); +} + +static void sub_8147D58(void) +{ + TransferPlttBuffer(); + LoadOam(); + ProcessSpriteCopyRequests(); +} + +static void sub_8147D6C(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void sub_8147D84(TaskFunc func) +{ + gUnknown_203F3D4->unk4 = CreateTask(func, 1); + gUnknown_203F3D4->unk8 = 0; +} + +static void sub_8147DA0(u8 taskId) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + SetVBlankCallback(NULL); + ResetSpriteData(); + FreeAllSpritePalettes(); + sub_8148F5C(sub_8148E80, 5); + FadeOutMapMusic(4); + gUnknown_203F3D4->unk8++; + break; + case 1: + if (!FuncIsActiveTask(sub_8148E80)) + { + sub_8149CEC(&gUnknown_203F3D4->unkA4); + LoadWirelessStatusIndicatorSpriteGfx(); + CreateWirelessStatusIndicatorSprite(0, 0); + gUnknown_203F3D4->unk8++; + } + break; + case 2: + if (!sub_8149D68() && IsNotWaitingForBGMStop() == TRUE) + { + FadeOutAndPlayNewMapMusic(MUS_POKE_JUMP, 8); + gUnknown_203F3D4->unk8++; + } + break; + case 3: + if (IsLinkTaskFinished()) + { + BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + SetVBlankCallback(sub_8147D58); + gUnknown_203F3D4->unk8++; + } + break; + case 4: + UpdatePaletteFade(); + if (!gPaletteFade.active) + { + gUnknown_203F3D4->unk7 = 0; + gUnknown_203F3D4->unk8++; + } + break; + case 5: + gUnknown_203F3D4->unk7++; + if (gUnknown_203F3D4->unk7 >= 20) + { + if (gUnknown_203F3D4->isLeader) + sub_8147D84(sub_814807C); + else + sub_8147D84(sub_8148290); + + sub_8148F7C(); + DestroyTask(taskId); + } + break; + } +} + +static void sub_8147F10(int arg0) +{ + if (arg0 == 0) + { + gUnknown_203F3D4->unk30 = 0x1111; + gUnknown_203F3D4->unk2C = 1; + } + else + { + gUnknown_203F3D4->unk30 = (1 << (arg0 - 1)) - 1; + gUnknown_203F3D4->unk2C = 0; + } +} + +static void sub_8147F4C(u8 arg0) +{ + int i; + + gUnknown_203F3D4->unk70.unk0 = arg0; + gUnknown_203F3D4->unk8 = 0; + gUnknown_203F3D4->unkA = 0; + gUnknown_203F3D4->unk48 = 1; + gUnknown_203F3D4->unk49 = 0; + for (i = 1; i < gUnknown_203F3D4->unk5; i++) + gUnknown_203F3D4->unk82E4[i].unk18 = 0; +} + +static void sub_8147FA0(void) +{ + int i; + int count; + u16 var0; + u8 var1; + u16 var2; + + for (i = 1, count = 0; i < gUnknown_203F3D4->unk5; i++) + { + var0 = gUnknown_203F3D4->unk82E4[i].unk10; + if (sub_8149C24(&gUnknown_203F3D4->unk82E4[i], i, &var1, &var2)) + { + gUnknown_203F3D4->unk90[i] = var2; + gUnknown_203F3D4->unk8B[i] = var1; + gUnknown_203F3D4->unk82E4[i].unk12 = var0; + } + + if (gUnknown_203F3D4->unk82E4[i].unk18 && gUnknown_203F3D4->unk8B[i] == gUnknown_203F3D4->unk70.unk0) + count++; + } + + if (count == gUnknown_203F3D4->unk5 - 1) + gUnknown_203F3D4->unk49 = 1; +} + +static void sub_814807C(u8 taskId) +{ + sub_8147FA0(); + sub_8149534(); + if (!gUnknown_203F3D4->unk48 && gUnknown_203F3D4->unk49) + { + sub_8147F4C(gUnknown_203F3D4->unk4C); + sub_8147F10(3); + } + + if (gUnknown_203F3D4->unk48 == 1) + { + if (!gUnknown_846B64C[gUnknown_203F3D4->unk70.unk0]()) + { + gUnknown_203F3D4->unk48 = 0; + gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 = 1; + } + } + + sub_81492D8(); + sub_8148104(); +} + +static void sub_8148104(void) +{ + if (!gUnknown_203F3D4->unk2C) + sub_8149AF8(gUnknown_203F3D4->unk82E4, &gUnknown_203F3D4->unk70); + + if (gUnknown_203F3D4->unk30 != 0x1111) + { + gUnknown_203F3D4->unk2C++; + gUnknown_203F3D4->unk2C &= gUnknown_203F3D4->unk30; + } +} + +static void sub_8148140(u8 arg0) +{ + gUnknown_203F3D4->unk70.unk0 = arg0; + gUnknown_203F3D4->unk8 = 0; + gUnknown_203F3D4->unkA = 0; + gUnknown_203F3D4->unk48 = 1; + gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 = 0; +} + +static void sub_8148174(void) +{ + int i; + u16 var0; + struct PokemonJump1Sub sp0; + + var0 = gUnknown_203F3D4->unk82E4[0].unk10; + if (sub_8149B7C(gUnknown_203F3D4->unk82E4, &sp0)) + { + if (gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 == 1 + && sp0.unk0 != gUnknown_203F3D4->unk70.unk0) + { + sub_8148140(sp0.unk0); + } + + if (gUnknown_203F3D4->unk70.unk8 != sp0.unk8) + { + gUnknown_203F3D4->unk70.unk8 = sp0.unk8; + gUnknown_203F3D4->unk5C = 1; + gUnknown_203F3D4->unk70.unk1 = sp0.unk1; + if (gUnknown_203F3D4->unk70.unk1) + gUnknown_203F3D4->unk4D = 1; + else + gUnknown_203F3D4->unk4D = 0; + } + + gUnknown_203F3D4->unk70.unk2 = sp0.unk2; + gUnknown_203F3D4->unk70.unk4 = sp0.unk4; + gUnknown_203F3D4->unk82E4[0].unk12 = var0; + } + + for (i = 1; i < gUnknown_203F3D4->unk5; i++) + { + if (i != gUnknown_203F3D4->unk6) + { + var0 = gUnknown_203F3D4->unk82E4[i].unk10; + if (sub_8149C90(&gUnknown_203F3D4->unk82E4[i], i)) + gUnknown_203F3D4->unk82E4[i].unk12 = var0; + } + } +} + +static void sub_8148290(u8 taskId) +{ + sub_8148174(); + if (gUnknown_203F3D4->unk48) + { + if (!gUnknown_846B670[gUnknown_203F3D4->unk70.unk0]()) + { + gUnknown_203F3D4->unk48 = 0; + gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 = 1; + sub_8147F10(3); + } + } + + sub_81492D8(); + sub_81482F8(); +} + +static void sub_81482F8(void) +{ + if (!gUnknown_203F3D4->unk2C) + sub_8149BF4(&gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6], gUnknown_203F3D4->unk70.unk0, gUnknown_203F3D4->unk42); + + if (gUnknown_203F3D4->unk30 != 0x1111) + { + gUnknown_203F3D4->unk2C++; + gUnknown_203F3D4->unk2C &= gUnknown_203F3D4->unk30; + } +} + +static bool32 sub_8148344(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + sub_8147F10(3); + gUnknown_203F3D4->unk8++; + // fall through + case 1: + if (!sub_81488DC()) + { + gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unk4A; + gUnknown_203F3D4->unk4C = 1; + return FALSE; + } + break; + } + + return TRUE; +} + +static bool32 sub_8148398(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + sub_8147F10(0); + gUnknown_203F3D4->unk24 = gUnknown_203F3D4->unk70.unk2; + gUnknown_203F3D4->unk8++; + // fall through + case 1: + return sub_81488DC(); + } + + return TRUE; +} + +static bool32 sub_81483D0(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + sub_81491E4(); + sub_8147F10(5); + gUnknown_203F3D4->unk8++; + break; + case 1: + if (gUnknown_203F3D4->unk49) + { + gUnknown_203F3D4->unk4C = 2; + return FALSE; + } + break; + } + + return TRUE; +} + +static bool32 sub_8148418(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + sub_81491E4(); + sub_8147F10(0); + gUnknown_203F3D4->unk4A = gUnknown_203F3D4->unk70.unk2; + gUnknown_203F3D4->unk8++; + // fall through + case 1: + if (sub_8149804()) + return FALSE; + break; + } + + return TRUE; +} + +static bool32 sub_8148464(void) +{ + if (!sub_81489C8()) + { + gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unk4A; + gUnknown_203F3D4->unk4C = 1; + } + else if (sub_8149630()) + { + return TRUE; + } + else + { + sub_81491B4(); + gUnknown_203F3D4->unk4C = 3; + } + + return FALSE; +} + +static bool32 sub_81484B0(void) +{ + if (!sub_81489C8()) + ; + else if (sub_8149630()) + return TRUE; + else + sub_81491B4(); + + return FALSE; +} + +static bool32 sub_81484D0(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + sub_8149630(); + if (sub_81496D4()) + gUnknown_203F3D4->unk8++; + break; + case 1: + if (!sub_8148A60()) + { + if (sub_81498B4()) + { + gUnknown_203F3D4->unk70.unk2 = sub_81498D8(); + gUnknown_203F3D4->unk4C = 7; + } + else if (gUnknown_203F3D4->unk70.unk4 >= 200) + { + gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unkE; + gUnknown_203F3D4->unk4C = 8; + } + else + { + gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unkE; + gUnknown_203F3D4->unk4C = 4; + } + + gUnknown_203F3D4->unk8++; + return FALSE; + } + break; + case 2: + return FALSE; + } + + return TRUE; +} + +static bool32 sub_814856C(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + if (!sub_8149630()) + sub_81491B4(); + if (sub_81496D4()) + gUnknown_203F3D4->unk8++; + break; + case 1: + if (!sub_8148A60()) + { + gUnknown_203F3D4->unk8++; + return FALSE; + } + break; + case 2: + return FALSE; + } + + return TRUE; +} + +static bool32 sub_81485C8(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + sub_8147F10(4); + gUnknown_203F3D4->unk8++; + // fall through + case 1: + if (!sub_8148C80()) + { + sub_814B494(gUnknown_203F3D4->unk70.unk8, gUnknown_203F3D4->unk70.unk4, gUnknown_203F3D4->unk70.unk2); + gUnknown_203F3D4->unk8++; + } + break; + case 2: + if (gUnknown_203F3D4->unk49) + { + if (sub_8149748()) + gUnknown_203F3D4->unk4C = 5; + else + gUnknown_203F3D4->unk4C = 6; + + gUnknown_203F3D4->unk8++; + return FALSE; + } + break; + case 3: + return FALSE; + } + + return TRUE; +} + +static bool32 sub_8148664(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + sub_8147F10(0); + gUnknown_203F3D4->unk8++; + // fall through + case 1: + if (!sub_8148C80()) + { + sub_814B494(gUnknown_203F3D4->unk70.unk8, gUnknown_203F3D4->unk70.unk4, gUnknown_203F3D4->unk70.unk2); + gUnknown_203F3D4->unk42 = gUnknown_203F3D4->unk45; + return FALSE; + } + break; + } + + return TRUE; +} + +static bool32 sub_81486C4(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + if (!sub_8148E2C()) + gUnknown_203F3D4->unk8++; + break; + case 1: + if (gUnknown_203F3D4->unk49) + { + sub_8147B94(gUnknown_203F3D4); + gUnknown_203F3D4->unk24 = Random(); + gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unk24; + gUnknown_203F3D4->unk4C = 0; + return FALSE; + } + break; + } + + return TRUE; +} + +static bool32 sub_8148724(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + if (!sub_8148E2C()) + { + sub_8147B94(gUnknown_203F3D4); + gUnknown_203F3D4->unk8++; + return FALSE; + } + break; + case 1: + return FALSE; + } + + return TRUE; +} + +static bool32 sub_8148760(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + gUnknown_203F3D4->unk8 = 1; + break; + case 1: + sub_8147F10(0); + gUnknown_203F3D4->unk8++; + break; + case 2: + if (!sub_8148D5C()) + { + SetMainCallback2(gUnknown_203F3D4->returnCallback); + sub_8147B48(); + } + break; + } + + return TRUE; +} + +static bool32 sub_81487B4(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + sub_8147F10(4); + gUnknown_203F3D4->unk8++; + break; + case 1: + if (!sub_8148B54()) + { + gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unkE; + gUnknown_203F3D4->unk4C = 8; + return FALSE; + } + break; + } + + return TRUE; +} + +static bool32 sub_8148800(void) +{ + sub_8147F10(0); + if (!sub_8148B54()) + return FALSE; + else + return TRUE; +} + +static bool32 sub_814881C(void) +{ + switch (gUnknown_203F3D4->unk8) + { + case 0: + sub_814B494(gUnknown_203F3D4->unk70.unk8, gUnknown_203F3D4->unk70.unk4, gUnknown_203F3D4->unk70.unk2); + sub_8149D40(5); + gUnknown_203F3D4->unk8++; + break; + case 1: + if (!sub_8149D68()) + { + sub_8147F10(0); + gUnknown_203F3D4->unk8++; + } + break; + case 2: + if (sub_8149804()) + { + CreateTask(Task_LinkSave, 6); + gUnknown_203F3D4->unk8++; + } + break; + case 3: + if (!FuncIsActiveTask(Task_LinkSave)) + { + sub_814A6CC(); + gUnknown_203F3D4->unk8++; + } + break; + case 4: + if (!sub_814A6FC()) + { + gUnknown_203F3D4->unk4C = 4; + return FALSE; + } + break; + } + + return TRUE; +} + +static bool32 sub_81488DC(void) +{ + switch (gUnknown_203F3D4->unkA) + { + case 0: + sub_8149D40(2); + sub_814AAA0(); + gUnknown_203F3D4->unkA++; + break; + case 1: + if (!sub_8149D68()) + { + sub_814AAB4(gUnknown_203F3D4->unk6); + gUnknown_203F3D4->unk3C = 0; + gUnknown_203F3D4->unkA++; + } + break; + case 2: + if (++gUnknown_203F3D4->unk3C > 120) + { + sub_8149D40(3); + gUnknown_203F3D4->unkA++; + } + break; + case 3: + if (sub_8149D68() != 1 && sub_814AAC8() != 1) + gUnknown_203F3D4->unkA++; + break; + case 4: + sub_8149D40(9); + gUnknown_203F3D4->unkA++; + break; + case 5: + if (!sub_8149D68()) + { + sub_814935C(); + sub_814A3E4(); + gUnknown_203F3D4->unkA++; + } + break; + case 6: + if (!sub_814A408()) + { + sub_814936C(); + sub_8148F9C(); + gUnknown_203F3D4->unkA++; + return FALSE; + } + break; + case 7: + return FALSE; + } + + return TRUE; +} + +static bool32 sub_81489C8(void) +{ + sub_8148FE0(); + if (gUnknown_203F3D4->unk36) + { + gUnknown_203F3D4->unk36 = 0; + return FALSE; + } + + switch (gUnknown_203F3D4->unkA) + { + case 0: + if (sub_814922C(0)) + gUnknown_203F3D4->unkA++; + else + break; + // fall through + case 1: + if (gMain.newKeys & A_BUTTON) + { + sub_8149260(); + sub_8147F10(3); + gUnknown_203F3D4->unkA++; + } + break; + case 2: + if (sub_814922C(1) == TRUE) + gUnknown_203F3D4->unkA++; + break; + case 3: + if (sub_814922C(0) == TRUE) + gUnknown_203F3D4->unkA = 0; + break; + } + + return TRUE; +} + +static bool32 sub_8148A60(void) +{ + int i; + + switch (gUnknown_203F3D4->unkA) + { + case 0: + for (i = 0; i < gUnknown_203F3D4->unk5; i++) + { + if (sub_814AA78(i) == 1) + return TRUE; + } + + gUnknown_203F3D4->unkA++; + break; + case 1: + for (i = 0; i < gUnknown_203F3D4->unk5; i++) + { + if (gUnknown_203F3D4->unk82E4[i].unk10 == 2) + sub_814AA60(i); + } + + sub_8149D40(1); + gUnknown_203F3D4->unk3C = 0; + gUnknown_203F3D4->unkA++; + break; + case 2: + if (++gUnknown_203F3D4->unk3C > 100) + { + sub_8149D40(3); + gUnknown_203F3D4->unk3C = 0; + gUnknown_203F3D4->unkA++; + } + break; + case 3: + if (!sub_8149D68()) + { + sub_814AA8C(); + gUnknown_203F3D4->unk70.unk1 = 0; + sub_8149210(); + gUnknown_203F3D4->unkA++; + return FALSE; + } + break; + case 4: + return FALSE; + } + + return TRUE; +} + +static bool32 sub_8148B54(void) +{ + switch (gUnknown_203F3D4->unkA) + { + case 0: + sub_8149900(gUnknown_203F3D4->unk70.unk2, &gUnknown_203F3D4->unk3E, &gUnknown_203F3D4->unk40); + sub_814A468(gUnknown_203F3D4->unk3E, gUnknown_203F3D4->unk40); + gUnknown_203F3D4->unkA++; + break; + case 1: + case 4: + if (!sub_814A62C()) + { + gUnknown_203F3D4->unk3C = 0; + gUnknown_203F3D4->unkA++; + } + break; + case 2: + case 5: + gUnknown_203F3D4->unk3C++; + if (gMain.newKeys & (A_BUTTON | B_BUTTON) || gUnknown_203F3D4->unk3C > 180) + { + sub_814A6CC(); + gUnknown_203F3D4->unkA++; + } + break; + case 3: + if (!sub_814A6FC()) + { + gUnknown_203F3D4->unk40 = sub_8149978(gUnknown_203F3D4->unk3E, gUnknown_203F3D4->unk40); + if (gUnknown_203F3D4->unk40 && AddBagItem(gUnknown_203F3D4->unk3E, gUnknown_203F3D4->unk40)) + { + if (!CheckBagHasSpace(gUnknown_203F3D4->unk3E, 1)) + { + sub_814A53C(gUnknown_203F3D4->unk3E); + gUnknown_203F3D4->unkA = 4; + } + else + { + gUnknown_203F3D4->unkA = 6; + break; + } + } + else + { + sub_814A5B4(gUnknown_203F3D4->unk3E); + gUnknown_203F3D4->unkA = 4; + } + } + break; + case 6: + if (!sub_814A6FC()) + return FALSE; + break; + } + + return TRUE; +} + +static bool32 sub_8148C80(void) +{ + s8 input; + + switch (gUnknown_203F3D4->unkA) + { + case 0: + sub_8149D40(4); + gUnknown_203F3D4->unkA++; + break; + case 1: + if (!sub_8149D68()) + gUnknown_203F3D4->unkA++; + break; + case 2: + input = sub_814A744(); + switch (input) + { + case MENU_B_PRESSED: + case 1: + gUnknown_203F3D4->unk45 = 1; + sub_8149D40(6); + gUnknown_203F3D4->unkA++; + break; + case 0: + gUnknown_203F3D4->unk45 = 2; + sub_8149D40(6); + gUnknown_203F3D4->unkA++; + break; + } + break; + case 3: + if (!sub_8149D68()) + gUnknown_203F3D4->unkA++; + break; + case 4: + sub_8149D40(8); + gUnknown_203F3D4->unkA++; + break; + case 5: + if (!sub_8149D68()) + { + gUnknown_203F3D4->unkA++; + return FALSE; + } + break; + case 6: + return FALSE; + } + + return TRUE; +} + +static bool32 sub_8148D5C(void) +{ + int var0; + + switch (gUnknown_203F3D4->unkA) + { + case 0: + sub_814A6CC(); + gUnknown_203F3D4->unkA++; + break; + case 1: + if (!sub_814A6FC()) + { + sub_8149D40(7); + gUnknown_203F3D4->unkA++; + } + break; + case 2: + var0 = sub_8149D68(); + if (!var0) + { + gUnknown_203F3D4->unk3C = var0; + gUnknown_203F3D4->unkA++; + } + break; + case 3: + if (++gUnknown_203F3D4->unk3C > 120) + { + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + gUnknown_203F3D4->unkA++; + } + break; + case 4: + if (!gPaletteFade.active) + { + SetCloseLinkCallback(); + gUnknown_203F3D4->unkA++; + } + break; + case 5: + if (!gReceivedRemoteLinkPlayers) + return FALSE; + break; + } + + return TRUE; +} + +static bool32 sub_8148E2C(void) +{ + switch (gUnknown_203F3D4->unkA) + { + case 0: + sub_814A6CC(); + sub_814AA24(0); + gUnknown_203F3D4->unkA++; + break; + case 1: + if (!sub_814A6FC()) + { + gUnknown_203F3D4->unkA++; + return FALSE; + } + break; + case 2: + return FALSE; + } + + return TRUE; +} + +static void sub_8148E80(u8 taskId) +{ + int i; + s16 *taskData = gTasks[taskId].data; + struct PokemonJump1 *ptr = (struct PokemonJump1 *)GetWordTaskArg(taskId, 14); + + switch (taskData[0]) + { + case 0: + for (i = 0; i < MAX_RFU_PLAYERS; i++) + taskData[i + 2] = 0; + + taskData[0]++; + // fall through + case 1: + sub_8149A6C(&ptr->unk82A8[ptr->unk6]); + for (i = 0; i < MAX_RFU_PLAYERS; i++) + { + if (!taskData[i + 2] && sub_8149A90(i, &ptr->unk82A8[i])) + { + StringCopy(ptr->unk82E4[i].unk1C, gLinkPlayers[i].name); + taskData[i + 2] = 1; + taskData[1]++; + if (taskData[1] == ptr->unk5) + { + sub_8147C20(); + DestroyTask(taskId); + break; + } + } + } + break; + } +} + +static void sub_8148F5C(TaskFunc func, u8 taskPriority) +{ + u8 taskId = CreateTask(func, taskPriority); + SetWordTaskArg(taskId, 14, (uintptr_t)gUnknown_203F3D4); +} + +static void sub_8148F7C(void) +{ + gUnknown_203F3D4->unk4A = 0; + gUnknown_203F3D4->unk14 = 6; + gUnknown_203F3D4->unk34 = 0; + gUnknown_203F3D4->unk1C = 0; + gUnknown_203F3D4->unk36 = 0; + gUnknown_203F3D4->unk10 = 0; +} + +static void sub_8148F9C(void) +{ + gUnknown_203F3D4->unk4A = 0; + gUnknown_203F3D4->unk34 = 0x6FF; + gUnknown_203F3D4->unk14 = 7; + gUnknown_203F3D4->unk36 = 0; + gUnknown_203F3D4->unk10 = 0; + gUnknown_203F3D4->unk51 = 0; + gUnknown_203F3D4->unk50 = 0; + gUnknown_203F3D4->unk20 = 0; + gUnknown_203F3D4->unk4E = 0; + gUnknown_203F3D4->unk6C = 0; + sub_8149078(); +} + +static void sub_8148FE0(void) +{ + if (gUnknown_203F3D4->unk46) + { + gUnknown_203F3D4->unk4A++; + gUnknown_203F3D4->unk34 += sub_8149044(); + if (gUnknown_203F3D4->unk34 >= 0x9FF) + gUnknown_203F3D4->unk34 -= 0x9FF; + + gUnknown_203F3D4->unk18 = gUnknown_203F3D4->unk14; + gUnknown_203F3D4->unk14 = gUnknown_203F3D4->unk34 >> 8; + if (gUnknown_203F3D4->unk14 > 6 && gUnknown_203F3D4->unk18 < 7) + { + gUnknown_203F3D4->unk36++; + sub_8149078(); + } + } +} + +static int sub_8149044(void) +{ + int result; + + if (gUnknown_203F3D4->unk10) + return 0; + + result = gUnknown_203F3D4->unk1C; + if (gUnknown_203F3D4->unk34 <= 0x5FF) + { + gUnknown_203F3D4->unk20 += 80; + result += gUnknown_203F3D4->unk20 >> 8; + } + + return result; +} + +static const u16 gUnknown_846B694[] = {0x1a, 0x1f, 0x24, 0x29, 0x2e, 0x33, 0x38, 0x3d}; +static const u16 gUnknown_846B6A4[] = {0, 1, 1, 2}; + +static void sub_8149078(void) +{ + int var0; + + gUnknown_203F3D4->unk20 = 0; + if (gUnknown_203F3D4->unk4E) + { + gUnknown_203F3D4->unk4E--; + if (gUnknown_203F3D4->unk6C) + { + if (sub_8149194() % 4 != 0) + { + gUnknown_203F3D4->unk1C = gUnknown_203F3D4->unk28; + } + else + { + if (gUnknown_203F3D4->unk28 > 54) + gUnknown_203F3D4->unk1C = 30; + else + gUnknown_203F3D4->unk1C = 82; + } + } + } + else + { + if (!(gUnknown_203F3D4->unk50 & 8)) + { + gUnknown_203F3D4->unk28 = gUnknown_846B694[gUnknown_203F3D4->unk50] + (gUnknown_203F3D4->unk51 * 7); + gUnknown_203F3D4->unk4E = gUnknown_846B6A4[sub_8149194() % NELEMS(gUnknown_846B6A4)] + 2; + gUnknown_203F3D4->unk50++; + } + else + { + if (gUnknown_203F3D4->unk50 == 8) + { + if (gUnknown_203F3D4->unk51 < 3) + gUnknown_203F3D4->unk51++; + else + gUnknown_203F3D4->unk6C = 1; + } + + var0 = gUnknown_846B694[15 - gUnknown_203F3D4->unk50]; + gUnknown_203F3D4->unk28 = var0 + (gUnknown_203F3D4->unk51 * 7); + if (++gUnknown_203F3D4->unk50 > 15) + { + if (sub_8149194() % 4 == 0) + gUnknown_203F3D4->unk28 -= 5; + + gUnknown_203F3D4->unk50 = 0; + } + } + + gUnknown_203F3D4->unk1C = gUnknown_203F3D4->unk28; + } +} + +static int sub_8149194(void) +{ + // The number 1103515245 comes from the example implementation of rand and srand + gUnknown_203F3D4->unk24 = gUnknown_203F3D4->unk24 * 1103515245 + 24691; + return gUnknown_203F3D4->unk24 >> 16; +} + +static void sub_81491B4(void) +{ + gUnknown_203F3D4->unk10 = 1; + gUnknown_203F3D4->unk14 = 6; + gUnknown_203F3D4->unk34 = 0x5FF; + sub_814936C(); +} + +static int sub_81491D8(void) +{ + return gUnknown_203F3D4->unk10; +} + +static void sub_81491E4(void) +{ + int i; + for (i = 0; i < MAX_RFU_PLAYERS; i++) + gUnknown_203F3D4->unk82E4[i].unk14 = 0; +} + +static void sub_8149210(void) +{ + gUnknown_203F3D4->unk83AC->unk10 = 0; + gUnknown_203F3D4->unk83AC->unk12 = 0; +} + +static bool32 sub_814922C(u16 arg0) +{ + if (gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk10 == arg0) + return TRUE; + else + return FALSE; +} + +static void sub_8149260(void) +{ + gUnknown_203F3D4->unk83AC->unkE = gUnknown_203F3D4->unk4A; + gUnknown_203F3D4->unk83AC->unk12 = gUnknown_203F3D4->unk83AC->unk10; + gUnknown_203F3D4->unk83AC->unk10 = 1; +} + +static void sub_8149288(void) +{ + gUnknown_203F3D4->unk83AC->unk12 = gUnknown_203F3D4->unk83AC->unk10; + gUnknown_203F3D4->unk83AC->unk10 = 2; + gUnknown_203F3D4->unk83AC->unkE = gUnknown_203F3D4->unk4A; + gUnknown_203F3D4->unk83AC->unk14 = 2; +} + +static void sub_81492B8(void) +{ + gUnknown_203F3D4->unk83AC->unk12 = gUnknown_203F3D4->unk83AC->unk10; + gUnknown_203F3D4->unk83AC->unk10 = 0; +} + +static const u16 gUnknown_846B6AC[] = {SE_RS_SHOP, SE_SHINY, SE_M_MORNING_SUN, SE_POKE_JUMP_SUCCESS}; + +static void sub_81492D8(void) +{ + if (gUnknown_203F3D4->unk5C) + { + sub_814AA24(gUnknown_203F3D4->unk70.unk8); + gUnknown_203F3D4->unk5C = 0; + if (gUnknown_203F3D4->unk4D) + { + int index = sub_814A98C(gUnknown_203F3D4->unk70.unk1); + PlaySE(gUnknown_846B6AC[index - 2]); + gUnknown_203F3D4->unk4D = 0; + } + } + + sub_814AA34(gUnknown_203F3D4->unk70.unk4); + sub_814937C(); + sub_814933C(); +} + +static void sub_814933C(void) +{ + if (gUnknown_203F3D4->unk46) + sub_814A95C(gUnknown_203F3D4->unk14); +} + +static void sub_814935C(void) +{ + gUnknown_203F3D4->unk46 = 0; +} + +static void sub_814936C(void) +{ + gUnknown_203F3D4->unk46 = 1; +} + +static void sub_814937C(void) +{ + int i; + int whichSound = 0; + int numLinkPlayers = gUnknown_203F3D4->unk5; + + for (i = 0; i < numLinkPlayers; i++) + { + switch (gUnknown_203F3D4->unk82E4[i].unk10) + { + case 0: + sub_814A940(i, 0); + break; + case 1: + if (gUnknown_203F3D4->unk82E4[i].unk12 != 1 || gUnknown_203F3D4->unk82E4[i].unkE != gUnknown_203F3D4->unk9A[i]) + { + if (i == gUnknown_203F3D4->unk6) + gUnknown_203F3D4->unk82E4[i].unk12 = 1; + + whichSound |= 0x1; + gUnknown_203F3D4->unk82E4[i].unk4 = 0x7FFFFFFF; + gUnknown_203F3D4->unk9A[i] = gUnknown_203F3D4->unk82E4[i].unkE; + } + + sub_8149490(i); + break; + case 2: + if (gUnknown_203F3D4->unk82E4[i].unk12 != 2) + { + if (i == gUnknown_203F3D4->unk6) + gUnknown_203F3D4->unk82E4[i].unk12 = 2; + + whichSound |= 0x2; + sub_814AA48(i); + } + break; + } + } + + if (whichSound & 0x2) + PlaySE(SE_POKE_JUMP_FAILURE); + else if (whichSound & 0x1) + PlaySE(SE_LEDGE); +} + +static const s8 gUnknown_846B6B4[][48] = +{ + {-3, -6, -8, -10, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -28, -27, + -26, -25, -23, -22, -20, -18, -17, -15, -13, -11, -8, -6, -4, -1}, + + {-3, -6, -9, -11, -14, -16, -18, -20, -22, -24, -26, -28, -29, -30, -30, -28, -26, -24, -22, + -20, -18, -16, -14, -11, -9, -6, -4, -1}, + + {-3, -6, -9, -11, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -30, -29, + -29, -28, -28, -27, -27, -26, -25, -24, -22, -20, -18, -16, -14, + -12, -11, -9, -6, -4, -1}, +}; + +static void sub_8149490(int multiplayerId) +{ + int var0; + int var1; + struct PokemonJump1_82E4 *player; + + if (gUnknown_203F3D4->unk68) + return; + + player = &gUnknown_203F3D4->unk82E4[multiplayerId]; + if (player->unk4 != 0x7FFFFFFF) + { + player->unk4++; + var0 = player->unk4; + } + else + { + var0 = gUnknown_203F3D4->unk4A - player->unkE; + if (var0 >= 65000) + { + var0 -= 65000; + var0 += gUnknown_203F3D4->unk4A; + } + + player->unk4 = var0; + } + + if (var0 < 4) + return; + + var0 -= 4; + if (var0 < 48) + var1 = gUnknown_846B6B4[player->unkC][var0]; + else + var1 = 0; + + sub_814A940(multiplayerId, var1); + if (!var1 && multiplayerId == gUnknown_203F3D4->unk6) + sub_81492B8(); + + player->unk0 = var1; +} + +static void sub_8149534(void) +{ + if (gUnknown_203F3D4->unk14 == 8 && gUnknown_203F3D4->unk18 == 7) + { + if (gUnknown_203F3D4->unk58 == 0) + { + sub_8149878(); + gUnknown_203F3D4->unk54 = 0; + gUnknown_203F3D4->unk58 = 1; + gUnknown_203F3D4->unk70.unk1 = 0; + } + else + { + if (gUnknown_203F3D4->unk54 == 5) + { + gUnknown_203F3D4->unkC++; + sub_8149898(gUnknown_203F3D4->unkC); + } + else + { + gUnknown_203F3D4->unkC = 0; + } + + if (gUnknown_203F3D4->unk54 > 1) + { + gUnknown_203F3D4->unk64 = 1; + memcpy(gUnknown_203F3D4->unk86, gUnknown_203F3D4->unk81, sizeof(u8) * MAX_RFU_PLAYERS); + } + + sub_8149878(); + gUnknown_203F3D4->unk54 = 0; + gUnknown_203F3D4->unk58 = 1; + gUnknown_203F3D4->unk70.unk1 = 0; + if (gUnknown_203F3D4->unk70.unk4 < 9999) + gUnknown_203F3D4->unk70.unk4++; + + sub_8149780(10); + sub_8147F10(3); + } + } + + if (gUnknown_203F3D4->unk64 && (sub_8149710() == TRUE || !gUnknown_203F3D4->unk14)) + { + int var0 = sub_8149834(gUnknown_203F3D4->unk86); + sub_8149780(sub_8149888(var0)); + sub_8147F10(3); + gUnknown_203F3D4->unk64 = 0; + } + + if (gUnknown_203F3D4->unk58) + { + int var1 = sub_81497A8(); + if (var1 > gUnknown_203F3D4->unk54) + { + gUnknown_203F3D4->unk54 = var1; + memcpy(gUnknown_203F3D4->unk81, gUnknown_203F3D4->unk7C, sizeof(u8) * MAX_RFU_PLAYERS); + } + } +} + +static bool32 sub_8149630(void) +{ + int i; + + if (gUnknown_203F3D4->unk14 == 6 && !gUnknown_203F3D4->unk83AC->unk0) + { + if (gUnknown_203F3D4->unk83AC->unk12 == 1 && sub_81491D8() == 1) + { + gUnknown_203F3D4->unk83AC->unk14 = 1; + } + else + { + sub_8149288(); + sub_8147F10(3); + } + } + + if (gUnknown_203F3D4->unk14 == 7 + && gUnknown_203F3D4->unk18 == 6 + && gUnknown_203F3D4->unk83AC->unk10 != 2) + { + gUnknown_203F3D4->unk83AC->unk14 = 1; + sub_8147F10(3); + } + + for (i = 0; i < gUnknown_203F3D4->unk5; i++) + { + if (gUnknown_203F3D4->unk82E4[i].unk10 == 2) + return FALSE; + } + + return TRUE; +} + +static bool32 sub_81496D4(void) +{ + int i; + int numPlayers = gUnknown_203F3D4->unk5; + int count = 0; + for (i = 0; i < numPlayers; i++) + { + if (gUnknown_203F3D4->unk82E4[i].unk14) + count++; + } + + return count == numPlayers; +} + +static bool32 sub_8149710(void) +{ + int i; + for (i = 0; i < gUnknown_203F3D4->unk5; i++) + { + if (gUnknown_203F3D4->unk82E4[i].unk14 != 1) + return FALSE; + } + + return TRUE; +} + +static bool32 sub_8149748(void) +{ + int i; + + if (gUnknown_203F3D4->unk45 == 1) + return FALSE; + + for (i = 1; i < gUnknown_203F3D4->unk5; i++) + { + if (gUnknown_203F3D4->unk90[i] == 1) + return FALSE; + } + + return TRUE; +} + +static void sub_8149780(int arg0) +{ + gUnknown_203F3D4->unk70.unk8 += arg0; + gUnknown_203F3D4->unk5C = 1; + if (gUnknown_203F3D4->unk70.unk8 >= 99990) + gUnknown_203F3D4->unk70.unk8 = 99990; +} + +static int sub_81497A8(void) +{ + int i; + int count = 0; + int numPlayers = gUnknown_203F3D4->unk5; + + for (i = 0; i < numPlayers; i++) + { + if (gUnknown_203F3D4->unk82E4[i].unk0 == -30) + { + gUnknown_203F3D4->unk7C[i] = 1; + count++; + } + else + { + gUnknown_203F3D4->unk7C[i] = 0; + } + } + + return count; +} + +static bool32 sub_8149804(void) +{ + return !Rfu.recvQueue.count && !Rfu.sendQueue.count; +} + +static int sub_8149834(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_203F3D4->unk70.unk1 = flags; + if (flags) + gUnknown_203F3D4->unk4D = 1; + + return count; +} + +static void sub_8149878(void) +{ + gUnknown_203F3D4->unk44 = 0; +} + +static const int gUnknown_846B74C[] = {0, 0, 50, 100, 200, 500}; + +static int sub_8149888(int arg0) +{ + return gUnknown_846B74C[arg0]; +} + +static void sub_8149898(u16 arg0) +{ + if (arg0 > gUnknown_203F3D4->unkE) + gUnknown_203F3D4->unkE = arg0; +} + +static const u16 gUnknown_846B764[] = {0x8a, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93}; +static const u32 gUnknown_846B76C[][2] = +{ + {0x1388, 1}, + {0x1f40, 2}, + {0x2ee0, 3}, + {0x3e80, 4}, + {0x4e20, 5}, +}; + +static bool32 sub_81498B4(void) +{ + if (gUnknown_203F3D4->unk70.unk8 >= gUnknown_846B76C[0][0]) + return TRUE; + else + return FALSE; +} + +static u16 sub_81498D8(void) +{ + u16 lo = sub_8149910(); + u16 hi = sub_8149930(); + return (hi << 12) | (lo & 0xFFF); +} + +static void sub_8149900(u16 arg0, u16 *arg1, u16 *arg2) +{ + *arg2 = arg0 >> 12; + *arg1 = arg0 & 0xFFF; +} + +static u16 sub_8149910(void) +{ + u16 index = Random() % NELEMS(gUnknown_846B764); + return gUnknown_846B764[index]; +} + +static u16 sub_8149930(void) +{ + u32 val, i; + + val = 0; + for (i = 0; i < 5; i++) + { + if (gUnknown_203F3D4->unk70.unk8 < gUnknown_846B76C[i][0]) + break; + else if (1) // required to match, see pret/pokeemerald#982 + val = gUnknown_846B76C[i][1]; + else + break; + } + + return val; +} + +static u16 sub_8149978(u16 item, u16 quantity) +{ + while (quantity && !CheckBagHasSpace(item, quantity)) + quantity--; + + return quantity; +} + +u16 sub_81499A4(void) +{ + return GetLinkPlayerCount(); +} + +u16 sub_81499B4(void) +{ + return gUnknown_203F3D4->unk6; +} + +struct PokemonJump1_MonInfo *sub_81499C0(u8 multiplayerId) +{ + return &gUnknown_203F3D4->unk82A8[multiplayerId]; +} + +u8 *sub_81499E0(u8 multiplayerId) +{ + return gUnknown_203F3D4->unk82E4[multiplayerId].unk1C; +} + +bool32 IsSpeciesAllowedInPokemonJump(u16 species) +{ + return GetPokemonJumpSpeciesIdx(species) > -1; +} + +void IsPokemonJumpSpeciesInParty(void) +{ + int i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)) + { + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); + if (IsSpeciesAllowedInPokemonJump(species)) + { + gSpecialVar_Result = TRUE; + return; + } + } + } + + gSpecialVar_Result = FALSE; +} + +void sub_8149A6C(struct PokemonJump1_MonInfo *arg0) +{ + struct MonInfoPacket packet; + packet.id = 1; + packet.species = arg0->species; + packet.otId = arg0->otId; + packet.personality = arg0->personality; + Rfu_SendPacket(&packet); +} + +bool32 sub_8149A90(int multiplayerId, struct PokemonJump1_MonInfo *arg0) +{ + struct MonInfoPacket packet; + + if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00) + return FALSE; + + memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); + if (packet.id == 1) + { + arg0->species = packet.species; + arg0->otId = packet.otId; + arg0->personality = packet.personality; + return TRUE; + } + + return FALSE; +} + +struct UnkPacket2 +{ + u8 id; // packet id + u32 unk4; + u32 unk8; +}; + +void sub_8149AE0(u32 arg0) +{ + struct UnkPacket2 packet; + packet.id = 2; + packet.unk4 = arg0; + Rfu_SendPacket(&packet); +} + +struct UnkPacket3 +{ + u8 id; // packet id + u8 unk1; + u8 unk2; + u8 unk3_0:5; + u8 unk3_1:3; + u16 unk4; + u16 unk6; + u32 unk8_0:15; + u32 unk8_1:17; +}; + +void sub_8149AF8(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1) +{ + struct UnkPacket3 packet; + packet.id = 3; + packet.unk8_1 = arg1->unk8; + packet.unk3_0 = arg1->unk1; + packet.unk1 = arg1->unk0; + packet.unk6 = arg1->unk2; + packet.unk8_0 = arg1->unk4; + packet.unk2 = arg0->unk10; + packet.unk3_1 = arg0->unk14; + packet.unk4 = arg0->unkE; + Rfu_SendPacket(&packet); +} + +bool32 sub_8149B7C(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1) +{ + struct UnkPacket3 packet; + + if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00) + return FALSE; + + memcpy(&packet, &gRecvCmds[0][1], sizeof(packet)); + if (packet.id != 3) + return FALSE; + + arg1->unk8 = packet.unk8_1; + arg1->unk1 = packet.unk3_0; + arg1->unk0 = packet.unk1; + arg1->unk2 = packet.unk6; + arg1->unk4 = packet.unk8_0; + arg0->unk10 = packet.unk2; + arg0->unk14 = packet.unk3_1; + arg0->unkE = packet.unk4; + return TRUE; +} + +struct UnkPacket4 +{ + u8 id; // packet id + u8 unk1; + u8 unk2; + u8 unk3; + u16 unk4; + u8 unk6; + u16 unk8; +}; + +void sub_8149BF4(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2) +{ + struct UnkPacket4 packet; + packet.id = 4; + packet.unk1 = arg0->unk10; + packet.unk2 = arg0->unk14; + packet.unk3 = arg0->unk18; + packet.unk4 = arg0->unkE; + packet.unk6 = arg1; + packet.unk8 = arg2; + Rfu_SendPacket(&packet); +} + +bool32 sub_8149C24(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3) +{ + struct UnkPacket4 packet; + + if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00) + return FALSE; + + memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); + if (packet.id != 4) + return FALSE; + + arg0->unk10 = packet.unk1; + arg0->unk14 = packet.unk2; + arg0->unk18 = packet.unk3; + arg0->unkE = packet.unk4; + *arg2 = packet.unk6; + *arg3 = packet.unk8; + return TRUE; +} + +bool32 sub_8149C90(struct PokemonJump1_82E4 *arg0, int multiplayerId) +{ + struct UnkPacket4 packet; + + if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00) + return FALSE; + + memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); + if (packet.id != 4) + return FALSE; + + arg0->unk10 = packet.unk1; + arg0->unk14 = packet.unk2; + arg0->unk18 = packet.unk3; + arg0->unkE = packet.unk4; + return TRUE; +} + +void sub_8149CEC(struct PokemonJump2 *arg0) +{ + u8 taskId; + + gUnknown_203F3D8 = arg0; + sub_8149D34(gUnknown_203F3D8); + taskId = CreateTask(sub_8149DA4, 3); + gUnknown_203F3D8->unk6 = taskId; + SetWordTaskArg(gUnknown_203F3D8->unk6, 2, (uintptr_t)gUnknown_203F3D8); + sub_8149D80(sub_8149DC8); +} + +void sub_8149D24(void) +{ + FreeAllWindowBuffers(); + DigitObjUtil_Free(); +} + +static void sub_8149D34(struct PokemonJump2 *arg0) +{ + arg0->unk4 = 0; + arg0->unk0 = 0; + arg0->unk12 = 0xFF; +} + +// Gfx +static const u16 sPkmnJumpPal3[] = INCBIN_U16("graphics/link_games/pkmnjump_pal3.gbapal"); + +static const u16 sPkmnJumpBgPal[] = INCBIN_U16("graphics/link_games/pkmnjump_bg.gbapal"); +static const u32 sPkmnJumpBgGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.4bpp.lz"); +static const u32 sPkmnJumpBgTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.bin.lz"); + +static const u16 sPkmnJumpVenusaurPal[] = INCBIN_U16("graphics/link_games/pkmnjump_venusaur.gbapal"); +static const u32 sPkmnJumpVenusaurGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.4bpp.lz"); +static const u32 sPkmnJumpVenusaurTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.bin.lz"); + +static const u16 sPkmnJumpResultsPal[] = INCBIN_U16("graphics/link_games/pkmnjump_results.gbapal"); +static const u32 sPkmnJumpResultsGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_results.4bpp.lz"); +static const u32 sPkmnJumpResultsTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_results.bin.lz"); + +static const struct BgTemplate gUnknown_846D8D4[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 27, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 2, + .charBaseIndex = 1, + .mapBaseIndex = 30, + .screenSize = 2, + .paletteMode = 0, + .priority = 2, + .baseTile = 0 + }, + { + .bg = 1, + .charBaseIndex = 2, + .mapBaseIndex = 12, + .screenSize = 3, + .paletteMode = 0, + .priority = 1, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 3, + .mapBaseIndex = 29, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + }, +}; + +static const struct WindowTemplate gUnknown_846D8E4[] = +{ + { + .bg = 0, + .tilemapLeft = 19, + .tilemapTop = 0, + .width = 6, + .height = 2, + .paletteNum = 2, + .baseBlock = 0x13, + }, + { + .bg = 0, + .tilemapLeft = 8, + .tilemapTop = 0, + .width = 6, + .height = 2, + .paletteNum = 2, + .baseBlock = 0x1F, + }, + DUMMY_WIN_TEMPLATE, +}; + +struct +{ + int id; + void (*func)(void); +} static const gUnknown_846D8FC[] = +{ + {0x00, sub_8149DC8}, + {0x01, sub_8149F64}, + {0x02, sub_8149FD0}, + {0x03, sub_814A03C}, + {0x04, sub_814A0C8}, + {0x05, sub_814A174}, + {0x06, sub_814A218}, + {0x07, sub_814A264}, + {0x09, sub_814A3AC}, + {0x08, sub_814A308}, +}; + +void sub_8149D40(int arg0) +{ + int i; + + for (i = 0; i < NELEMS(gUnknown_846D8FC); i++) + { + if (gUnknown_846D8FC[i].id == arg0) + sub_8149D80(gUnknown_846D8FC[i].func); + } +} + +bool32 sub_8149D68(void) +{ + return (gUnknown_203F3D8->unk0 != 1); +} + +static void sub_8149D80(void (*func)(void)) +{ + SetWordTaskArg(gUnknown_203F3D8->unk6, 0, (uintptr_t)func); + gUnknown_203F3D8->unk4 = 0; + gUnknown_203F3D8->unk0 = 0; +} + +static void sub_8149DA4(u8 taskId) +{ + if (!gUnknown_203F3D8->unk0) + { + void (*func)(void) = (void *)(GetWordTaskArg(taskId, 0)); + + func(); + } +} + +static void sub_8149DC8(void) +{ + switch (gUnknown_203F3D8->unk4) + { + case 0: + ResetBgsAndClearDma3BusyFlags(FALSE); + InitBgsFromTemplates(0, gUnknown_846D8D4, NELEMS(gUnknown_846D8D4)); + InitWindows(gUnknown_846D8E4); + ResetBgPositions(); + ResetTempTileDataBuffers(); + sub_814AD6C(gUnknown_203F3D8); + sub_814A9C8(); + LoadPalette(sPkmnJumpBgPal, 0, 0x20); + DecompressAndCopyTileDataToVram(3, sPkmnJumpBgGfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(3, sPkmnJumpBgTilemap, 0, 0, 1); + LoadPalette(sPkmnJumpVenusaurPal, 0x30, 0x20); + DecompressAndCopyTileDataToVram(2, sPkmnJumpVenusaurGfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(2, sPkmnJumpVenusaurTilemap, 0, 0, 1); + LoadPalette(sPkmnJumpResultsPal, 0x10, 0x20); + DecompressAndCopyTileDataToVram(1, sPkmnJumpResultsGfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, sPkmnJumpResultsTilemap, 0, 0, 1); + LoadPalette(sPkmnJumpPal3, 0x20, 0x20); + SetBgTilemapBuffer(0, gUnknown_203F3D8->tilemapBuffer); + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); + sub_814A84C(); + sub_814AA24(0); + DrawWindowBorderWithStdpal3(0, 1, 0xE0); + LoadUserWindowBorderGfx(0, 0x00A, 0xD0); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(1); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!FreeTempTileDataBuffersIfPossible()) + { + sub_814A8B8(); + sub_814B294(gUnknown_203F3D8); + sub_814B348(gUnknown_203F3D8, 6); + ShowBg(3); + ShowBg(0); + ShowBg(2); + HideBg(1); + gUnknown_203F3D8->unk4++; + } + break; + case 2: + gUnknown_203F3D8->unk0 = 1; + break; + } +} + +static void sub_8149F64(void) +{ + switch (gUnknown_203F3D8->unk4) + { + case 0: + sub_814AADC(); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_814AC30(FALSE); + gUnknown_203F3D8->unk4++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_814AC94(); + gUnknown_203F3D8->unk4++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + gUnknown_203F3D8->unk0 = 1; + break; + } +} + +static void sub_8149FD0(void) +{ + switch (gUnknown_203F3D8->unk4) + { + case 0: + sub_814AADC(); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_814AC30(TRUE); + gUnknown_203F3D8->unk4++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + { + sub_814AC94(); + gUnknown_203F3D8->unk4++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + gUnknown_203F3D8->unk0 = 1; + break; + } +} + +static void sub_814A03C(void) +{ + int i, numPlayers; + + numPlayers = sub_81499A4(); + switch (gUnknown_203F3D8->unk4) + { + case 0: + for (i = 0; i < numPlayers; i++) + ClearWindowTilemap(gUnknown_203F3D8->unk1C[i]); + + CopyBgTilemapBufferToVram(0); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + for (i = 0; i < numPlayers; i++) + RemoveWindow(gUnknown_203F3D8->unk1C[i]); + + gUnknown_203F3D8->unk0 = 1; + } + break; + } +} + +static void sub_814A0C8(void) +{ + switch (gUnknown_203F3D8->unk4) + { + case 0: + gUnknown_203F3D8->unk12 = sub_814A754(1, 8, 20, 2); + AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_WantToPlayAgain2, 0, 2, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + PutWindowTilemap(gUnknown_203F3D8->unk12); + DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); + sub_814A7D0(23, 7, 0); + CopyBgTilemapBufferToVram(0); + gUnknown_203F3D8->unk4++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + gUnknown_203F3D8->unk0 = 1; + break; + } +} + +static void sub_814A174(void) +{ + switch (gUnknown_203F3D8->unk4) + { + case 0: + gUnknown_203F3D8->unk12 = sub_814A754(2, 7, 26, 4); + AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_SavingDontTurnOffPower, 0, 2, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + PutWindowTilemap(gUnknown_203F3D8->unk12); + DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); + CopyBgTilemapBufferToVram(0); + gUnknown_203F3D8->unk4++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + gUnknown_203F3D8->unk0 = 1; + break; + } +} + +static void sub_814A218(void) +{ + switch (gUnknown_203F3D8->unk4) + { + case 0: + sub_814A6CC(); + DestroyYesNoMenu(); + CopyBgTilemapBufferToVram(0); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!sub_814A6FC() && !IsDma3ManagerBusyWithBgCopy()) + gUnknown_203F3D8->unk0 = 1; + break; + } +} + +static void sub_814A264(void) +{ + switch (gUnknown_203F3D8->unk4) + { + case 0: + gUnknown_203F3D8->unk12 = sub_814A754(2, 8, 22, 4); + AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_SomeoneDroppedOut2, 0, 2, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + PutWindowTilemap(gUnknown_203F3D8->unk12); + DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); + CopyBgTilemapBufferToVram(0); + gUnknown_203F3D8->unk4++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + gUnknown_203F3D8->unk0 = 1; + break; + } +} + +static void sub_814A308(void) +{ + switch (gUnknown_203F3D8->unk4) + { + case 0: + gUnknown_203F3D8->unk12 = sub_814A754(7, 10, 16, 2); + AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_CommunicationStandby4, 0, 2, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + { + PutWindowTilemap(gUnknown_203F3D8->unk12); + DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); + CopyBgTilemapBufferToVram(0); + gUnknown_203F3D8->unk4++; + } + break; + case 2: + if (!IsDma3ManagerBusyWithBgCopy()) + gUnknown_203F3D8->unk0 = 1; + break; + } +} + +static void sub_814A3AC(void) +{ + switch (gUnknown_203F3D8->unk4) + { + case 0: + sub_814B43C(gUnknown_203F3D8); + gUnknown_203F3D8->unk4++; + break; + case 1: + if (!sub_814B460()) + gUnknown_203F3D8->unk0 = 1; + break; + } +} + +void sub_814A3E4(void) +{ + gUnknown_203F3D8->unkA = 0; + gUnknown_203F3D8->unkB = 0; + gUnknown_203F3D8->unkC = 6; + sub_814A95C(gUnknown_203F3D8->unkC); +} + +bool32 sub_814A408(void) +{ + switch (gUnknown_203F3D8->unkA) + { + case 0: + gUnknown_203F3D8->unkB++; + if (gUnknown_203F3D8->unkB > 10) + { + gUnknown_203F3D8->unkB = 0; + gUnknown_203F3D8->unkC++; + if (gUnknown_203F3D8->unkC >= 10) + { + gUnknown_203F3D8->unkC = 0; + gUnknown_203F3D8->unkA++; + } + } + sub_814A95C(gUnknown_203F3D8->unkC); + if (gUnknown_203F3D8->unkC != 7) + break; + case 1: + return FALSE; + } + + return TRUE; +} + +static const u8 sPluralTxt[] = _("IES"); + +void sub_814A468(u16 itemId, u16 quantity) +{ + CopyItemName(itemId, gUnknown_203F3D8->txtBuff[0]); + ConvertIntToDecimalStringN(gUnknown_203F3D8->txtBuff[1], quantity, STR_CONV_MODE_LEFT_ALIGN, 1); + if (itemId >= FIRST_BERRY_INDEX && itemId < LAST_BERRY_INDEX) + { + if (quantity > 1) + { + int endi = StringLength(gUnknown_203F3D8->txtBuff[0]); + if (endi != 0) + { + endi--; + endi[gUnknown_203F3D8->txtBuff[0]] = EOS; + StringAppend(gUnknown_203F3D8->txtBuff[0], sPluralTxt); + } + } + } + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_203F3D8->txtBuff[0]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_203F3D8->txtBuff[1]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_203F3D8->strBuff, gText_AwesomeWonF701F700); + gUnknown_203F3D8->unk12 = sub_814A754(4, 8, 22, 4); + AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gUnknown_203F3D8->strBuff, 0, 2, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); + gUnknown_203F3D8->unk14 = MUS_LEVEL_UP; + gUnknown_203F3D8->unkD = 0; +} + +void sub_814A53C(u16 itemId) +{ + CopyItemName(itemId, gUnknown_203F3D8->txtBuff[0]); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_203F3D8->txtBuff[0]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_203F3D8->strBuff, gText_FilledStorageSpace2); + gUnknown_203F3D8->unk12 = sub_814A754(4, 8, 22, 4); + AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gUnknown_203F3D8->strBuff, 0, 2, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); + gUnknown_203F3D8->unk14 = 0; + gUnknown_203F3D8->unkD = 0; +} + +void sub_814A5B4(u16 itemId) +{ + CopyItemName(itemId, gUnknown_203F3D8->txtBuff[0]); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_203F3D8->txtBuff[0]); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_203F3D8->strBuff, gText_CantHoldMore); + gUnknown_203F3D8->unk12 = sub_814A754(4, 9, 22, 2); + AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gUnknown_203F3D8->strBuff, 0, 2, TEXT_SPEED_FF, NULL); + CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); + gUnknown_203F3D8->unk14 = 0; + gUnknown_203F3D8->unkD = 0; +} + +bool32 sub_814A62C(void) +{ + switch (gUnknown_203F3D8->unkD) + { + case 0: + if (!IsDma3ManagerBusyWithBgCopy()) + { + PutWindowTilemap(gUnknown_203F3D8->unk12); + DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); + CopyBgTilemapBufferToVram(0); + gUnknown_203F3D8->unkD++; + } + break; + case 1: + if (IsDma3ManagerBusyWithBgCopy()) + break; + if (gUnknown_203F3D8->unk14 == 0) + { + gUnknown_203F3D8->unkD += 2; + return FALSE; + } + PlayFanfare(gUnknown_203F3D8->unk14); + gUnknown_203F3D8->unkD++; + case 2: + if (!IsFanfareTaskInactive()) + break; + gUnknown_203F3D8->unkD++; + case 3: + return FALSE; + } + + return TRUE; +} + +void sub_814A6CC(void) +{ + if (gUnknown_203F3D8->unk12 != 0xFF) + { + rbox_fill_rectangle(gUnknown_203F3D8->unk12); + CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_MAP); + gUnknown_203F3D8->unkD = 0; + } +} + +// Can't match this without the ugly GOTO, oh well. +bool32 sub_814A6FC(void) +{ + if (gUnknown_203F3D8->unk12 == 0xFF) + { + RET_FALSE: + return FALSE; + } + + if (gUnknown_203F3D8->unkD == 0) + { + if (!IsDma3ManagerBusyWithBgCopy()) + { + RemoveWindow(gUnknown_203F3D8->unk12); + gUnknown_203F3D8->unk12 = 0xFF; + gUnknown_203F3D8->unkD++; + goto RET_FALSE; + } + } + else if (gUnknown_203F3D8->unkD == 1) + goto RET_FALSE; + + return TRUE; +} + +s8 sub_814A744(void) +{ + return Menu_ProcessInputNoWrapClearOnChoose(); +} + +static u32 sub_814A754(u32 left, u32 top, u32 width, u32 height) +{ + u32 windowId; + struct WindowTemplate window; + + window.bg = 0; + window.tilemapLeft = left; + window.tilemapTop = top; + window.width = width; + window.height = height; + window.paletteNum = 0xF; + window.baseBlock = 0x43; + + windowId = AddWindow(&window); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + return windowId; +} + +static void sub_814A7D0(u16 left, u16 top, u8 cursorPos) +{ + struct WindowTemplate window; + u8 a = cursorPos; + + window.bg = 0; + window.tilemapLeft = left; + window.tilemapTop = top; + window.width = 6; + window.height = 4; + window.paletteNum = 2; + window.baseBlock = 0x2B; + + CreateYesNoMenu(&window, 2, 0, 2, 0x00a, 0xD, a); +} + +static void sub_814A84C(void) +{ + u8 color[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; + + PutWindowTilemap(0); + PutWindowTilemap(1); + FillWindowPixelBuffer(0, PIXEL_FILL(0)); + FillWindowPixelBuffer(1, PIXEL_FILL(0)); + AddTextPrinterParameterized3(0, 0, 0, 2, color, 0, gText_SpacePoints2); + AddTextPrinterParameterized3(1, 0, 0, 2, color, 0, gText_SpaceTimes3); +} + +static const u8 gUnknown_846D953[] = {2, 2, 0, 0, 1, 1, 1, 0, 0, 2, 0, 0, 0}; + +static const struct CompressedSpriteSheet gUnknown_846D960 = {gUnknown_8479688, 0, 0x320}; +static const struct SpritePalette gUnknown_846D968 = {gUnknown_8479668, 0x320}; + +static const u16 gUnknown_846D970[] = {0x06, 0x08, 0x10, 0x08}; +static const u16 gUnknown_846D978[] = {0x06, 0x08, 0x0b, 0x06, 0x10, 0x08}; +static const u16 gUnknown_846D984[] = {0x02, 0x06, 0x06, 0x08, 0x10, 0x08, 0x14, 0x06}; +static const u16 gUnknown_846D994[] = {0x02, 0x06, 0x06, 0x08, 0x0b, 0x06, 0x10, 0x08, 0x14, 0x06}; + +static const u16 *const gUnknown_846D9A8[] = +{ + gUnknown_846D970, + gUnknown_846D978, + gUnknown_846D984, + gUnknown_846D994, +}; + +static const s16 gUnknown_846D9B8[] = {0x0058, 0x0098}; +static const s16 gUnknown_846D9BC[] = {0x0058, 0x0078, 0x0098}; +static const s16 gUnknown_846D9C2[] = {0x0038, 0x0058, 0x0098, 0x00b8}; +static const s16 gUnknown_846D9CA[] = {0x0038, 0x0058, 0x0078, 0x0098, 0x00b8}; + +static const s16 *const gUnknown_846D9D4[] = +{ + gUnknown_846D9B8, + gUnknown_846D9BC, + gUnknown_846D9C2, + gUnknown_846D9CA, +}; + +static void sub_814A8B8(void) +{ + int i, y, playersCount = sub_81499A4(); + const s16 *xCoords = gUnknown_846D9D4[playersCount - 2]; + + for (i = 0; i < playersCount; i++) + { + struct PokemonJump1_MonInfo *info = sub_81499C0(i); + + y = gMonFrontPicCoords[info->species].y_offset; + sub_814ADCC(gUnknown_203F3D8, info, *xCoords, y + 112, i); + sub_814B240(gUnknown_203F3D8, *xCoords, 112, i); + xCoords++; + } +} + +void sub_814A940(u32 id, s16 y) +{ + gUnknown_203F3D8->unk81A8[id]->y2 = y; +} + +void sub_814A95C(int id) +{ + sub_814B348(gUnknown_203F3D8, id); + ChangeBgY(2, (gUnknown_846D953[id] * 5) << 0xD, 0); +} + +int sub_814A98C(u8 flags) +{ + int i, count; + + for (i = 0, count = 0; i < 5; i++) + { + if (flags & 1) + { + sub_814AF0C(gUnknown_203F3D8, i); + count++; + } + flags >>= 1; + } + + sub_814ACCC(count - 2); + return count; +} + +static void sub_814A9C8(void) +{ + struct DigitObjUtilTemplate unkStruct; + struct DigitObjUtilTemplate *ptr = &unkStruct; // This temp variable is needed to match, don't ask me why. + + ptr->shape = SPRITE_SHAPE(8x8); + ptr->size = SPRITE_SIZE(8x8); + ptr->strConvMode = 0; + ptr->priority = 1; + ptr->oamCount = 5; + ptr->xDelta = 8; + ptr->x = 108; + ptr->y = 6; + ptr->spriteSheet.compressed = &gUnknown_846D960; + ptr->spritePal = &gUnknown_846D968; + + DigitObjUtil_Init(2); + DigitObjUtil_CreatePrinter(0, 0, ptr); + + unkStruct.oamCount = 4; + unkStruct.x = 30; + unkStruct.y = 6; + DigitObjUtil_CreatePrinter(1, 0, &unkStruct); +} + +void sub_814AA24(int arg0) +{ + DigitObjUtil_PrintNumOn(0, arg0); +} + +void sub_814AA34(u16 arg0) +{ + DigitObjUtil_PrintNumOn(1, arg0); +} + +void sub_814AA48(u8 multiplayerId) +{ + sub_814AFE8(gUnknown_203F3D8, multiplayerId); +} + +void sub_814AA60(u8 multiplayerId) +{ + sub_814B080(gUnknown_203F3D8, multiplayerId); +} + +int sub_814AA78(int multiplayerId) +{ + return sub_814B010(gUnknown_203F3D8, multiplayerId); +} + +void sub_814AA8C(void) +{ + sub_814B0A8(gUnknown_203F3D8); +} + +void sub_814AAA0(void) +{ + sub_814B134(gUnknown_203F3D8); +} + +void sub_814AAB4(int multiplayerId) +{ + sub_814B168(gUnknown_203F3D8, multiplayerId); +} + +int sub_814AAC8(void) +{ + return sub_814B190(gUnknown_203F3D8); +} + +static void sub_814AADC(void) +{ + struct WindowTemplate window; + int i, playersCount = sub_81499A4(); + const u16 *winCoords = gUnknown_846D9A8[playersCount - 2]; + + window.bg = 0; + window.width = 8; + window.height = 2; + window.paletteNum = 2; + window.baseBlock = 0x2B; + + for (i = 0; i < playersCount; i++) + { + window.tilemapLeft = winCoords[0]; + window.tilemapTop = winCoords[1]; + gUnknown_203F3D8->unk1C[i] = AddWindow(&window); + ClearWindowTilemap(gUnknown_203F3D8->unk1C[i]); + window.baseBlock += 0x10; + winCoords += 2; + } + + CopyBgTilemapBufferToVram(0); +} + +static void sub_814AB98(int multiplayerId, u8 clr1, u8 clr2, u8 clr3) +{ + u32 x; + u8 colors[3] = {clr1, clr2, clr3}; + + FillWindowPixelBuffer(gUnknown_203F3D8->unk1C[multiplayerId], PIXEL_FILL(0)); + x = 64 - GetStringWidth(0, sub_81499E0(multiplayerId), -1); + x /= 2; + AddTextPrinterParameterized3(gUnknown_203F3D8->unk1C[multiplayerId], 0, x, 2, colors, -1, sub_81499E0(multiplayerId)); + CopyWindowToVram(gUnknown_203F3D8->unk1C[multiplayerId], COPYWIN_GFX); +} + +static void sub_814AC30(bool32 arg0) +{ + int i, var, playersCount = sub_81499A4(); + + if (!arg0) + { + for (i = 0; i < playersCount; i++) + sub_814AB98(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); + } + else + { + var = sub_81499B4(); + for (i = 0; i < playersCount; i++) + { + if (var != i) + sub_814AB98(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); + else + sub_814AB98(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED); + } + } +} + +static void sub_814AC94(void) +{ + int i, playersCount = sub_81499A4(); + + for (i = 0; i < playersCount; i++) + PutWindowTilemap(gUnknown_203F3D8->unk1C[i]); + CopyBgTilemapBufferToVram(0); +} + +static void sub_814ACCC(u8 arg0) +{ + gUnknown_203F3D8->unk18 = 0; + ChangeBgX(1, (arg0 / 2) << 16, 0); + ChangeBgY(1, (((arg0 % 2) << 8) - 40) << 8, 0); + ShowBg(1); + CreateTask(sub_814AD50, 4); +} + +static bool32 sub_814AD18(void) +{ + if (gUnknown_203F3D8->unk18 >= 32) + { + return FALSE; + } + else + { + ChangeBgY(1, 128, 1); + if (++gUnknown_203F3D8->unk18 >= 32) + HideBg(1); + return TRUE; + } +} + +static void sub_814AD50(u8 taskId) +{ + if (!sub_814AD18()) + DestroyTask(taskId); +} + +static const u16 sPkmnJumpPal1[] = INCBIN_U16("graphics/link_games/pkmnjump_pal1.gbapal"); +static const u16 sPkmnJumpPal2[] = INCBIN_U16("graphics/link_games/pkmnjump_pal2.gbapal"); + +static const u32 sPkmnJumpRopeGfx1[] = INCBIN_U32("graphics/link_games/pkmnjump_rope1.4bpp.lz"); +static const u32 sPkmnJumpRopeGfx2[] = INCBIN_U32("graphics/link_games/pkmnjump_rope2.4bpp.lz"); +static const u32 sPkmnJumpRopeGfx3[] = INCBIN_U32("graphics/link_games/pkmnjump_rope3.4bpp.lz"); +static const u32 sPkmnJumpRopeGfx4[] = INCBIN_U32("graphics/link_games/pkmnjump_rope4.4bpp.lz"); + +static const u32 sPkmnJumpStarGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_star.4bpp.lz"); + +static const struct CompressedSpriteSheet gUnknown_846E0B0[] = +{ + {sPkmnJumpRopeGfx1, 0x600, 5}, + {sPkmnJumpRopeGfx2, 0x0c00, 6}, + {sPkmnJumpRopeGfx3, 0x0600, 7}, + {sPkmnJumpRopeGfx4, 0x0600, 8}, + {sPkmnJumpStarGfx, 0x0200, 10}, +}; + +static const struct SpritePalette gUnknown_846E0D8[] = +{ + {sPkmnJumpPal1, 5}, + {sPkmnJumpPal2, 6}, +}; + +// Forward declarations. +static const struct OamData sOamData_846E170; +static const struct SpriteTemplate gUnknown_846E220; +static const struct SpriteTemplate gUnknown_846E238; +static const struct SpriteTemplate gUnknown_846E250; +static const struct SpriteTemplate gUnknown_846E268; + +static const struct SpriteTemplate gUnknown_846E0E8 = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &sOamData_846E170, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const s16 gUnknown_846E100[][10] = +{ + {0x60, 0x60, 0x60, 0x72, 0x78, 0x78, 0x78, 0x72, 0x60, 0x60}, + {0x46, 0x50, 0x60, 0x72, 0x78, 0x80, 0x78, 0x72, 0x60, 0x50}, + {0x32, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48}, + {0x2a, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48}, +}; + +static const s16 gUnknown_846E150[] = {0x10, 0x28, 0x48, 0x68, 0x88, 0xa8, 0xc8, 0xe0}; + +static const struct SpriteTemplate *const gUnknown_846E160[] = +{ + &gUnknown_846E220, + &gUnknown_846E238, + &gUnknown_846E250, + &gUnknown_846E268, +}; + +static const struct OamData sOamData_846E170 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(64x64), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(64x64), + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData sOamData_846E178 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x32), + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData sOamData_846E180 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x32), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x32), + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData sOamData_846E188 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(32x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(32x16), + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_846E190[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E198[] = +{ + ANIMCMD_FRAME(8, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1A0[] = +{ + ANIMCMD_FRAME(16, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1A8[] = +{ + ANIMCMD_FRAME(24, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1B0[] = +{ + ANIMCMD_FRAME(32, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1B8[] = +{ + ANIMCMD_FRAME(40, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1C0[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1C8[] = +{ + ANIMCMD_FRAME(16, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1D0[] = +{ + ANIMCMD_FRAME(32, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1D8[] = +{ + ANIMCMD_FRAME(48, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1E0[] = +{ + ANIMCMD_FRAME(64, 1), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E1E8[] = +{ + ANIMCMD_FRAME(80, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_846E1F0[] = +{ + sSpriteAnim_846E190, + sSpriteAnim_846E198, + sSpriteAnim_846E1A0, + sSpriteAnim_846E1A8, + sSpriteAnim_846E1B0, + sSpriteAnim_846E1B8 +}; + +static const union AnimCmd *const sSpriteAnimTable_846E208[] = +{ + sSpriteAnim_846E1C0, + sSpriteAnim_846E1C8, + sSpriteAnim_846E1D0, + sSpriteAnim_846E1D8, + sSpriteAnim_846E1E0, + sSpriteAnim_846E1E8 +}; + +static const struct SpriteTemplate gUnknown_846E220 = +{ + .tileTag = 5, + .paletteTag = 5, + .oam = &sOamData_846E178, + .anims = sSpriteAnimTable_846E1F0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate gUnknown_846E238 = +{ + .tileTag = 6, + .paletteTag = 5, + .oam = &sOamData_846E180, + .anims = sSpriteAnimTable_846E208, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate gUnknown_846E250 = +{ + .tileTag = 7, + .paletteTag = 5, + .oam = &sOamData_846E188, + .anims = sSpriteAnimTable_846E1F0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct SpriteTemplate gUnknown_846E268 = +{ + .tileTag = 8, + .paletteTag = 5, + .oam = &sOamData_846E188, + .anims = sSpriteAnimTable_846E1F0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct OamData sOamData_846E280 = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(16x16), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(16x16), + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_846E288[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_846E290[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(8, 4), + ANIMCMD_FRAME(12, 4), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_846E2AC[] = +{ + sSpriteAnim_846E288, + sSpriteAnim_846E290 +}; + +static const struct SpriteTemplate gUnknown_846E2B4 = +{ + .tileTag = 10, + .paletteTag = 5, + .oam = &sOamData_846E280, + .anims = sSpriteAnimTable_846E2AC, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +void sub_814AD6C(struct PokemonJump2 *arg0) +{ + int i; + + for (i = 0; i < NELEMS(gUnknown_846E0B0); i++) + LoadCompressedSpriteSheet(&gUnknown_846E0B0[i]); + + for (i = 0; i < NELEMS(gUnknown_846E0D8); i++) + LoadSpritePalette(&gUnknown_846E0D8[i]); + + arg0->unkE = IndexOfSpritePaletteTag(5); + arg0->unkF = IndexOfSpritePaletteTag(6); +} + +static void sub_814ADB4(struct Sprite *sprite) +{ + int i; + for (i = 0; i < 8; i++) + sprite->data[i] = 0; +} + +void sub_814ADCC(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo *jumpMon, s16 x, s16 y, u8 multiplayerId) +{ + struct SpriteTemplate spriteTemplate; + struct SpriteSheet spriteSheet; + struct CompressedSpritePalette spritePalette; + u8 *buffer; + u8 *unusedBuffer; + u8 subpriority; + u8 spriteId; + + spriteTemplate = gUnknown_846E0E8; + buffer = Alloc(0x2000); + unusedBuffer = Alloc(0x800); + if (multiplayerId == sub_81499B4()) + subpriority = 3; + else + subpriority = multiplayerId + 4; + + if (buffer && unusedBuffer) + { + HandleLoadSpecialPokePic( + &gMonFrontPicTable[jumpMon->species], + buffer, + jumpMon->species, + jumpMon->personality); + + spriteSheet.data = buffer; + spriteSheet.tag = multiplayerId; + spriteSheet.size = 0x800; + LoadSpriteSheet(&spriteSheet); + + spritePalette.data = GetMonSpritePalFromSpeciesAndPersonality(jumpMon->species, jumpMon->otId, jumpMon->personality); + spritePalette.tag = multiplayerId; + LoadCompressedSpritePalette(&spritePalette); + + Free(buffer); + Free(unusedBuffer); + + spriteTemplate.tileTag += multiplayerId; + spriteTemplate.paletteTag += multiplayerId; + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); + if (spriteId != MAX_SPRITES) + { + arg0->unk81A8[multiplayerId] = &gSprites[spriteId]; + arg0->unk81FC[multiplayerId] = subpriority; + return; + } + } + + arg0->unk81A8[multiplayerId] = NULL; +} + +void sub_814AF0C(struct PokemonJump2 *arg0, int multiplayerId) +{ + sub_814ADB4(arg0->unk81BC[multiplayerId]); + arg0->unk81BC[multiplayerId]->data[7] = arg0->unk81A8[multiplayerId] - gSprites; + arg0->unk81BC[multiplayerId]->invisible = FALSE; + arg0->unk81BC[multiplayerId]->y = 96; + arg0->unk81BC[multiplayerId]->callback = sub_814AF74; + StartSpriteAnim(arg0->unk81BC[multiplayerId], 1); +} + +static void sub_814AF74(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (sprite->animEnded) + { + sprite->invisible = TRUE; + sprite->callback = SpriteCallbackDummy; + } + break; + case 1: + sprite->y--; + sprite->data[1]++; + if (sprite->y <= 72) + { + sprite->y = 72; + sprite->data[0]++; + } + break; + case 2: + if (++sprite->data[1] >= 48) + { + sprite->invisible = TRUE; + sprite->callback = SpriteCallbackDummy; + } + break; + } +} + +void sub_814AFE8(struct PokemonJump2 *arg0, int multiplayerId) +{ + arg0->unk81A8[multiplayerId]->callback = sub_814B038; + arg0->unk81A8[multiplayerId]->y2 = 0; + sub_814ADB4(arg0->unk81A8[multiplayerId]); +} + +bool32 sub_814B010(struct PokemonJump2 *arg0, int multiplayerId) +{ + return arg0->unk81A8[multiplayerId]->callback == sub_814B038; +} + +static void sub_814B038(struct Sprite *sprite) +{ + if (++sprite->data[1] > 1) + { + if (++sprite->data[2] & 1) + sprite->y2 = 2; + else + sprite->y2 = -2; + + sprite->data[1] = 0; + } + + if (sprite->data[2] > 12) + { + sprite->y2 = 0; + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_814B080(struct PokemonJump2 *arg0, int multiplayerId) +{ + sub_814ADB4(arg0->unk81A8[multiplayerId]); + arg0->unk81A8[multiplayerId]->callback = sub_814B100; +} + +void sub_814B0A8(struct PokemonJump2 *arg0) +{ + int i; + u16 numPlayers = sub_81499A4(); + for (i = 0; i < numPlayers; i++) + { + if (arg0->unk81A8[i]->callback == sub_814B100) + { + arg0->unk81A8[i]->invisible = FALSE; + arg0->unk81A8[i]->callback = SpriteCallbackDummy; + arg0->unk81A8[i]->subpriority = 10; + } + } +} + +static void sub_814B100(struct Sprite *sprite) +{ + if (++sprite->data[0] > 3) + { + sprite->data[0] = 0; + sprite->invisible ^= 1; + } +} + +void sub_814B134(struct PokemonJump2 *arg0) +{ + int i; + u16 numPlayers = sub_81499A4(); + for (i = 0; i < numPlayers; i++) + arg0->unk81A8[i]->subpriority = arg0->unk81FC[i]; +} + +void sub_814B168(struct PokemonJump2 *arg0, int multiplayerId) +{ + sub_814ADB4(arg0->unk81A8[multiplayerId]); + arg0->unk81A8[multiplayerId]->callback = sub_814B1CC; +} + +bool32 sub_814B190(struct PokemonJump2 *arg0) +{ + int i; + u16 numPlayers = sub_81499A4(); + for (i = 0; i < numPlayers; i++) + { + if (arg0->unk81A8[i]->callback == sub_814B1CC) + return TRUE; + } + + return FALSE; +} + +static void sub_814B1CC(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + PlaySE(SE_BIKE_HOP); + sprite->data[1] = 0; + sprite->data[0]++; + // fall through + case 1: + sprite->data[1] += 4; + if (sprite->data[1] > 0x7F) + sprite->data[1] = 0; + + sprite->y2 = -(gSineTable[sprite->data[1]] >> 3); + if (sprite->data[1] == 0) + { + if (++sprite->data[2] < 2) + sprite->data[0] = 0; + else + sprite->callback = SpriteCallbackDummy; + } + break; + } +} + +void sub_814B240(struct PokemonJump2 *arg0, s16 x, s16 y, u8 multiplayerId) +{ + u8 spriteId = CreateSprite(&gUnknown_846E2B4, x, y, 1); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].invisible = TRUE; + arg0->unk81BC[multiplayerId] = &gSprites[spriteId]; + } +} + +void sub_814B294(struct PokemonJump2 *arg0) +{ + int i; + int count; + u8 spriteId; + + count = 0; + for (i = 0; i < 4; i++) + { + spriteId = CreateSprite(gUnknown_846E160[i], gUnknown_846E150[count], gUnknown_846E100[i][0], 2); + arg0->unk81D0[count] = &gSprites[spriteId]; + count++; + } + + for (i = 3; i >= 0; i--) + { + spriteId = CreateSprite(gUnknown_846E160[i], gUnknown_846E150[count], gUnknown_846E100[i][0], 2); + arg0->unk81D0[count] = &gSprites[spriteId]; + arg0->unk81D0[count]->hFlip = 1; + count++; + } +} + +void sub_814B348(struct PokemonJump2 *arg0, int arg1) +{ + int i, count, palNum; + int priority; + + if (arg1 > 5) + { + arg1 = 10 - arg1; + priority = 3; + palNum = arg0->unkF; + } + else + { + priority = 2; + palNum = arg0->unkE; + } + + count = 0; + for (i = 0; i < 4; i++) + { + arg0->unk81D0[count]->y = gUnknown_846E100[i][arg1]; + arg0->unk81D0[count]->oam.priority = priority; + arg0->unk81D0[count]->oam.paletteNum = palNum; + StartSpriteAnim(arg0->unk81D0[count], arg1); + count++; + } + + for (i = 3; i >= 0; i--) + { + arg0->unk81D0[count]->y = gUnknown_846E100[i][arg1]; + arg0->unk81D0[count]->oam.priority = priority; + arg0->unk81D0[count]->oam.paletteNum = palNum; + StartSpriteAnim(arg0->unk81D0[count], arg1); + count++; + } +} + +void sub_814B43C(struct PokemonJump2 *arg0) +{ + StartMinigameCountdown(9, 7, 120, 80, 0); + sub_814B134(arg0); +} + +bool32 sub_814B460(void) +{ + return IsMinigameCountdownRunning(); +} + +static struct PokemonJumpRecords *sub_814B46C(void) +{ + return &gSaveBlock2Ptr->pokeJump; +} + +void ResetPokeJumpResults(void) +{ + struct PokemonJumpRecords *pokeJump = sub_814B46C(); + pokeJump->jumpsInRow = 0; + pokeJump->bestJumpScore = 0; + pokeJump->excellentsInRow = 0; + pokeJump->gamesWithMaxPlayers = 0; + pokeJump->unused2 = 0; + pokeJump->unused1 = 0; +} + +bool32 sub_814B494(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow) +{ + struct PokemonJumpRecords *pokeJump = sub_814B46C(); + bool32 ret = FALSE; + + if (pokeJump->bestJumpScore < jumpScore && jumpScore <= 99990) + pokeJump->bestJumpScore = jumpScore, ret = TRUE; + if (pokeJump->jumpsInRow < jumpsInRow && jumpsInRow <= 9999) + pokeJump->jumpsInRow = jumpsInRow, ret = TRUE; + if (pokeJump->excellentsInRow < excellentsInRow && excellentsInRow <= 9999) + pokeJump->excellentsInRow = excellentsInRow, ret = TRUE; + + return ret; +} + +void sub_814B4E8(void) +{ + struct PokemonJumpRecords *pokeJump = sub_814B46C(); + if (pokeJump->gamesWithMaxPlayers < 9999) + pokeJump->gamesWithMaxPlayers++; +} + +void ShowPokemonJumpRecords(void) +{ + u8 taskId = CreateTask(Task_ShowPokemonJumpRecords, 0); + Task_ShowPokemonJumpRecords(taskId); +} + +static const struct WindowTemplate gUnknown_846E2CC = +{ + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 28, + .height = 9, + .paletteNum = 15, + .baseBlock = 0x1, +}; + +static const u8 *const gUnknown_846E2D4[] = {gText_JumpsInARow, gText_BestScore2, gText_ExcellentsInARow}; + +static void Task_ShowPokemonJumpRecords(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + data[1] = AddWindow(&gUnknown_846E2CC); + sub_814B5C4(data[1]); + CopyWindowToVram(data[1], COPYWIN_BOTH); + data[0]++; + break; + case 1: + if (!IsDma3ManagerBusyWithBgCopy()) + data[0]++; + break; + case 2: + if (JOY_NEW(A_BUTTON | B_BUTTON)) + { + rbox_fill_rectangle(data[1]); + CopyWindowToVram(data[1], COPYWIN_MAP); + data[0]++; + } + break; + case 3: + if (!IsDma3ManagerBusyWithBgCopy()) + { + RemoveWindow(data[1]); + DestroyTask(taskId); + EnableBothScriptContexts(); + } + break; + } +} + +static void sub_814B5C4(u16 windowId) +{ + int i, x; + int results[3]; + struct PokemonJumpRecords *pokeJump = sub_814B46C(); + u8 strbuf[8]; + results[0] = pokeJump->jumpsInRow; + results[1] = pokeJump->bestJumpScore; + results[2] = pokeJump->excellentsInRow; + + TextWindow_SetStdFrame0_WithPal(windowId, 0x21D, 0xD0); + DrawTextBorderOuter(windowId, 0x21D, 0xD); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + AddTextPrinterParameterized5(windowId, 2, gText_PkmnJumpRecords, 0, 0, TEXT_SPEED_FF, NULL, 1, 0); + for (i = 0; i < NELEMS(gUnknown_846E2D4); i++) + { + AddTextPrinterParameterized5(windowId, 2, gUnknown_846E2D4[i], 0, 20 + (i * 14), TEXT_SPEED_FF, NULL, 1, 0); + ConvertIntToDecimalStringN(strbuf, results[i], STR_CONV_MODE_LEFT_ALIGN, 5); + TruncateToFirstWordOnly(strbuf); + x = 0xDE - GetStringWidth(2, strbuf, 0); + AddTextPrinterParameterized5(windowId, 2, strbuf, x, 20 + (i * 14), TEXT_SPEED_FF, NULL, 0, 0); + } + PutWindowTilemap(windowId); +} + +static void TruncateToFirstWordOnly(u8 *str) +{ + for (;*str != EOS; str++) + { + if (*str == CHAR_SPACE) + { + *str = EOS; + break; + } + } +} diff --git a/src/pokemon_jump_2.c b/src/pokemon_jump_2.c deleted file mode 100644 index a771b8fcc..000000000 --- a/src/pokemon_jump_2.c +++ /dev/null @@ -1,2034 +0,0 @@ -#include "global.h" -#include "gflib.h" -#include "event_data.h" -#include "item.h" -#include "link_rfu.h" -#include "menu.h" -#include "random.h" -#include "save.h" -#include "task.h" -#include "pokemon_jump.h" -#include "constants/songs.h" - -struct PokemonJump1 -{ - MainCallback returnCallback; - u8 unk4; - u8 unk5; - u8 unk6; - u8 unk7; - u16 unk8; - u16 unkA; - u16 unkC; - u16 unkE; - int unk10; - u32 unk14; - u32 unk18; - int unk1C; - u32 unk20; - u32 unk24; - u32 unk28; - int unk2C; - u32 unk30; - u16 unk34; - u16 unk36; - u8 filler38[0x2]; - u16 unk3A; - u16 unk3C; - u16 unk3E; - u16 unk40; - u16 unk42; - u8 unk44; - u8 unk45; - u8 unk46; - u8 isLeader; - u8 unk48; - u8 unk49; - u16 unk4A; - u8 unk4C; - u8 unk4D; - u16 unk4E; - u8 unk50; - u8 unk51; - u8 filler52[0x2]; - int unk54; - int unk58; - int unk5C; - int unk60; - int unk64; - int unk68; - int unk6C; - struct PokemonJump1Sub unk70; - u8 unk7C[MAX_RFU_PLAYERS]; - 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]; - struct PokemonJump2 unkA4; - struct PokemonJump1_MonInfo unk82A8[MAX_RFU_PLAYERS]; - struct PokemonJump1_82E4 unk82E4[MAX_RFU_PLAYERS]; - struct PokemonJump1_82E4 *unk83AC; -}; - -static void sub_8147B60(struct PokemonJump1 *); -static void sub_8147B94(struct PokemonJump1 *); -static void sub_8147C20(void); -static void sub_8147C98(void); -static s16 GetPokemonJumpSpeciesIdx(u16 species); -static void sub_8147D2C(struct PokemonJump1_MonInfo *monInfo, struct Pokemon *mon); -static void sub_8147D6C(void); -static void sub_8147DA0(u8 taskId); -static void sub_814807C(u8 taskId); -static void sub_8148104(void); -static void sub_8148290(u8 taskId); -static void sub_81482F8(void); -static bool32 sub_8148344(void); -static bool32 sub_81483D0(void); -static bool32 sub_8148464(void); -static bool32 sub_81484D0(void); -static bool32 sub_814856C(void); -static bool32 sub_81485C8(void); -static bool32 sub_8148664(void); -static bool32 sub_81486C4(void); -static bool32 sub_8148724(void); -static bool32 sub_8148760(void); -static bool32 sub_81487B4(void); -static bool32 sub_8148800(void); -static bool32 sub_814881C(void); -static bool32 sub_81488DC(void); -static bool32 sub_81489C8(void); -static bool32 sub_8148A60(void); -static bool32 sub_8148398(void); -static bool32 sub_8148418(void); -static bool32 sub_81484B0(void); -static bool32 sub_8148B54(void); -static bool32 sub_8148C80(void); -static bool32 sub_8148D5C(void); -static bool32 sub_8148E2C(void); -static void sub_8148E80(u8 taskId); -static void sub_8148F5C(TaskFunc func, u8 taskPriority); -static void sub_8148F7C(void); -static void sub_8148F9C(void); -static void sub_8148FE0(void); -static int sub_8149044(void); -static void sub_8149078(void); -static int sub_8149194(void); -static void sub_81491B4(void); -static void sub_81491E4(void); -static void sub_8149210(void); -static bool32 sub_814922C(u16); -static void sub_8149260(void); -static void sub_81492D8(void); -static void sub_814933C(void); -static void sub_814935C(void); -static void sub_814936C(void); -static void sub_814937C(void); -static void sub_8149490(int); -static void sub_8149534(void); -static bool32 sub_8149630(void); -static bool32 sub_81496D4(void); -static bool32 sub_8149710(void); -static bool32 sub_8149748(void); -static void sub_8149780(int); -static int sub_81497A8(void); -static bool32 sub_8149804(void); -static int sub_8149834(u8 *); -static void sub_8149878(void); -static int sub_8149888(int); -static void sub_8149898(u16); -static bool32 sub_81498B4(void); -static u16 sub_81498D8(void); -static void sub_8149900(u16, u16 *, u16 *); -static u16 sub_8149910(void); -static u16 sub_8149930(void); -static u16 sub_8149978(u16 item, u16 quantity); - -EWRAM_DATA static struct PokemonJump1 *gUnknown_203F3D4 = NULL; - -static const struct PokemonJumpMons -{ - u16 species; - u16 unk2; -} sPkmnJumpSpecies[] = -{ - { .species = SPECIES_BULBASAUR, .unk2 = 2, }, - { .species = SPECIES_CHARMANDER, .unk2 = 1, }, - { .species = SPECIES_SQUIRTLE, .unk2 = 0, }, - { .species = SPECIES_CATERPIE, .unk2 = 1, }, - { .species = SPECIES_METAPOD, .unk2 = 1, }, - { .species = SPECIES_WEEDLE, .unk2 = 1, }, - { .species = SPECIES_KAKUNA, .unk2 = 1, }, - { .species = SPECIES_RATTATA, .unk2 = 1, }, - { .species = SPECIES_RATICATE, .unk2 = 1, }, - { .species = SPECIES_PIKACHU, .unk2 = 0, }, - { .species = SPECIES_SANDSHREW, .unk2 = 0, }, - { .species = SPECIES_NIDORAN_F, .unk2 = 0, }, - { .species = SPECIES_NIDORAN_M, .unk2 = 0, }, - { .species = SPECIES_CLEFAIRY, .unk2 = 0, }, - { .species = SPECIES_VULPIX, .unk2 = 0, }, - { .species = SPECIES_JIGGLYPUFF, .unk2 = 2, }, - { .species = SPECIES_ODDISH, .unk2 = 2, }, - { .species = SPECIES_PARAS, .unk2 = 1, }, - { .species = SPECIES_MEOWTH, .unk2 = 0, }, - { .species = SPECIES_PSYDUCK, .unk2 = 2, }, - { .species = SPECIES_MANKEY, .unk2 = 1, }, - { .species = SPECIES_GROWLITHE, .unk2 = 1, }, - { .species = SPECIES_POLIWAG, .unk2 = 2, }, - { .species = SPECIES_BELLSPROUT, .unk2 = 2, }, - { .species = SPECIES_SHELLDER, .unk2 = 1, }, - { .species = SPECIES_KRABBY, .unk2 = 1, }, - { .species = SPECIES_EXEGGCUTE, .unk2 = 2, }, - { .species = SPECIES_CUBONE, .unk2 = 0, }, - { .species = SPECIES_DITTO, .unk2 = 2, }, - { .species = SPECIES_EEVEE, .unk2 = 0, }, - { .species = SPECIES_OMANYTE, .unk2 = 1, }, - { .species = SPECIES_KABUTO, .unk2 = 1, }, - { .species = SPECIES_CHIKORITA, .unk2 = 2, }, - { .species = SPECIES_CYNDAQUIL, .unk2 = 1, }, - { .species = SPECIES_TOTODILE, .unk2 = 0, }, - { .species = SPECIES_SPINARAK, .unk2 = 1, }, - { .species = SPECIES_PICHU, .unk2 = 0, }, - { .species = SPECIES_CLEFFA, .unk2 = 0, }, - { .species = SPECIES_IGGLYBUFF, .unk2 = 2, }, - { .species = SPECIES_TOGEPI, .unk2 = 2, }, - { .species = SPECIES_MAREEP, .unk2 = 0, }, - { .species = SPECIES_BELLOSSOM, .unk2 = 2, }, - { .species = SPECIES_MARILL, .unk2 = 2, }, - { .species = SPECIES_SUNKERN, .unk2 = 2, }, - { .species = SPECIES_WOOPER, .unk2 = 2, }, - { .species = SPECIES_PINECO, .unk2 = 2, }, - { .species = SPECIES_SNUBBULL, .unk2 = 0, }, - { .species = SPECIES_SHUCKLE, .unk2 = 2, }, - { .species = SPECIES_TEDDIURSA, .unk2 = 0, }, - { .species = SPECIES_SLUGMA, .unk2 = 2, }, - { .species = SPECIES_SWINUB, .unk2 = 0, }, - { .species = SPECIES_HOUNDOUR, .unk2 = 1, }, - { .species = SPECIES_PHANPY, .unk2 = 0, }, - { .species = SPECIES_PORYGON2, .unk2 = 0, }, - { .species = SPECIES_TYROGUE, .unk2 = 1, }, - { .species = SPECIES_SMOOCHUM, .unk2 = 2, }, - { .species = SPECIES_ELEKID, .unk2 = 1, }, - { .species = SPECIES_MAGBY, .unk2 = 1, }, - { .species = SPECIES_LARVITAR, .unk2 = 1, }, - { .species = SPECIES_TREECKO, .unk2 = 1, }, - { .species = SPECIES_TORCHIC, .unk2 = 2, }, - { .species = SPECIES_MUDKIP, .unk2 = 0, }, - { .species = SPECIES_MARSHTOMP, .unk2 = 0, }, - { .species = SPECIES_POOCHYENA, .unk2 = 1, }, - { .species = SPECIES_ZIGZAGOON, .unk2 = 0, }, - { .species = SPECIES_LINOONE, .unk2 = 0, }, - { .species = SPECIES_WURMPLE, .unk2 = 1, }, - { .species = SPECIES_SILCOON, .unk2 = 2, }, - { .species = SPECIES_CASCOON, .unk2 = 2, }, - { .species = SPECIES_LOTAD, .unk2 = 2, }, - { .species = SPECIES_SEEDOT, .unk2 = 1, }, - { .species = SPECIES_RALTS, .unk2 = 0, }, - { .species = SPECIES_KIRLIA, .unk2 = 0, }, - { .species = SPECIES_SURSKIT, .unk2 = 2, }, - { .species = SPECIES_SHROOMISH, .unk2 = 2, }, - { .species = SPECIES_NINCADA, .unk2 = 1, }, - { .species = SPECIES_WHISMUR, .unk2 = 0, }, - { .species = SPECIES_AZURILL, .unk2 = 2, }, - { .species = SPECIES_SKITTY, .unk2 = 0, }, - { .species = SPECIES_SABLEYE, .unk2 = 0, }, - { .species = SPECIES_MAWILE, .unk2 = 0, }, - { .species = SPECIES_ARON, .unk2 = 1, }, - { .species = SPECIES_MEDITITE, .unk2 = 2, }, - { .species = SPECIES_ELECTRIKE, .unk2 = 1, }, - { .species = SPECIES_PLUSLE, .unk2 = 1, }, - { .species = SPECIES_MINUN, .unk2 = 1, }, - { .species = SPECIES_VOLBEAT, .unk2 = 0, }, - { .species = SPECIES_ILLUMISE, .unk2 = 0, }, - { .species = SPECIES_ROSELIA, .unk2 = 2, }, - { .species = SPECIES_GULPIN, .unk2 = 2, }, - { .species = SPECIES_NUMEL, .unk2 = 2, }, - { .species = SPECIES_TORKOAL, .unk2 = 2, }, - { .species = SPECIES_SPOINK, .unk2 = 0, }, - { .species = SPECIES_TRAPINCH, .unk2 = 2, }, - { .species = SPECIES_CACNEA, .unk2 = 2, }, - { .species = SPECIES_ANORITH, .unk2 = 1, }, - { .species = SPECIES_WYNAUT, .unk2 = 0, }, - { .species = SPECIES_SNORUNT, .unk2 = 0, }, - { .species = SPECIES_CLAMPERL, .unk2 = 1, }, - { .species = SPECIES_BAGON, .unk2 = 1, }, -}; - -void StartPokemonJump(u16 partyIndex, MainCallback callback) -{ - u8 taskId; - - if (gReceivedRemoteLinkPlayers) - { - gUnknown_203F3D4 = Alloc(sizeof(*gUnknown_203F3D4)); - if (gUnknown_203F3D4 != NULL) - { - ResetTasks(); - taskId = CreateTask(sub_8147DA0, 1); - gUnknown_203F3D4->unk8 = 0; - gUnknown_203F3D4->returnCallback = callback; - gUnknown_203F3D4->unk4 = taskId; - gUnknown_203F3D4->unk6 = GetMultiplayerId(); - sub_8147D2C(&gUnknown_203F3D4->unk82A8[gUnknown_203F3D4->unk6], &gPlayerParty[partyIndex]); - sub_8147B60(gUnknown_203F3D4); - SetWordTaskArg(taskId, 2, (uintptr_t)gUnknown_203F3D4); - SetMainCallback2(sub_8147D6C); - return; - } - } - - SetMainCallback2(callback); -} - -static void sub_8147B48(void) -{ - sub_8149D24(); - Free(gUnknown_203F3D4); -} - -static void sub_8147B60(struct PokemonJump1 *arg0) -{ - arg0->unk5 = GetLinkPlayerCount(); - arg0->unk70.unk0 = 5; - arg0->unk70.unk2 = 0; - sub_8147C20(); - sub_8147B94(arg0); - if (arg0->unk5 == MAX_RFU_PLAYERS) - sub_814B4E8(); -} - -static void sub_8147B94(struct PokemonJump1 *arg0) -{ - int i; - - arg0->unk14 = 6; - arg0->unk18 = 6; - arg0->unk4A = 0; - arg0->unk1C = 0; - arg0->unk5C = 0; - arg0->isLeader = GetMultiplayerId() == 0; - arg0->unk8 = 0; - arg0->unkA = 0; - arg0->unkC = 0; - arg0->unkE = 0; - arg0->unk58 = 0; - arg0->unk3A = 0; - arg0->unk44 = 0; - arg0->unk54 = 0; - arg0->unk46 = 0; - arg0->unk49 = 0; - arg0->unk48 = 1; - arg0->unk70.unk8 = 0; - arg0->unk70.unk1 = 0; - arg0->unk70.unk4 = 0; - arg0->unk60 = 1; - arg0->unk4D = 0; - arg0->unk68 = 0; - arg0->unk64 = 0; - arg0->unk2C = 0; - arg0->unk30 = 0; - sub_8147C98(); - sub_81491E4(); - - for (i = 0; i < MAX_RFU_PLAYERS; i++) - { - arg0->unk7C[i] = 0; - arg0->unk9A[i] = 0; - } -} - -static void sub_8147C20(void) -{ - int i, index; - - for (i = 0; i < MAX_RFU_PLAYERS; i++) - { - index = GetPokemonJumpSpeciesIdx(gUnknown_203F3D4->unk82A8[i].species); - gUnknown_203F3D4->unk82E4[i].unkC = sPkmnJumpSpecies[index].unk2; - } - - gUnknown_203F3D4->unk83AC = &gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6]; -} - -static void sub_8147C98(void) -{ - int i; - - for (i = 0; i < MAX_RFU_PLAYERS; i++) - { - gUnknown_203F3D4->unk82E4[i].unkE = 0; - gUnknown_203F3D4->unk82E4[i].unk10 = 0; - gUnknown_203F3D4->unk82E4[i].unk12 = 0; - gUnknown_203F3D4->unk82E4[i].unk0 = 0; - gUnknown_203F3D4->unk82E4[i].unk4 = 0x7FFFFFFF; - gUnknown_203F3D4->unk82E4[i].unk14 = 0; - gUnknown_203F3D4->unk8B[i] = 9; - } -} - -static s16 GetPokemonJumpSpeciesIdx(u16 species) -{ - u32 i; - for (i = 0; i < NELEMS(sPkmnJumpSpecies); i++) - { - if (sPkmnJumpSpecies[i].species == species) - return i; - } - - return -1; // species isnt allowed -} - -static void sub_8147D2C(struct PokemonJump1_MonInfo *monInfo, struct Pokemon *mon) -{ - monInfo->species = GetMonData(mon, MON_DATA_SPECIES); - monInfo->otId = GetMonData(mon, MON_DATA_OT_ID); - monInfo->personality = GetMonData(mon, MON_DATA_PERSONALITY); -} - -static void sub_8147D58(void) -{ - TransferPlttBuffer(); - LoadOam(); - ProcessSpriteCopyRequests(); -} - -static void sub_8147D6C(void) -{ - RunTasks(); - AnimateSprites(); - BuildOamBuffer(); - UpdatePaletteFade(); -} - -static void sub_8147D84(TaskFunc func) -{ - gUnknown_203F3D4->unk4 = CreateTask(func, 1); - gUnknown_203F3D4->unk8 = 0; -} - -static void sub_8147DA0(u8 taskId) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - SetVBlankCallback(NULL); - ResetSpriteData(); - FreeAllSpritePalettes(); - sub_8148F5C(sub_8148E80, 5); - FadeOutMapMusic(4); - gUnknown_203F3D4->unk8++; - break; - case 1: - if (!FuncIsActiveTask(sub_8148E80)) - { - sub_8149CEC(&gUnknown_203F3D4->unkA4); - LoadWirelessStatusIndicatorSpriteGfx(); - CreateWirelessStatusIndicatorSprite(0, 0); - gUnknown_203F3D4->unk8++; - } - break; - case 2: - if (!sub_8149D68() && IsNotWaitingForBGMStop() == TRUE) - { - FadeOutAndPlayNewMapMusic(MUS_POKE_JUMP, 8); - gUnknown_203F3D4->unk8++; - } - break; - case 3: - if (IsLinkTaskFinished()) - { - BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - SetVBlankCallback(sub_8147D58); - gUnknown_203F3D4->unk8++; - } - break; - case 4: - UpdatePaletteFade(); - if (!gPaletteFade.active) - { - gUnknown_203F3D4->unk7 = 0; - gUnknown_203F3D4->unk8++; - } - break; - case 5: - gUnknown_203F3D4->unk7++; - if (gUnknown_203F3D4->unk7 >= 20) - { - if (gUnknown_203F3D4->isLeader) - sub_8147D84(sub_814807C); - else - sub_8147D84(sub_8148290); - - sub_8148F7C(); - DestroyTask(taskId); - } - break; - } -} - -static void sub_8147F10(int arg0) -{ - if (arg0 == 0) - { - gUnknown_203F3D4->unk30 = 0x1111; - gUnknown_203F3D4->unk2C = 1; - } - else - { - gUnknown_203F3D4->unk30 = (1 << (arg0 - 1)) - 1; - gUnknown_203F3D4->unk2C = 0; - } -} - -static void sub_8147F4C(u8 arg0) -{ - int i; - - gUnknown_203F3D4->unk70.unk0 = arg0; - gUnknown_203F3D4->unk8 = 0; - gUnknown_203F3D4->unkA = 0; - gUnknown_203F3D4->unk48 = 1; - gUnknown_203F3D4->unk49 = 0; - for (i = 1; i < gUnknown_203F3D4->unk5; i++) - gUnknown_203F3D4->unk82E4[i].unk18 = 0; -} - -static void sub_8147FA0(void) -{ - int i; - int count; - u16 var0; - u8 var1; - u16 var2; - - for (i = 1, count = 0; i < gUnknown_203F3D4->unk5; i++) - { - var0 = gUnknown_203F3D4->unk82E4[i].unk10; - if (sub_8149C24(&gUnknown_203F3D4->unk82E4[i], i, &var1, &var2)) - { - gUnknown_203F3D4->unk90[i] = var2; - gUnknown_203F3D4->unk8B[i] = var1; - gUnknown_203F3D4->unk82E4[i].unk12 = var0; - } - - if (gUnknown_203F3D4->unk82E4[i].unk18 && gUnknown_203F3D4->unk8B[i] == gUnknown_203F3D4->unk70.unk0) - count++; - } - - if (count == gUnknown_203F3D4->unk5 - 1) - gUnknown_203F3D4->unk49 = 1; -} - -static bool32 (* const gUnknown_846B64C[])(void) = -{ - sub_8148344, - sub_81483D0, - sub_8148464, - sub_81484D0, - sub_81485C8, - sub_81486C4, - sub_8148760, - sub_81487B4, - sub_814881C, -}; - -static void sub_814807C(u8 taskId) -{ - sub_8147FA0(); - sub_8149534(); - if (!gUnknown_203F3D4->unk48 && gUnknown_203F3D4->unk49) - { - sub_8147F4C(gUnknown_203F3D4->unk4C); - sub_8147F10(3); - } - - if (gUnknown_203F3D4->unk48 == 1) - { - if (!gUnknown_846B64C[gUnknown_203F3D4->unk70.unk0]()) - { - gUnknown_203F3D4->unk48 = 0; - gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 = 1; - } - } - - sub_81492D8(); - sub_8148104(); -} - -static void sub_8148104(void) -{ - if (!gUnknown_203F3D4->unk2C) - sub_8149AF8(gUnknown_203F3D4->unk82E4, &gUnknown_203F3D4->unk70); - - if (gUnknown_203F3D4->unk30 != 0x1111) - { - gUnknown_203F3D4->unk2C++; - gUnknown_203F3D4->unk2C &= gUnknown_203F3D4->unk30; - } -} - -static void sub_8148140(u8 arg0) -{ - gUnknown_203F3D4->unk70.unk0 = arg0; - gUnknown_203F3D4->unk8 = 0; - gUnknown_203F3D4->unkA = 0; - gUnknown_203F3D4->unk48 = 1; - gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 = 0; -} - -static void sub_8148174(void) -{ - int i; - u16 var0; - struct PokemonJump1Sub sp0; - - var0 = gUnknown_203F3D4->unk82E4[0].unk10; - if (sub_8149B7C(gUnknown_203F3D4->unk82E4, &sp0)) - { - if (gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 == 1 - && sp0.unk0 != gUnknown_203F3D4->unk70.unk0) - { - sub_8148140(sp0.unk0); - } - - if (gUnknown_203F3D4->unk70.unk8 != sp0.unk8) - { - gUnknown_203F3D4->unk70.unk8 = sp0.unk8; - gUnknown_203F3D4->unk5C = 1; - gUnknown_203F3D4->unk70.unk1 = sp0.unk1; - if (gUnknown_203F3D4->unk70.unk1) - gUnknown_203F3D4->unk4D = 1; - else - gUnknown_203F3D4->unk4D = 0; - } - - gUnknown_203F3D4->unk70.unk2 = sp0.unk2; - gUnknown_203F3D4->unk70.unk4 = sp0.unk4; - gUnknown_203F3D4->unk82E4[0].unk12 = var0; - } - - for (i = 1; i < gUnknown_203F3D4->unk5; i++) - { - if (i != gUnknown_203F3D4->unk6) - { - var0 = gUnknown_203F3D4->unk82E4[i].unk10; - if (sub_8149C90(&gUnknown_203F3D4->unk82E4[i], i)) - gUnknown_203F3D4->unk82E4[i].unk12 = var0; - } - } -} - -static bool32 (* const gUnknown_846B670[])(void) = -{ - sub_8148398, - sub_8148418, - sub_81484B0, - sub_814856C, - sub_8148664, - sub_8148724, - sub_8148760, - sub_8148800, - sub_814881C, -}; - -static void sub_8148290(u8 taskId) -{ - sub_8148174(); - if (gUnknown_203F3D4->unk48) - { - if (!gUnknown_846B670[gUnknown_203F3D4->unk70.unk0]()) - { - gUnknown_203F3D4->unk48 = 0; - gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk18 = 1; - sub_8147F10(3); - } - } - - sub_81492D8(); - sub_81482F8(); -} - -static void sub_81482F8(void) -{ - if (!gUnknown_203F3D4->unk2C) - sub_8149BF4(&gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6], gUnknown_203F3D4->unk70.unk0, gUnknown_203F3D4->unk42); - - if (gUnknown_203F3D4->unk30 != 0x1111) - { - gUnknown_203F3D4->unk2C++; - gUnknown_203F3D4->unk2C &= gUnknown_203F3D4->unk30; - } -} - -static bool32 sub_8148344(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - sub_8147F10(3); - gUnknown_203F3D4->unk8++; - // fall through - case 1: - if (!sub_81488DC()) - { - gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unk4A; - gUnknown_203F3D4->unk4C = 1; - return FALSE; - } - break; - } - - return TRUE; -} - -static bool32 sub_8148398(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - sub_8147F10(0); - gUnknown_203F3D4->unk24 = gUnknown_203F3D4->unk70.unk2; - gUnknown_203F3D4->unk8++; - // fall through - case 1: - return sub_81488DC(); - } - - return TRUE; -} - -static bool32 sub_81483D0(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - sub_81491E4(); - sub_8147F10(5); - gUnknown_203F3D4->unk8++; - break; - case 1: - if (gUnknown_203F3D4->unk49) - { - gUnknown_203F3D4->unk4C = 2; - return FALSE; - } - break; - } - - return TRUE; -} - -static bool32 sub_8148418(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - sub_81491E4(); - sub_8147F10(0); - gUnknown_203F3D4->unk4A = gUnknown_203F3D4->unk70.unk2; - gUnknown_203F3D4->unk8++; - // fall through - case 1: - if (sub_8149804()) - return FALSE; - break; - } - - return TRUE; -} - -static bool32 sub_8148464(void) -{ - if (!sub_81489C8()) - { - gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unk4A; - gUnknown_203F3D4->unk4C = 1; - } - else if (sub_8149630()) - { - return TRUE; - } - else - { - sub_81491B4(); - gUnknown_203F3D4->unk4C = 3; - } - - return FALSE; -} - -static bool32 sub_81484B0(void) -{ - if (!sub_81489C8()) - ; - else if (sub_8149630()) - return TRUE; - else - sub_81491B4(); - - return FALSE; -} - -static bool32 sub_81484D0(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - sub_8149630(); - if (sub_81496D4()) - gUnknown_203F3D4->unk8++; - break; - case 1: - if (!sub_8148A60()) - { - if (sub_81498B4()) - { - gUnknown_203F3D4->unk70.unk2 = sub_81498D8(); - gUnknown_203F3D4->unk4C = 7; - } - else if (gUnknown_203F3D4->unk70.unk4 >= 200) - { - gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unkE; - gUnknown_203F3D4->unk4C = 8; - } - else - { - gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unkE; - gUnknown_203F3D4->unk4C = 4; - } - - gUnknown_203F3D4->unk8++; - return FALSE; - } - break; - case 2: - return FALSE; - } - - return TRUE; -} - -static bool32 sub_814856C(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - if (!sub_8149630()) - sub_81491B4(); - if (sub_81496D4()) - gUnknown_203F3D4->unk8++; - break; - case 1: - if (!sub_8148A60()) - { - gUnknown_203F3D4->unk8++; - return FALSE; - } - break; - case 2: - return FALSE; - } - - return TRUE; -} - -static bool32 sub_81485C8(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - sub_8147F10(4); - gUnknown_203F3D4->unk8++; - // fall through - case 1: - if (!sub_8148C80()) - { - sub_814B494(gUnknown_203F3D4->unk70.unk8, gUnknown_203F3D4->unk70.unk4, gUnknown_203F3D4->unk70.unk2); - gUnknown_203F3D4->unk8++; - } - break; - case 2: - if (gUnknown_203F3D4->unk49) - { - if (sub_8149748()) - gUnknown_203F3D4->unk4C = 5; - else - gUnknown_203F3D4->unk4C = 6; - - gUnknown_203F3D4->unk8++; - return FALSE; - } - break; - case 3: - return FALSE; - } - - return TRUE; -} - -static bool32 sub_8148664(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - sub_8147F10(0); - gUnknown_203F3D4->unk8++; - // fall through - case 1: - if (!sub_8148C80()) - { - sub_814B494(gUnknown_203F3D4->unk70.unk8, gUnknown_203F3D4->unk70.unk4, gUnknown_203F3D4->unk70.unk2); - gUnknown_203F3D4->unk42 = gUnknown_203F3D4->unk45; - return FALSE; - } - break; - } - - return TRUE; -} - -static bool32 sub_81486C4(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - if (!sub_8148E2C()) - gUnknown_203F3D4->unk8++; - break; - case 1: - if (gUnknown_203F3D4->unk49) - { - sub_8147B94(gUnknown_203F3D4); - gUnknown_203F3D4->unk24 = Random(); - gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unk24; - gUnknown_203F3D4->unk4C = 0; - return FALSE; - } - break; - } - - return TRUE; -} - -static bool32 sub_8148724(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - if (!sub_8148E2C()) - { - sub_8147B94(gUnknown_203F3D4); - gUnknown_203F3D4->unk8++; - return FALSE; - } - break; - case 1: - return FALSE; - } - - return TRUE; -} - -static bool32 sub_8148760(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - gUnknown_203F3D4->unk8 = 1; - break; - case 1: - sub_8147F10(0); - gUnknown_203F3D4->unk8++; - break; - case 2: - if (!sub_8148D5C()) - { - SetMainCallback2(gUnknown_203F3D4->returnCallback); - sub_8147B48(); - } - break; - } - - return TRUE; -} - -static bool32 sub_81487B4(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - sub_8147F10(4); - gUnknown_203F3D4->unk8++; - break; - case 1: - if (!sub_8148B54()) - { - gUnknown_203F3D4->unk70.unk2 = gUnknown_203F3D4->unkE; - gUnknown_203F3D4->unk4C = 8; - return FALSE; - } - break; - } - - return TRUE; -} - -static bool32 sub_8148800(void) -{ - sub_8147F10(0); - if (!sub_8148B54()) - return FALSE; - else - return TRUE; -} - -static bool32 sub_814881C(void) -{ - switch (gUnknown_203F3D4->unk8) - { - case 0: - sub_814B494(gUnknown_203F3D4->unk70.unk8, gUnknown_203F3D4->unk70.unk4, gUnknown_203F3D4->unk70.unk2); - sub_8149D40(5); - gUnknown_203F3D4->unk8++; - break; - case 1: - if (!sub_8149D68()) - { - sub_8147F10(0); - gUnknown_203F3D4->unk8++; - } - break; - case 2: - if (sub_8149804()) - { - CreateTask(Task_LinkSave, 6); - gUnknown_203F3D4->unk8++; - } - break; - case 3: - if (!FuncIsActiveTask(Task_LinkSave)) - { - sub_814A6CC(); - gUnknown_203F3D4->unk8++; - } - break; - case 4: - if (!sub_814A6FC()) - { - gUnknown_203F3D4->unk4C = 4; - return FALSE; - } - break; - } - - return TRUE; -} - -static bool32 sub_81488DC(void) -{ - switch (gUnknown_203F3D4->unkA) - { - case 0: - sub_8149D40(2); - sub_814AAA0(); - gUnknown_203F3D4->unkA++; - break; - case 1: - if (!sub_8149D68()) - { - sub_814AAB4(gUnknown_203F3D4->unk6); - gUnknown_203F3D4->unk3C = 0; - gUnknown_203F3D4->unkA++; - } - break; - case 2: - if (++gUnknown_203F3D4->unk3C > 120) - { - sub_8149D40(3); - gUnknown_203F3D4->unkA++; - } - break; - case 3: - if (sub_8149D68() != 1 && sub_814AAC8() != 1) - gUnknown_203F3D4->unkA++; - break; - case 4: - sub_8149D40(9); - gUnknown_203F3D4->unkA++; - break; - case 5: - if (!sub_8149D68()) - { - sub_814935C(); - sub_814A3E4(); - gUnknown_203F3D4->unkA++; - } - break; - case 6: - if (!sub_814A408()) - { - sub_814936C(); - sub_8148F9C(); - gUnknown_203F3D4->unkA++; - return FALSE; - } - break; - case 7: - return FALSE; - } - - return TRUE; -} - -static bool32 sub_81489C8(void) -{ - sub_8148FE0(); - if (gUnknown_203F3D4->unk36) - { - gUnknown_203F3D4->unk36 = 0; - return FALSE; - } - - switch (gUnknown_203F3D4->unkA) - { - case 0: - if (sub_814922C(0)) - gUnknown_203F3D4->unkA++; - else - break; - // fall through - case 1: - if (gMain.newKeys & A_BUTTON) - { - sub_8149260(); - sub_8147F10(3); - gUnknown_203F3D4->unkA++; - } - break; - case 2: - if (sub_814922C(1) == TRUE) - gUnknown_203F3D4->unkA++; - break; - case 3: - if (sub_814922C(0) == TRUE) - gUnknown_203F3D4->unkA = 0; - break; - } - - return TRUE; -} - -static bool32 sub_8148A60(void) -{ - int i; - - switch (gUnknown_203F3D4->unkA) - { - case 0: - for (i = 0; i < gUnknown_203F3D4->unk5; i++) - { - if (sub_814AA78(i) == 1) - return TRUE; - } - - gUnknown_203F3D4->unkA++; - break; - case 1: - for (i = 0; i < gUnknown_203F3D4->unk5; i++) - { - if (gUnknown_203F3D4->unk82E4[i].unk10 == 2) - sub_814AA60(i); - } - - sub_8149D40(1); - gUnknown_203F3D4->unk3C = 0; - gUnknown_203F3D4->unkA++; - break; - case 2: - if (++gUnknown_203F3D4->unk3C > 100) - { - sub_8149D40(3); - gUnknown_203F3D4->unk3C = 0; - gUnknown_203F3D4->unkA++; - } - break; - case 3: - if (!sub_8149D68()) - { - sub_814AA8C(); - gUnknown_203F3D4->unk70.unk1 = 0; - sub_8149210(); - gUnknown_203F3D4->unkA++; - return FALSE; - } - break; - case 4: - return FALSE; - } - - return TRUE; -} - -static bool32 sub_8148B54(void) -{ - switch (gUnknown_203F3D4->unkA) - { - case 0: - sub_8149900(gUnknown_203F3D4->unk70.unk2, &gUnknown_203F3D4->unk3E, &gUnknown_203F3D4->unk40); - sub_814A468(gUnknown_203F3D4->unk3E, gUnknown_203F3D4->unk40); - gUnknown_203F3D4->unkA++; - break; - case 1: - case 4: - if (!sub_814A62C()) - { - gUnknown_203F3D4->unk3C = 0; - gUnknown_203F3D4->unkA++; - } - break; - case 2: - case 5: - gUnknown_203F3D4->unk3C++; - if (gMain.newKeys & (A_BUTTON | B_BUTTON) || gUnknown_203F3D4->unk3C > 180) - { - sub_814A6CC(); - gUnknown_203F3D4->unkA++; - } - break; - case 3: - if (!sub_814A6FC()) - { - gUnknown_203F3D4->unk40 = sub_8149978(gUnknown_203F3D4->unk3E, gUnknown_203F3D4->unk40); - if (gUnknown_203F3D4->unk40 && AddBagItem(gUnknown_203F3D4->unk3E, gUnknown_203F3D4->unk40)) - { - if (!CheckBagHasSpace(gUnknown_203F3D4->unk3E, 1)) - { - sub_814A53C(gUnknown_203F3D4->unk3E); - gUnknown_203F3D4->unkA = 4; - } - else - { - gUnknown_203F3D4->unkA = 6; - break; - } - } - else - { - sub_814A5B4(gUnknown_203F3D4->unk3E); - gUnknown_203F3D4->unkA = 4; - } - } - break; - case 6: - if (!sub_814A6FC()) - return FALSE; - break; - } - - return TRUE; -} - -static bool32 sub_8148C80(void) -{ - s8 input; - - switch (gUnknown_203F3D4->unkA) - { - case 0: - sub_8149D40(4); - gUnknown_203F3D4->unkA++; - break; - case 1: - if (!sub_8149D68()) - gUnknown_203F3D4->unkA++; - break; - case 2: - input = sub_814A744(); - switch (input) - { - case MENU_B_PRESSED: - case 1: - gUnknown_203F3D4->unk45 = 1; - sub_8149D40(6); - gUnknown_203F3D4->unkA++; - break; - case 0: - gUnknown_203F3D4->unk45 = 2; - sub_8149D40(6); - gUnknown_203F3D4->unkA++; - break; - } - break; - case 3: - if (!sub_8149D68()) - gUnknown_203F3D4->unkA++; - break; - case 4: - sub_8149D40(8); - gUnknown_203F3D4->unkA++; - break; - case 5: - if (!sub_8149D68()) - { - gUnknown_203F3D4->unkA++; - return FALSE; - } - break; - case 6: - return FALSE; - } - - return TRUE; -} - -static bool32 sub_8148D5C(void) -{ - int var0; - - switch (gUnknown_203F3D4->unkA) - { - case 0: - sub_814A6CC(); - gUnknown_203F3D4->unkA++; - break; - case 1: - if (!sub_814A6FC()) - { - sub_8149D40(7); - gUnknown_203F3D4->unkA++; - } - break; - case 2: - var0 = sub_8149D68(); - if (!var0) - { - gUnknown_203F3D4->unk3C = var0; - gUnknown_203F3D4->unkA++; - } - break; - case 3: - if (++gUnknown_203F3D4->unk3C > 120) - { - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); - gUnknown_203F3D4->unkA++; - } - break; - case 4: - if (!gPaletteFade.active) - { - SetCloseLinkCallback(); - gUnknown_203F3D4->unkA++; - } - break; - case 5: - if (!gReceivedRemoteLinkPlayers) - return FALSE; - break; - } - - return TRUE; -} - -static bool32 sub_8148E2C(void) -{ - switch (gUnknown_203F3D4->unkA) - { - case 0: - sub_814A6CC(); - sub_814AA24(0); - gUnknown_203F3D4->unkA++; - break; - case 1: - if (!sub_814A6FC()) - { - gUnknown_203F3D4->unkA++; - return FALSE; - } - break; - case 2: - return FALSE; - } - - return TRUE; -} - -static void sub_8148E80(u8 taskId) -{ - int i; - s16 *taskData = gTasks[taskId].data; - struct PokemonJump1 *ptr = (struct PokemonJump1 *)GetWordTaskArg(taskId, 14); - - switch (taskData[0]) - { - case 0: - for (i = 0; i < MAX_RFU_PLAYERS; i++) - taskData[i + 2] = 0; - - taskData[0]++; - // fall through - case 1: - sub_8149A6C(&ptr->unk82A8[ptr->unk6]); - for (i = 0; i < MAX_RFU_PLAYERS; i++) - { - if (!taskData[i + 2] && sub_8149A90(i, &ptr->unk82A8[i])) - { - StringCopy(ptr->unk82E4[i].unk1C, gLinkPlayers[i].name); - taskData[i + 2] = 1; - taskData[1]++; - if (taskData[1] == ptr->unk5) - { - sub_8147C20(); - DestroyTask(taskId); - break; - } - } - } - break; - } -} - -static void sub_8148F5C(TaskFunc func, u8 taskPriority) -{ - u8 taskId = CreateTask(func, taskPriority); - SetWordTaskArg(taskId, 14, (uintptr_t)gUnknown_203F3D4); -} - -static void sub_8148F7C(void) -{ - gUnknown_203F3D4->unk4A = 0; - gUnknown_203F3D4->unk14 = 6; - gUnknown_203F3D4->unk34 = 0; - gUnknown_203F3D4->unk1C = 0; - gUnknown_203F3D4->unk36 = 0; - gUnknown_203F3D4->unk10 = 0; -} - -static void sub_8148F9C(void) -{ - gUnknown_203F3D4->unk4A = 0; - gUnknown_203F3D4->unk34 = 0x6FF; - gUnknown_203F3D4->unk14 = 7; - gUnknown_203F3D4->unk36 = 0; - gUnknown_203F3D4->unk10 = 0; - gUnknown_203F3D4->unk51 = 0; - gUnknown_203F3D4->unk50 = 0; - gUnknown_203F3D4->unk20 = 0; - gUnknown_203F3D4->unk4E = 0; - gUnknown_203F3D4->unk6C = 0; - sub_8149078(); -} - -static void sub_8148FE0(void) -{ - if (gUnknown_203F3D4->unk46) - { - gUnknown_203F3D4->unk4A++; - gUnknown_203F3D4->unk34 += sub_8149044(); - if (gUnknown_203F3D4->unk34 >= 0x9FF) - gUnknown_203F3D4->unk34 -= 0x9FF; - - gUnknown_203F3D4->unk18 = gUnknown_203F3D4->unk14; - gUnknown_203F3D4->unk14 = gUnknown_203F3D4->unk34 >> 8; - if (gUnknown_203F3D4->unk14 > 6 && gUnknown_203F3D4->unk18 < 7) - { - gUnknown_203F3D4->unk36++; - sub_8149078(); - } - } -} - -static int sub_8149044(void) -{ - int result; - - if (gUnknown_203F3D4->unk10) - return 0; - - result = gUnknown_203F3D4->unk1C; - if (gUnknown_203F3D4->unk34 <= 0x5FF) - { - gUnknown_203F3D4->unk20 += 80; - result += gUnknown_203F3D4->unk20 >> 8; - } - - return result; -} - -static const u16 gUnknown_846B694[] = {0x1a, 0x1f, 0x24, 0x29, 0x2e, 0x33, 0x38, 0x3d}; -static const u16 gUnknown_846B6A4[] = {0, 1, 1, 2}; - -static void sub_8149078(void) -{ - int var0; - - gUnknown_203F3D4->unk20 = 0; - if (gUnknown_203F3D4->unk4E) - { - gUnknown_203F3D4->unk4E--; - if (gUnknown_203F3D4->unk6C) - { - if (sub_8149194() % 4 != 0) - { - gUnknown_203F3D4->unk1C = gUnknown_203F3D4->unk28; - } - else - { - if (gUnknown_203F3D4->unk28 > 54) - gUnknown_203F3D4->unk1C = 30; - else - gUnknown_203F3D4->unk1C = 82; - } - } - } - else - { - if (!(gUnknown_203F3D4->unk50 & 8)) - { - gUnknown_203F3D4->unk28 = gUnknown_846B694[gUnknown_203F3D4->unk50] + (gUnknown_203F3D4->unk51 * 7); - gUnknown_203F3D4->unk4E = gUnknown_846B6A4[sub_8149194() % NELEMS(gUnknown_846B6A4)] + 2; - gUnknown_203F3D4->unk50++; - } - else - { - if (gUnknown_203F3D4->unk50 == 8) - { - if (gUnknown_203F3D4->unk51 < 3) - gUnknown_203F3D4->unk51++; - else - gUnknown_203F3D4->unk6C = 1; - } - - var0 = gUnknown_846B694[15 - gUnknown_203F3D4->unk50]; - gUnknown_203F3D4->unk28 = var0 + (gUnknown_203F3D4->unk51 * 7); - if (++gUnknown_203F3D4->unk50 > 15) - { - if (sub_8149194() % 4 == 0) - gUnknown_203F3D4->unk28 -= 5; - - gUnknown_203F3D4->unk50 = 0; - } - } - - gUnknown_203F3D4->unk1C = gUnknown_203F3D4->unk28; - } -} - -static int sub_8149194(void) -{ - // The number 1103515245 comes from the example implementation of rand and srand - gUnknown_203F3D4->unk24 = gUnknown_203F3D4->unk24 * 1103515245 + 24691; - return gUnknown_203F3D4->unk24 >> 16; -} - -static void sub_81491B4(void) -{ - gUnknown_203F3D4->unk10 = 1; - gUnknown_203F3D4->unk14 = 6; - gUnknown_203F3D4->unk34 = 0x5FF; - sub_814936C(); -} - -static int sub_81491D8(void) -{ - return gUnknown_203F3D4->unk10; -} - -static void sub_81491E4(void) -{ - int i; - for (i = 0; i < MAX_RFU_PLAYERS; i++) - gUnknown_203F3D4->unk82E4[i].unk14 = 0; -} - -static void sub_8149210(void) -{ - gUnknown_203F3D4->unk83AC->unk10 = 0; - gUnknown_203F3D4->unk83AC->unk12 = 0; -} - -static bool32 sub_814922C(u16 arg0) -{ - if (gUnknown_203F3D4->unk82E4[gUnknown_203F3D4->unk6].unk10 == arg0) - return TRUE; - else - return FALSE; -} - -static void sub_8149260(void) -{ - gUnknown_203F3D4->unk83AC->unkE = gUnknown_203F3D4->unk4A; - gUnknown_203F3D4->unk83AC->unk12 = gUnknown_203F3D4->unk83AC->unk10; - gUnknown_203F3D4->unk83AC->unk10 = 1; -} - -static void sub_8149288(void) -{ - gUnknown_203F3D4->unk83AC->unk12 = gUnknown_203F3D4->unk83AC->unk10; - gUnknown_203F3D4->unk83AC->unk10 = 2; - gUnknown_203F3D4->unk83AC->unkE = gUnknown_203F3D4->unk4A; - gUnknown_203F3D4->unk83AC->unk14 = 2; -} - -static void sub_81492B8(void) -{ - gUnknown_203F3D4->unk83AC->unk12 = gUnknown_203F3D4->unk83AC->unk10; - gUnknown_203F3D4->unk83AC->unk10 = 0; -} - -static const u16 gUnknown_846B6AC[] = {SE_RS_SHOP, SE_SHINY, SE_M_MORNING_SUN, SE_POKE_JUMP_SUCCESS}; - -static void sub_81492D8(void) -{ - if (gUnknown_203F3D4->unk5C) - { - sub_814AA24(gUnknown_203F3D4->unk70.unk8); - gUnknown_203F3D4->unk5C = 0; - if (gUnknown_203F3D4->unk4D) - { - int index = sub_814A98C(gUnknown_203F3D4->unk70.unk1); - PlaySE(gUnknown_846B6AC[index - 2]); - gUnknown_203F3D4->unk4D = 0; - } - } - - sub_814AA34(gUnknown_203F3D4->unk70.unk4); - sub_814937C(); - sub_814933C(); -} - -static void sub_814933C(void) -{ - if (gUnknown_203F3D4->unk46) - sub_814A95C(gUnknown_203F3D4->unk14); -} - -static void sub_814935C(void) -{ - gUnknown_203F3D4->unk46 = 0; -} - -static void sub_814936C(void) -{ - gUnknown_203F3D4->unk46 = 1; -} - -static void sub_814937C(void) -{ - int i; - int whichSound = 0; - int numLinkPlayers = gUnknown_203F3D4->unk5; - - for (i = 0; i < numLinkPlayers; i++) - { - switch (gUnknown_203F3D4->unk82E4[i].unk10) - { - case 0: - sub_814A940(i, 0); - break; - case 1: - if (gUnknown_203F3D4->unk82E4[i].unk12 != 1 || gUnknown_203F3D4->unk82E4[i].unkE != gUnknown_203F3D4->unk9A[i]) - { - if (i == gUnknown_203F3D4->unk6) - gUnknown_203F3D4->unk82E4[i].unk12 = 1; - - whichSound |= 0x1; - gUnknown_203F3D4->unk82E4[i].unk4 = 0x7FFFFFFF; - gUnknown_203F3D4->unk9A[i] = gUnknown_203F3D4->unk82E4[i].unkE; - } - - sub_8149490(i); - break; - case 2: - if (gUnknown_203F3D4->unk82E4[i].unk12 != 2) - { - if (i == gUnknown_203F3D4->unk6) - gUnknown_203F3D4->unk82E4[i].unk12 = 2; - - whichSound |= 0x2; - sub_814AA48(i); - } - break; - } - } - - if (whichSound & 0x2) - PlaySE(SE_POKE_JUMP_FAILURE); - else if (whichSound & 0x1) - PlaySE(SE_LEDGE); -} - -static const s8 gUnknown_846B6B4[][48] = -{ - {-3, -6, -8, -10, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -28, -27, - -26, -25, -23, -22, -20, -18, -17, -15, -13, -11, -8, -6, -4, -1}, - - {-3, -6, -9, -11, -14, -16, -18, -20, -22, -24, -26, -28, -29, -30, -30, -28, -26, -24, -22, - -20, -18, -16, -14, -11, -9, -6, -4, -1}, - - {-3, -6, -9, -11, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -30, -29, - -29, -28, -28, -27, -27, -26, -25, -24, -22, -20, -18, -16, -14, - -12, -11, -9, -6, -4, -1}, -}; - -static void sub_8149490(int multiplayerId) -{ - int var0; - int var1; - struct PokemonJump1_82E4 *player; - - if (gUnknown_203F3D4->unk68) - return; - - player = &gUnknown_203F3D4->unk82E4[multiplayerId]; - if (player->unk4 != 0x7FFFFFFF) - { - player->unk4++; - var0 = player->unk4; - } - else - { - var0 = gUnknown_203F3D4->unk4A - player->unkE; - if (var0 >= 65000) - { - var0 -= 65000; - var0 += gUnknown_203F3D4->unk4A; - } - - player->unk4 = var0; - } - - if (var0 < 4) - return; - - var0 -= 4; - if (var0 < 48) - var1 = gUnknown_846B6B4[player->unkC][var0]; - else - var1 = 0; - - sub_814A940(multiplayerId, var1); - if (!var1 && multiplayerId == gUnknown_203F3D4->unk6) - sub_81492B8(); - - player->unk0 = var1; -} - -static void sub_8149534(void) -{ - if (gUnknown_203F3D4->unk14 == 8 && gUnknown_203F3D4->unk18 == 7) - { - if (gUnknown_203F3D4->unk58 == 0) - { - sub_8149878(); - gUnknown_203F3D4->unk54 = 0; - gUnknown_203F3D4->unk58 = 1; - gUnknown_203F3D4->unk70.unk1 = 0; - } - else - { - if (gUnknown_203F3D4->unk54 == 5) - { - gUnknown_203F3D4->unkC++; - sub_8149898(gUnknown_203F3D4->unkC); - } - else - { - gUnknown_203F3D4->unkC = 0; - } - - if (gUnknown_203F3D4->unk54 > 1) - { - gUnknown_203F3D4->unk64 = 1; - memcpy(gUnknown_203F3D4->unk86, gUnknown_203F3D4->unk81, sizeof(u8) * MAX_RFU_PLAYERS); - } - - sub_8149878(); - gUnknown_203F3D4->unk54 = 0; - gUnknown_203F3D4->unk58 = 1; - gUnknown_203F3D4->unk70.unk1 = 0; - if (gUnknown_203F3D4->unk70.unk4 < 9999) - gUnknown_203F3D4->unk70.unk4++; - - sub_8149780(10); - sub_8147F10(3); - } - } - - if (gUnknown_203F3D4->unk64 && (sub_8149710() == TRUE || !gUnknown_203F3D4->unk14)) - { - int var0 = sub_8149834(gUnknown_203F3D4->unk86); - sub_8149780(sub_8149888(var0)); - sub_8147F10(3); - gUnknown_203F3D4->unk64 = 0; - } - - if (gUnknown_203F3D4->unk58) - { - int var1 = sub_81497A8(); - if (var1 > gUnknown_203F3D4->unk54) - { - gUnknown_203F3D4->unk54 = var1; - memcpy(gUnknown_203F3D4->unk81, gUnknown_203F3D4->unk7C, sizeof(u8) * MAX_RFU_PLAYERS); - } - } -} - -static bool32 sub_8149630(void) -{ - int i; - - if (gUnknown_203F3D4->unk14 == 6 && !gUnknown_203F3D4->unk83AC->unk0) - { - if (gUnknown_203F3D4->unk83AC->unk12 == 1 && sub_81491D8() == 1) - { - gUnknown_203F3D4->unk83AC->unk14 = 1; - } - else - { - sub_8149288(); - sub_8147F10(3); - } - } - - if (gUnknown_203F3D4->unk14 == 7 - && gUnknown_203F3D4->unk18 == 6 - && gUnknown_203F3D4->unk83AC->unk10 != 2) - { - gUnknown_203F3D4->unk83AC->unk14 = 1; - sub_8147F10(3); - } - - for (i = 0; i < gUnknown_203F3D4->unk5; i++) - { - if (gUnknown_203F3D4->unk82E4[i].unk10 == 2) - return FALSE; - } - - return TRUE; -} - -static bool32 sub_81496D4(void) -{ - int i; - int numPlayers = gUnknown_203F3D4->unk5; - int count = 0; - for (i = 0; i < numPlayers; i++) - { - if (gUnknown_203F3D4->unk82E4[i].unk14) - count++; - } - - return count == numPlayers; -} - -static bool32 sub_8149710(void) -{ - int i; - for (i = 0; i < gUnknown_203F3D4->unk5; i++) - { - if (gUnknown_203F3D4->unk82E4[i].unk14 != 1) - return FALSE; - } - - return TRUE; -} - -static bool32 sub_8149748(void) -{ - int i; - - if (gUnknown_203F3D4->unk45 == 1) - return FALSE; - - for (i = 1; i < gUnknown_203F3D4->unk5; i++) - { - if (gUnknown_203F3D4->unk90[i] == 1) - return FALSE; - } - - return TRUE; -} - -static void sub_8149780(int arg0) -{ - gUnknown_203F3D4->unk70.unk8 += arg0; - gUnknown_203F3D4->unk5C = 1; - if (gUnknown_203F3D4->unk70.unk8 >= 99990) - gUnknown_203F3D4->unk70.unk8 = 99990; -} - -static int sub_81497A8(void) -{ - int i; - int count = 0; - int numPlayers = gUnknown_203F3D4->unk5; - - for (i = 0; i < numPlayers; i++) - { - if (gUnknown_203F3D4->unk82E4[i].unk0 == -30) - { - gUnknown_203F3D4->unk7C[i] = 1; - count++; - } - else - { - gUnknown_203F3D4->unk7C[i] = 0; - } - } - - return count; -} - -static bool32 sub_8149804(void) -{ - return !Rfu.recvQueue.count && !Rfu.sendQueue.count; -} - -static int sub_8149834(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_203F3D4->unk70.unk1 = flags; - if (flags) - gUnknown_203F3D4->unk4D = 1; - - return count; -} - -static void sub_8149878(void) -{ - gUnknown_203F3D4->unk44 = 0; -} - -static const int gUnknown_846B74C[] = {0, 0, 50, 100, 200, 500}; - -static int sub_8149888(int arg0) -{ - return gUnknown_846B74C[arg0]; -} - -static void sub_8149898(u16 arg0) -{ - if (arg0 > gUnknown_203F3D4->unkE) - gUnknown_203F3D4->unkE = arg0; -} - -static const u16 gUnknown_846B764[] = {0x8a, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93}; -static const u32 gUnknown_846B76C[][2] = -{ - {0x1388, 1}, - {0x1f40, 2}, - {0x2ee0, 3}, - {0x3e80, 4}, - {0x4e20, 5}, -}; - -static bool32 sub_81498B4(void) -{ - if (gUnknown_203F3D4->unk70.unk8 >= gUnknown_846B76C[0][0]) - return TRUE; - else - return FALSE; -} - -static u16 sub_81498D8(void) -{ - u16 lo = sub_8149910(); - u16 hi = sub_8149930(); - return (hi << 12) | (lo & 0xFFF); -} - -static void sub_8149900(u16 arg0, u16 *arg1, u16 *arg2) -{ - *arg2 = arg0 >> 12; - *arg1 = arg0 & 0xFFF; -} - -static u16 sub_8149910(void) -{ - u16 index = Random() % NELEMS(gUnknown_846B764); - return gUnknown_846B764[index]; -} - -static u16 sub_8149930(void) -{ - u32 val, i; - - val = 0; - for (i = 0; i < 5; i++) - { - if (gUnknown_203F3D4->unk70.unk8 < gUnknown_846B76C[i][0]) - break; - else if (1) // required to match, see pret/pokeemerald#982 - val = gUnknown_846B76C[i][1]; - else - break; - } - - return val; -} - -static u16 sub_8149978(u16 item, u16 quantity) -{ - while (quantity && !CheckBagHasSpace(item, quantity)) - quantity--; - - return quantity; -} - -u16 sub_81499A4(void) -{ - return GetLinkPlayerCount(); -} - -u16 sub_81499B4(void) -{ - return gUnknown_203F3D4->unk6; -} - -struct PokemonJump1_MonInfo *sub_81499C0(u8 multiplayerId) -{ - return &gUnknown_203F3D4->unk82A8[multiplayerId]; -} - -u8 *sub_81499E0(u8 multiplayerId) -{ - return gUnknown_203F3D4->unk82E4[multiplayerId].unk1C; -} - -bool32 IsSpeciesAllowedInPokemonJump(u16 species) -{ - return GetPokemonJumpSpeciesIdx(species) > -1; -} - -void IsPokemonJumpSpeciesInParty(void) -{ - int i; - - for (i = 0; i < PARTY_SIZE; i++) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_HAS_SPECIES)) - { - u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - if (IsSpeciesAllowedInPokemonJump(species)) - { - gSpecialVar_Result = TRUE; - return; - } - } - } - - gSpecialVar_Result = FALSE; -} diff --git a/src/pokemon_jump_3.c b/src/pokemon_jump_3.c deleted file mode 100644 index 978c4ab71..000000000 --- a/src/pokemon_jump_3.c +++ /dev/null @@ -1,167 +0,0 @@ -#include "global.h" -#include "link_rfu.h" -#include "pokemon_jump.h" - -struct MonInfoPacket -{ - u8 id; // packet id - u16 species; - u32 personality; - u32 otId; -}; - -void sub_8149A6C(struct PokemonJump1_MonInfo *arg0) -{ - struct MonInfoPacket packet; - packet.id = 1; - packet.species = arg0->species; - packet.otId = arg0->otId; - packet.personality = arg0->personality; - Rfu_SendPacket(&packet); -} - -bool32 sub_8149A90(int multiplayerId, struct PokemonJump1_MonInfo *arg0) -{ - struct MonInfoPacket packet; - - if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00) - return FALSE; - - memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); - if (packet.id == 1) - { - arg0->species = packet.species; - arg0->otId = packet.otId; - arg0->personality = packet.personality; - return TRUE; - } - - return FALSE; -} - -struct UnkPacket2 -{ - u8 id; // packet id - u32 unk4; - u32 unk8; -}; - -void sub_8149AE0(u32 arg0) -{ - struct UnkPacket2 packet; - packet.id = 2; - packet.unk4 = arg0; - Rfu_SendPacket(&packet); -} - -struct UnkPacket3 -{ - u8 id; // packet id - u8 unk1; - u8 unk2; - u8 unk3_0:5; - u8 unk3_1:3; - u16 unk4; - u16 unk6; - u32 unk8_0:15; - u32 unk8_1:17; -}; - -void sub_8149AF8(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1) -{ - struct UnkPacket3 packet; - packet.id = 3; - packet.unk8_1 = arg1->unk8; - packet.unk3_0 = arg1->unk1; - packet.unk1 = arg1->unk0; - packet.unk6 = arg1->unk2; - packet.unk8_0 = arg1->unk4; - packet.unk2 = arg0->unk10; - packet.unk3_1 = arg0->unk14; - packet.unk4 = arg0->unkE; - Rfu_SendPacket(&packet); -} - -bool32 sub_8149B7C(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1) -{ - struct UnkPacket3 packet; - - if ((gRecvCmds[0][0] & 0xFF00) != 0x2F00) - return FALSE; - - memcpy(&packet, &gRecvCmds[0][1], sizeof(packet)); - if (packet.id != 3) - return FALSE; - - arg1->unk8 = packet.unk8_1; - arg1->unk1 = packet.unk3_0; - arg1->unk0 = packet.unk1; - arg1->unk2 = packet.unk6; - arg1->unk4 = packet.unk8_0; - arg0->unk10 = packet.unk2; - arg0->unk14 = packet.unk3_1; - arg0->unkE = packet.unk4; - return TRUE; -} - -struct UnkPacket4 -{ - u8 id; // packet id - u8 unk1; - u8 unk2; - u8 unk3; - u16 unk4; - u8 unk6; - u16 unk8; -}; - -void sub_8149BF4(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2) -{ - struct UnkPacket4 packet; - packet.id = 4; - packet.unk1 = arg0->unk10; - packet.unk2 = arg0->unk14; - packet.unk3 = arg0->unk18; - packet.unk4 = arg0->unkE; - packet.unk6 = arg1; - packet.unk8 = arg2; - Rfu_SendPacket(&packet); -} - -bool32 sub_8149C24(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3) -{ - struct UnkPacket4 packet; - - if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00) - return FALSE; - - memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); - if (packet.id != 4) - return FALSE; - - arg0->unk10 = packet.unk1; - arg0->unk14 = packet.unk2; - arg0->unk18 = packet.unk3; - arg0->unkE = packet.unk4; - *arg2 = packet.unk6; - *arg3 = packet.unk8; - return TRUE; -} - -bool32 sub_8149C90(struct PokemonJump1_82E4 *arg0, int multiplayerId) -{ - struct UnkPacket4 packet; - - if ((gRecvCmds[multiplayerId][0] & 0xFF00) != 0x2F00) - return FALSE; - - memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); - if (packet.id != 4) - return FALSE; - - arg0->unk10 = packet.unk1; - arg0->unk14 = packet.unk2; - arg0->unk18 = packet.unk3; - arg0->unkE = packet.unk4; - return TRUE; -} diff --git a/src/pokemon_jump_4.c b/src/pokemon_jump_4.c deleted file mode 100644 index 8ca248ada..000000000 --- a/src/pokemon_jump_4.c +++ /dev/null @@ -1,922 +0,0 @@ -#include "global.h" -#include "gflib.h" -#include "data.h" -#include "digit_obj_util.h" -#include "dynamic_placeholder_text_util.h" -#include "item.h" -#include "menu.h" -#include "new_menu_helpers.h" -#include "pokemon_jump.h" -#include "strings.h" -#include "task.h" -#include "text_window.h" -#include "constants/songs.h" -#include "constants/items.h" - -EWRAM_DATA static struct PokemonJump2 *gUnknown_203F3D8 = NULL; - -static void sub_8149D80(void (*func)(void)); -static void sub_8149DA4(u8 taskId); -static void sub_8149DC8(void); -static void sub_8149F64(void); -static void sub_8149FD0(void); -static void sub_814A03C(void); -static void sub_814A0C8(void); -static void sub_814A174(void); -static void sub_814A218(void); -static void sub_814A264(void); -static void sub_814A308(void); -static void sub_814A3AC(void); -static u32 sub_814A754(u32 left, u32 top, u32 width, u32 height); -static void sub_814A7D0(u16 left, u16 top, u8 cursorPos); -static void sub_814A84C(void); -static void sub_814A8B8(void); -static void sub_814A9C8(void); -static void sub_814AADC(void); -static void sub_814AC30(bool32 arg0); -static void sub_814AC94(void); -static void sub_814ACCC(u8 arg0); -static void sub_814AD50(u8 taskId); - -static void sub_8149D34(struct PokemonJump2 *); - -void sub_8149CEC(struct PokemonJump2 *arg0) -{ - u8 taskId; - - gUnknown_203F3D8 = arg0; - sub_8149D34(gUnknown_203F3D8); - taskId = CreateTask(sub_8149DA4, 3); - gUnknown_203F3D8->unk6 = taskId; - SetWordTaskArg(gUnknown_203F3D8->unk6, 2, (uintptr_t)gUnknown_203F3D8); - sub_8149D80(sub_8149DC8); -} - -void sub_8149D24(void) -{ - FreeAllWindowBuffers(); - DigitObjUtil_Free(); -} - -static void sub_8149D34(struct PokemonJump2 *arg0) -{ - arg0->unk4 = 0; - arg0->unk0 = 0; - arg0->unk12 = 0xFF; -} - -// Gfx -static const u16 sPkmnJumpPal3[] = INCBIN_U16("graphics/link_games/pkmnjump_pal3.gbapal"); - -static const u16 sPkmnJumpBgPal[] = INCBIN_U16("graphics/link_games/pkmnjump_bg.gbapal"); -static const u32 sPkmnJumpBgGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.4bpp.lz"); -static const u32 sPkmnJumpBgTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.bin.lz"); - -static const u16 sPkmnJumpVenusaurPal[] = INCBIN_U16("graphics/link_games/pkmnjump_venusaur.gbapal"); -static const u32 sPkmnJumpVenusaurGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.4bpp.lz"); -static const u32 sPkmnJumpVenusaurTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.bin.lz"); - -static const u16 sPkmnJumpResultsPal[] = INCBIN_U16("graphics/link_games/pkmnjump_results.gbapal"); -static const u32 sPkmnJumpResultsGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_results.4bpp.lz"); -static const u32 sPkmnJumpResultsTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_results.bin.lz"); - -static const struct BgTemplate gUnknown_846D8D4[] = -{ - { - .bg = 0, - .charBaseIndex = 0, - .mapBaseIndex = 27, - .screenSize = 0, - .paletteMode = 0, - .priority = 0, - .baseTile = 0 - }, - { - .bg = 2, - .charBaseIndex = 1, - .mapBaseIndex = 30, - .screenSize = 2, - .paletteMode = 0, - .priority = 2, - .baseTile = 0 - }, - { - .bg = 1, - .charBaseIndex = 2, - .mapBaseIndex = 12, - .screenSize = 3, - .paletteMode = 0, - .priority = 1, - .baseTile = 0 - }, - { - .bg = 3, - .charBaseIndex = 3, - .mapBaseIndex = 29, - .screenSize = 0, - .paletteMode = 0, - .priority = 3, - .baseTile = 0 - }, -}; - -static const struct WindowTemplate gUnknown_846D8E4[] = -{ - { - .bg = 0, - .tilemapLeft = 19, - .tilemapTop = 0, - .width = 6, - .height = 2, - .paletteNum = 2, - .baseBlock = 0x13, - }, - { - .bg = 0, - .tilemapLeft = 8, - .tilemapTop = 0, - .width = 6, - .height = 2, - .paletteNum = 2, - .baseBlock = 0x1F, - }, - DUMMY_WIN_TEMPLATE, -}; - -struct -{ - int id; - void (*func)(void); -} static const gUnknown_846D8FC[] = -{ - {0x00, sub_8149DC8}, - {0x01, sub_8149F64}, - {0x02, sub_8149FD0}, - {0x03, sub_814A03C}, - {0x04, sub_814A0C8}, - {0x05, sub_814A174}, - {0x06, sub_814A218}, - {0x07, sub_814A264}, - {0x09, sub_814A3AC}, - {0x08, sub_814A308}, -}; - -void sub_8149D40(int arg0) -{ - int i; - - for (i = 0; i < NELEMS(gUnknown_846D8FC); i++) - { - if (gUnknown_846D8FC[i].id == arg0) - sub_8149D80(gUnknown_846D8FC[i].func); - } -} - -bool32 sub_8149D68(void) -{ - return (gUnknown_203F3D8->unk0 != 1); -} - -static void sub_8149D80(void (*func)(void)) -{ - SetWordTaskArg(gUnknown_203F3D8->unk6, 0, (uintptr_t)func); - gUnknown_203F3D8->unk4 = 0; - gUnknown_203F3D8->unk0 = 0; -} - -static void sub_8149DA4(u8 taskId) -{ - if (!gUnknown_203F3D8->unk0) - { - void (*func)(void) = (void *)(GetWordTaskArg(taskId, 0)); - - func(); - } -} - -static void sub_8149DC8(void) -{ - switch (gUnknown_203F3D8->unk4) - { - case 0: - ResetBgsAndClearDma3BusyFlags(FALSE); - InitBgsFromTemplates(0, gUnknown_846D8D4, NELEMS(gUnknown_846D8D4)); - InitWindows(gUnknown_846D8E4); - ResetBgPositions(); - ResetTempTileDataBuffers(); - sub_814AD6C(gUnknown_203F3D8); - sub_814A9C8(); - LoadPalette(sPkmnJumpBgPal, 0, 0x20); - DecompressAndCopyTileDataToVram(3, sPkmnJumpBgGfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(3, sPkmnJumpBgTilemap, 0, 0, 1); - LoadPalette(sPkmnJumpVenusaurPal, 0x30, 0x20); - DecompressAndCopyTileDataToVram(2, sPkmnJumpVenusaurGfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(2, sPkmnJumpVenusaurTilemap, 0, 0, 1); - LoadPalette(sPkmnJumpResultsPal, 0x10, 0x20); - DecompressAndCopyTileDataToVram(1, sPkmnJumpResultsGfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(1, sPkmnJumpResultsTilemap, 0, 0, 1); - LoadPalette(sPkmnJumpPal3, 0x20, 0x20); - SetBgTilemapBuffer(0, gUnknown_203F3D8->tilemapBuffer); - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); - sub_814A84C(); - sub_814AA24(0); - DrawWindowBorderWithStdpal3(0, 1, 0xE0); - LoadUserWindowBorderGfx(0, 0x00A, 0xD0); - CopyBgTilemapBufferToVram(0); - CopyBgTilemapBufferToVram(2); - CopyBgTilemapBufferToVram(1); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!FreeTempTileDataBuffersIfPossible()) - { - sub_814A8B8(); - sub_814B294(gUnknown_203F3D8); - sub_814B348(gUnknown_203F3D8, 6); - ShowBg(3); - ShowBg(0); - ShowBg(2); - HideBg(1); - gUnknown_203F3D8->unk4++; - } - break; - case 2: - gUnknown_203F3D8->unk0 = 1; - break; - } -} - -static void sub_8149F64(void) -{ - switch (gUnknown_203F3D8->unk4) - { - case 0: - sub_814AADC(); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - { - sub_814AC30(FALSE); - gUnknown_203F3D8->unk4++; - } - break; - case 2: - if (!IsDma3ManagerBusyWithBgCopy()) - { - sub_814AC94(); - gUnknown_203F3D8->unk4++; - } - break; - case 3: - if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_203F3D8->unk0 = 1; - break; - } -} - -static void sub_8149FD0(void) -{ - switch (gUnknown_203F3D8->unk4) - { - case 0: - sub_814AADC(); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - { - sub_814AC30(TRUE); - gUnknown_203F3D8->unk4++; - } - break; - case 2: - if (!IsDma3ManagerBusyWithBgCopy()) - { - sub_814AC94(); - gUnknown_203F3D8->unk4++; - } - break; - case 3: - if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_203F3D8->unk0 = 1; - break; - } -} - -static void sub_814A03C(void) -{ - int i, numPlayers; - - numPlayers = sub_81499A4(); - switch (gUnknown_203F3D8->unk4) - { - case 0: - for (i = 0; i < numPlayers; i++) - ClearWindowTilemap(gUnknown_203F3D8->unk1C[i]); - - CopyBgTilemapBufferToVram(0); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - { - for (i = 0; i < numPlayers; i++) - RemoveWindow(gUnknown_203F3D8->unk1C[i]); - - gUnknown_203F3D8->unk0 = 1; - } - break; - } -} - -static void sub_814A0C8(void) -{ - switch (gUnknown_203F3D8->unk4) - { - case 0: - gUnknown_203F3D8->unk12 = sub_814A754(1, 8, 20, 2); - AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_WantToPlayAgain2, 0, 2, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - { - PutWindowTilemap(gUnknown_203F3D8->unk12); - DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); - sub_814A7D0(23, 7, 0); - CopyBgTilemapBufferToVram(0); - gUnknown_203F3D8->unk4++; - } - break; - case 2: - if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_203F3D8->unk0 = 1; - break; - } -} - -static void sub_814A174(void) -{ - switch (gUnknown_203F3D8->unk4) - { - case 0: - gUnknown_203F3D8->unk12 = sub_814A754(2, 7, 26, 4); - AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_SavingDontTurnOffPower, 0, 2, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - { - PutWindowTilemap(gUnknown_203F3D8->unk12); - DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); - CopyBgTilemapBufferToVram(0); - gUnknown_203F3D8->unk4++; - } - break; - case 2: - if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_203F3D8->unk0 = 1; - break; - } -} - -static void sub_814A218(void) -{ - switch (gUnknown_203F3D8->unk4) - { - case 0: - sub_814A6CC(); - DestroyYesNoMenu(); - CopyBgTilemapBufferToVram(0); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!sub_814A6FC() && !IsDma3ManagerBusyWithBgCopy()) - gUnknown_203F3D8->unk0 = 1; - break; - } -} - -static void sub_814A264(void) -{ - switch (gUnknown_203F3D8->unk4) - { - case 0: - gUnknown_203F3D8->unk12 = sub_814A754(2, 8, 22, 4); - AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_SomeoneDroppedOut2, 0, 2, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - { - PutWindowTilemap(gUnknown_203F3D8->unk12); - DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); - CopyBgTilemapBufferToVram(0); - gUnknown_203F3D8->unk4++; - } - break; - case 2: - if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_203F3D8->unk0 = 1; - break; - } -} - -static void sub_814A308(void) -{ - switch (gUnknown_203F3D8->unk4) - { - case 0: - gUnknown_203F3D8->unk12 = sub_814A754(7, 10, 16, 2); - AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gText_CommunicationStandby4, 0, 2, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - { - PutWindowTilemap(gUnknown_203F3D8->unk12); - DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); - CopyBgTilemapBufferToVram(0); - gUnknown_203F3D8->unk4++; - } - break; - case 2: - if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_203F3D8->unk0 = 1; - break; - } -} - -static void sub_814A3AC(void) -{ - switch (gUnknown_203F3D8->unk4) - { - case 0: - sub_814B43C(gUnknown_203F3D8); - gUnknown_203F3D8->unk4++; - break; - case 1: - if (!sub_814B460()) - gUnknown_203F3D8->unk0 = 1; - break; - } -} - -void sub_814A3E4(void) -{ - gUnknown_203F3D8->unkA = 0; - gUnknown_203F3D8->unkB = 0; - gUnknown_203F3D8->unkC = 6; - sub_814A95C(gUnknown_203F3D8->unkC); -} - -bool32 sub_814A408(void) -{ - switch (gUnknown_203F3D8->unkA) - { - case 0: - gUnknown_203F3D8->unkB++; - if (gUnknown_203F3D8->unkB > 10) - { - gUnknown_203F3D8->unkB = 0; - gUnknown_203F3D8->unkC++; - if (gUnknown_203F3D8->unkC >= 10) - { - gUnknown_203F3D8->unkC = 0; - gUnknown_203F3D8->unkA++; - } - } - sub_814A95C(gUnknown_203F3D8->unkC); - if (gUnknown_203F3D8->unkC != 7) - break; - case 1: - return FALSE; - } - - return TRUE; -} - -static const u8 sPluralTxt[] = _("IES"); - -void sub_814A468(u16 itemId, u16 quantity) -{ - CopyItemName(itemId, gUnknown_203F3D8->txtBuff[0]); - ConvertIntToDecimalStringN(gUnknown_203F3D8->txtBuff[1], quantity, STR_CONV_MODE_LEFT_ALIGN, 1); - if (itemId >= FIRST_BERRY_INDEX && itemId < LAST_BERRY_INDEX) - { - if (quantity > 1) - { - int endi = StringLength(gUnknown_203F3D8->txtBuff[0]); - if (endi != 0) - { - endi--; - endi[gUnknown_203F3D8->txtBuff[0]] = EOS; - StringAppend(gUnknown_203F3D8->txtBuff[0], sPluralTxt); - } - } - } - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_203F3D8->txtBuff[0]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_203F3D8->txtBuff[1]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_203F3D8->strBuff, gText_AwesomeWonF701F700); - gUnknown_203F3D8->unk12 = sub_814A754(4, 8, 22, 4); - AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gUnknown_203F3D8->strBuff, 0, 2, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); - gUnknown_203F3D8->unk14 = MUS_LEVEL_UP; - gUnknown_203F3D8->unkD = 0; -} - -void sub_814A53C(u16 itemId) -{ - CopyItemName(itemId, gUnknown_203F3D8->txtBuff[0]); - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_203F3D8->txtBuff[0]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_203F3D8->strBuff, gText_FilledStorageSpace2); - gUnknown_203F3D8->unk12 = sub_814A754(4, 8, 22, 4); - AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gUnknown_203F3D8->strBuff, 0, 2, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); - gUnknown_203F3D8->unk14 = 0; - gUnknown_203F3D8->unkD = 0; -} - -void sub_814A5B4(u16 itemId) -{ - CopyItemName(itemId, gUnknown_203F3D8->txtBuff[0]); - DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_203F3D8->txtBuff[0]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_203F3D8->strBuff, gText_CantHoldMore); - gUnknown_203F3D8->unk12 = sub_814A754(4, 9, 22, 2); - AddTextPrinterParameterized(gUnknown_203F3D8->unk12, 2, gUnknown_203F3D8->strBuff, 0, 2, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_GFX); - gUnknown_203F3D8->unk14 = 0; - gUnknown_203F3D8->unkD = 0; -} - -bool32 sub_814A62C(void) -{ - switch (gUnknown_203F3D8->unkD) - { - case 0: - if (!IsDma3ManagerBusyWithBgCopy()) - { - PutWindowTilemap(gUnknown_203F3D8->unk12); - DrawTextBorderOuter(gUnknown_203F3D8->unk12, 1, 14); - CopyBgTilemapBufferToVram(0); - gUnknown_203F3D8->unkD++; - } - break; - case 1: - if (IsDma3ManagerBusyWithBgCopy()) - break; - if (gUnknown_203F3D8->unk14 == 0) - { - gUnknown_203F3D8->unkD += 2; - return FALSE; - } - PlayFanfare(gUnknown_203F3D8->unk14); - gUnknown_203F3D8->unkD++; - case 2: - if (!IsFanfareTaskInactive()) - break; - gUnknown_203F3D8->unkD++; - case 3: - return FALSE; - } - - return TRUE; -} - -void sub_814A6CC(void) -{ - if (gUnknown_203F3D8->unk12 != 0xFF) - { - rbox_fill_rectangle(gUnknown_203F3D8->unk12); - CopyWindowToVram(gUnknown_203F3D8->unk12, COPYWIN_MAP); - gUnknown_203F3D8->unkD = 0; - } -} - -// Can't match this without the ugly GOTO, oh well. -bool32 sub_814A6FC(void) -{ - if (gUnknown_203F3D8->unk12 == 0xFF) - { - RET_FALSE: - return FALSE; - } - - if (gUnknown_203F3D8->unkD == 0) - { - if (!IsDma3ManagerBusyWithBgCopy()) - { - RemoveWindow(gUnknown_203F3D8->unk12); - gUnknown_203F3D8->unk12 = 0xFF; - gUnknown_203F3D8->unkD++; - goto RET_FALSE; - } - } - else if (gUnknown_203F3D8->unkD == 1) - goto RET_FALSE; - - return TRUE; -} - -s8 sub_814A744(void) -{ - return Menu_ProcessInputNoWrapClearOnChoose(); -} - -static u32 sub_814A754(u32 left, u32 top, u32 width, u32 height) -{ - u32 windowId; - struct WindowTemplate window; - - window.bg = 0; - window.tilemapLeft = left; - window.tilemapTop = top; - window.width = width; - window.height = height; - window.paletteNum = 0xF; - window.baseBlock = 0x43; - - windowId = AddWindow(&window); - FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); - return windowId; -} - -static void sub_814A7D0(u16 left, u16 top, u8 cursorPos) -{ - struct WindowTemplate window; - u8 a = cursorPos; - - window.bg = 0; - window.tilemapLeft = left; - window.tilemapTop = top; - window.width = 6; - window.height = 4; - window.paletteNum = 2; - window.baseBlock = 0x2B; - - CreateYesNoMenu(&window, 2, 0, 2, 0x00a, 0xD, a); -} - -static void sub_814A84C(void) -{ - u8 color[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; - - PutWindowTilemap(0); - PutWindowTilemap(1); - FillWindowPixelBuffer(0, PIXEL_FILL(0)); - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - AddTextPrinterParameterized3(0, 0, 0, 2, color, 0, gText_SpacePoints2); - AddTextPrinterParameterized3(1, 0, 0, 2, color, 0, gText_SpaceTimes3); -} - -static const u8 gUnknown_846D953[] = {2, 2, 0, 0, 1, 1, 1, 0, 0, 2, 0, 0, 0}; - -static const struct CompressedSpriteSheet gUnknown_846D960 = {gUnknown_8479688, 0, 0x320}; -static const struct SpritePalette gUnknown_846D968 = {gUnknown_8479668, 0x320}; - -static const u16 gUnknown_846D970[] = {0x06, 0x08, 0x10, 0x08}; -static const u16 gUnknown_846D978[] = {0x06, 0x08, 0x0b, 0x06, 0x10, 0x08}; -static const u16 gUnknown_846D984[] = {0x02, 0x06, 0x06, 0x08, 0x10, 0x08, 0x14, 0x06}; -static const u16 gUnknown_846D994[] = {0x02, 0x06, 0x06, 0x08, 0x0b, 0x06, 0x10, 0x08, 0x14, 0x06}; - -static const u16 *const gUnknown_846D9A8[] = -{ - gUnknown_846D970, - gUnknown_846D978, - gUnknown_846D984, - gUnknown_846D994, -}; - -static const s16 gUnknown_846D9B8[] = {0x0058, 0x0098}; -static const s16 gUnknown_846D9BC[] = {0x0058, 0x0078, 0x0098}; -static const s16 gUnknown_846D9C2[] = {0x0038, 0x0058, 0x0098, 0x00b8}; -static const s16 gUnknown_846D9CA[] = {0x0038, 0x0058, 0x0078, 0x0098, 0x00b8}; - -static const s16 *const gUnknown_846D9D4[] = -{ - gUnknown_846D9B8, - gUnknown_846D9BC, - gUnknown_846D9C2, - gUnknown_846D9CA, -}; - -static void sub_814A8B8(void) -{ - int i, y, playersCount = sub_81499A4(); - const s16 *xCoords = gUnknown_846D9D4[playersCount - 2]; - - for (i = 0; i < playersCount; i++) - { - struct PokemonJump1_MonInfo *info = sub_81499C0(i); - - y = gMonFrontPicCoords[info->species].y_offset; - sub_814ADCC(gUnknown_203F3D8, info, *xCoords, y + 112, i); - sub_814B240(gUnknown_203F3D8, *xCoords, 112, i); - xCoords++; - } -} - -void sub_814A940(u32 id, s16 y) -{ - gUnknown_203F3D8->unk81A8[id]->y2 = y; -} - -void sub_814A95C(int id) -{ - sub_814B348(gUnknown_203F3D8, id); - ChangeBgY(2, (gUnknown_846D953[id] * 5) << 0xD, 0); -} - -int sub_814A98C(u8 flags) -{ - int i, count; - - for (i = 0, count = 0; i < 5; i++) - { - if (flags & 1) - { - sub_814AF0C(gUnknown_203F3D8, i); - count++; - } - flags >>= 1; - } - - sub_814ACCC(count - 2); - return count; -} - -static void sub_814A9C8(void) -{ - struct DigitObjUtilTemplate unkStruct; - struct DigitObjUtilTemplate *ptr = &unkStruct; // This temp variable is needed to match, don't ask me why. - - ptr->shape = SPRITE_SHAPE(8x8); - ptr->size = SPRITE_SIZE(8x8); - ptr->strConvMode = 0; - ptr->priority = 1; - ptr->oamCount = 5; - ptr->xDelta = 8; - ptr->x = 108; - ptr->y = 6; - ptr->spriteSheet.compressed = &gUnknown_846D960; - ptr->spritePal = &gUnknown_846D968; - - DigitObjUtil_Init(2); - DigitObjUtil_CreatePrinter(0, 0, ptr); - - unkStruct.oamCount = 4; - unkStruct.x = 30; - unkStruct.y = 6; - DigitObjUtil_CreatePrinter(1, 0, &unkStruct); -} - -void sub_814AA24(int arg0) -{ - DigitObjUtil_PrintNumOn(0, arg0); -} - -void sub_814AA34(u16 arg0) -{ - DigitObjUtil_PrintNumOn(1, arg0); -} - -void sub_814AA48(u8 multiplayerId) -{ - sub_814AFE8(gUnknown_203F3D8, multiplayerId); -} - -void sub_814AA60(u8 multiplayerId) -{ - sub_814B080(gUnknown_203F3D8, multiplayerId); -} - -int sub_814AA78(int multiplayerId) -{ - return sub_814B010(gUnknown_203F3D8, multiplayerId); -} - -void sub_814AA8C(void) -{ - sub_814B0A8(gUnknown_203F3D8); -} - -void sub_814AAA0(void) -{ - sub_814B134(gUnknown_203F3D8); -} - -void sub_814AAB4(int multiplayerId) -{ - sub_814B168(gUnknown_203F3D8, multiplayerId); -} - -int sub_814AAC8(void) -{ - return sub_814B190(gUnknown_203F3D8); -} - -static void sub_814AADC(void) -{ - struct WindowTemplate window; - int i, playersCount = sub_81499A4(); - const u16 *winCoords = gUnknown_846D9A8[playersCount - 2]; - - window.bg = 0; - window.width = 8; - window.height = 2; - window.paletteNum = 2; - window.baseBlock = 0x2B; - - for (i = 0; i < playersCount; i++) - { - window.tilemapLeft = winCoords[0]; - window.tilemapTop = winCoords[1]; - gUnknown_203F3D8->unk1C[i] = AddWindow(&window); - ClearWindowTilemap(gUnknown_203F3D8->unk1C[i]); - window.baseBlock += 0x10; - winCoords += 2; - } - - CopyBgTilemapBufferToVram(0); -} - -static void sub_814AB98(int multiplayerId, u8 clr1, u8 clr2, u8 clr3) -{ - u32 x; - u8 colors[3] = {clr1, clr2, clr3}; - - FillWindowPixelBuffer(gUnknown_203F3D8->unk1C[multiplayerId], PIXEL_FILL(0)); - x = 64 - GetStringWidth(0, sub_81499E0(multiplayerId), -1); - x /= 2; - AddTextPrinterParameterized3(gUnknown_203F3D8->unk1C[multiplayerId], 0, x, 2, colors, -1, sub_81499E0(multiplayerId)); - CopyWindowToVram(gUnknown_203F3D8->unk1C[multiplayerId], COPYWIN_GFX); -} - -static void sub_814AC30(bool32 arg0) -{ - int i, var, playersCount = sub_81499A4(); - - if (!arg0) - { - for (i = 0; i < playersCount; i++) - sub_814AB98(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); - } - else - { - var = sub_81499B4(); - for (i = 0; i < playersCount; i++) - { - if (var != i) - sub_814AB98(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); - else - sub_814AB98(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED); - } - } -} - -static void sub_814AC94(void) -{ - int i, playersCount = sub_81499A4(); - - for (i = 0; i < playersCount; i++) - PutWindowTilemap(gUnknown_203F3D8->unk1C[i]); - CopyBgTilemapBufferToVram(0); -} - -static void sub_814ACCC(u8 arg0) -{ - gUnknown_203F3D8->unk18 = 0; - ChangeBgX(1, (arg0 / 2) << 16, 0); - ChangeBgY(1, (((arg0 % 2) << 8) - 40) << 8, 0); - ShowBg(1); - CreateTask(sub_814AD50, 4); -} - -static bool32 sub_814AD18(void) -{ - if (gUnknown_203F3D8->unk18 >= 32) - { - return FALSE; - } - else - { - ChangeBgY(1, 128, 1); - if (++gUnknown_203F3D8->unk18 >= 32) - HideBg(1); - return TRUE; - } -} - -static void sub_814AD50(u8 taskId) -{ - if (!sub_814AD18()) - DestroyTask(taskId); -} diff --git a/src/pokemon_jump_5.c b/src/pokemon_jump_5.c deleted file mode 100644 index 80e8abd81..000000000 --- a/src/pokemon_jump_5.c +++ /dev/null @@ -1,637 +0,0 @@ -#include "global.h" -#include "gflib.h" -#include "decompress.h" -#include "minigame_countdown.h" -#include "pokemon_jump.h" -#include "data.h" -#include "trig.h" -#include "constants/songs.h" - -static void sub_814AF74(struct Sprite *sprite); -static void sub_814B038(struct Sprite *sprite); -static void sub_814B100(struct Sprite *sprite); -static void sub_814B1CC(struct Sprite *sprite); - -static const u16 sPkmnJumpPal1[] = INCBIN_U16("graphics/link_games/pkmnjump_pal1.gbapal"); -static const u16 sPkmnJumpPal2[] = INCBIN_U16("graphics/link_games/pkmnjump_pal2.gbapal"); - -static const u32 sPkmnJumpRopeGfx1[] = INCBIN_U32("graphics/link_games/pkmnjump_rope1.4bpp.lz"); -static const u32 sPkmnJumpRopeGfx2[] = INCBIN_U32("graphics/link_games/pkmnjump_rope2.4bpp.lz"); -static const u32 sPkmnJumpRopeGfx3[] = INCBIN_U32("graphics/link_games/pkmnjump_rope3.4bpp.lz"); -static const u32 sPkmnJumpRopeGfx4[] = INCBIN_U32("graphics/link_games/pkmnjump_rope4.4bpp.lz"); - -static const u32 sPkmnJumpStarGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_star.4bpp.lz"); - -static const struct CompressedSpriteSheet gUnknown_846E0B0[] = -{ - {sPkmnJumpRopeGfx1, 0x600, 5}, - {sPkmnJumpRopeGfx2, 0x0c00, 6}, - {sPkmnJumpRopeGfx3, 0x0600, 7}, - {sPkmnJumpRopeGfx4, 0x0600, 8}, - {sPkmnJumpStarGfx, 0x0200, 10}, -}; - -static const struct SpritePalette gUnknown_846E0D8[] = -{ - {sPkmnJumpPal1, 5}, - {sPkmnJumpPal2, 6}, -}; - -// Forward declarations. -static const struct OamData sOamData_846E170; -static const struct SpriteTemplate gUnknown_846E220; -static const struct SpriteTemplate gUnknown_846E238; -static const struct SpriteTemplate gUnknown_846E250; -static const struct SpriteTemplate gUnknown_846E268; - -static const struct SpriteTemplate gUnknown_846E0E8 = -{ - .tileTag = 0, - .paletteTag = 0, - .oam = &sOamData_846E170, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const s16 gUnknown_846E100[][10] = -{ - {0x60, 0x60, 0x60, 0x72, 0x78, 0x78, 0x78, 0x72, 0x60, 0x60}, - {0x46, 0x50, 0x60, 0x72, 0x78, 0x80, 0x78, 0x72, 0x60, 0x50}, - {0x32, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48}, - {0x2a, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48}, -}; - -static const s16 gUnknown_846E150[] = {0x10, 0x28, 0x48, 0x68, 0x88, 0xa8, 0xc8, 0xe0}; - -static const struct SpriteTemplate *const gUnknown_846E160[] = -{ - &gUnknown_846E220, - &gUnknown_846E238, - &gUnknown_846E250, - &gUnknown_846E268, -}; - -static const struct OamData sOamData_846E170 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(64x64), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(64x64), - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData sOamData_846E178 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(16x32), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(16x32), - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData sOamData_846E180 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(32x32), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(32x32), - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0 -}; - -static const struct OamData sOamData_846E188 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(32x16), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(32x16), - .tileNum = 0, - .priority = 2, - .paletteNum = 0, - .affineParam = 0 -}; - -static const union AnimCmd sSpriteAnim_846E190[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E198[] = -{ - ANIMCMD_FRAME(8, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1A0[] = -{ - ANIMCMD_FRAME(16, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1A8[] = -{ - ANIMCMD_FRAME(24, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1B0[] = -{ - ANIMCMD_FRAME(32, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1B8[] = -{ - ANIMCMD_FRAME(40, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1C0[] = -{ - ANIMCMD_FRAME(0, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1C8[] = -{ - ANIMCMD_FRAME(16, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1D0[] = -{ - ANIMCMD_FRAME(32, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1D8[] = -{ - ANIMCMD_FRAME(48, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1E0[] = -{ - ANIMCMD_FRAME(64, 1), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E1E8[] = -{ - ANIMCMD_FRAME(80, 1), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_846E1F0[] = -{ - sSpriteAnim_846E190, - sSpriteAnim_846E198, - sSpriteAnim_846E1A0, - sSpriteAnim_846E1A8, - sSpriteAnim_846E1B0, - sSpriteAnim_846E1B8 -}; - -static const union AnimCmd *const sSpriteAnimTable_846E208[] = -{ - sSpriteAnim_846E1C0, - sSpriteAnim_846E1C8, - sSpriteAnim_846E1D0, - sSpriteAnim_846E1D8, - sSpriteAnim_846E1E0, - sSpriteAnim_846E1E8 -}; - -static const struct SpriteTemplate gUnknown_846E220 = -{ - .tileTag = 5, - .paletteTag = 5, - .oam = &sOamData_846E178, - .anims = sSpriteAnimTable_846E1F0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const struct SpriteTemplate gUnknown_846E238 = -{ - .tileTag = 6, - .paletteTag = 5, - .oam = &sOamData_846E180, - .anims = sSpriteAnimTable_846E208, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const struct SpriteTemplate gUnknown_846E250 = -{ - .tileTag = 7, - .paletteTag = 5, - .oam = &sOamData_846E188, - .anims = sSpriteAnimTable_846E1F0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const struct SpriteTemplate gUnknown_846E268 = -{ - .tileTag = 8, - .paletteTag = 5, - .oam = &sOamData_846E188, - .anims = sSpriteAnimTable_846E1F0, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -static const struct OamData sOamData_846E280 = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .mosaic = 0, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(16x16), - .x = 0, - .matrixNum = 0, - .size = SPRITE_SIZE(16x16), - .tileNum = 0, - .priority = 1, - .paletteNum = 0, - .affineParam = 0 -}; - -static const union AnimCmd sSpriteAnim_846E288[] = -{ - ANIMCMD_FRAME(0, 0), - ANIMCMD_END -}; - -static const union AnimCmd sSpriteAnim_846E290[] = -{ - ANIMCMD_FRAME(0, 4), - ANIMCMD_FRAME(4, 4), - ANIMCMD_FRAME(8, 4), - ANIMCMD_FRAME(12, 4), - ANIMCMD_LOOP(1), - ANIMCMD_FRAME(0, 4), - ANIMCMD_END -}; - -static const union AnimCmd *const sSpriteAnimTable_846E2AC[] = -{ - sSpriteAnim_846E288, - sSpriteAnim_846E290 -}; - -static const struct SpriteTemplate gUnknown_846E2B4 = -{ - .tileTag = 10, - .paletteTag = 5, - .oam = &sOamData_846E280, - .anims = sSpriteAnimTable_846E2AC, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy, -}; - -void sub_814AD6C(struct PokemonJump2 *arg0) -{ - int i; - - for (i = 0; i < NELEMS(gUnknown_846E0B0); i++) - LoadCompressedSpriteSheet(&gUnknown_846E0B0[i]); - - for (i = 0; i < NELEMS(gUnknown_846E0D8); i++) - LoadSpritePalette(&gUnknown_846E0D8[i]); - - arg0->unkE = IndexOfSpritePaletteTag(5); - arg0->unkF = IndexOfSpritePaletteTag(6); -} - -static void sub_814ADB4(struct Sprite *sprite) -{ - int i; - for (i = 0; i < 8; i++) - sprite->data[i] = 0; -} - -void sub_814ADCC(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo *jumpMon, s16 x, s16 y, u8 multiplayerId) -{ - struct SpriteTemplate spriteTemplate; - struct SpriteSheet spriteSheet; - struct CompressedSpritePalette spritePalette; - u8 *buffer; - u8 *unusedBuffer; - u8 subpriority; - u8 spriteId; - - spriteTemplate = gUnknown_846E0E8; - buffer = Alloc(0x2000); - unusedBuffer = Alloc(0x800); - if (multiplayerId == sub_81499B4()) - subpriority = 3; - else - subpriority = multiplayerId + 4; - - if (buffer && unusedBuffer) - { - HandleLoadSpecialPokePic( - &gMonFrontPicTable[jumpMon->species], - buffer, - jumpMon->species, - jumpMon->personality); - - spriteSheet.data = buffer; - spriteSheet.tag = multiplayerId; - spriteSheet.size = 0x800; - LoadSpriteSheet(&spriteSheet); - - spritePalette.data = GetMonSpritePalFromSpeciesAndPersonality(jumpMon->species, jumpMon->otId, jumpMon->personality); - spritePalette.tag = multiplayerId; - LoadCompressedSpritePalette(&spritePalette); - - Free(buffer); - Free(unusedBuffer); - - spriteTemplate.tileTag += multiplayerId; - spriteTemplate.paletteTag += multiplayerId; - spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); - if (spriteId != MAX_SPRITES) - { - arg0->unk81A8[multiplayerId] = &gSprites[spriteId]; - arg0->unk81FC[multiplayerId] = subpriority; - return; - } - } - - arg0->unk81A8[multiplayerId] = NULL; -} - -void sub_814AF0C(struct PokemonJump2 *arg0, int multiplayerId) -{ - sub_814ADB4(arg0->unk81BC[multiplayerId]); - arg0->unk81BC[multiplayerId]->data[7] = arg0->unk81A8[multiplayerId] - gSprites; - arg0->unk81BC[multiplayerId]->invisible = FALSE; - arg0->unk81BC[multiplayerId]->y = 96; - arg0->unk81BC[multiplayerId]->callback = sub_814AF74; - StartSpriteAnim(arg0->unk81BC[multiplayerId], 1); -} - -static void sub_814AF74(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - if (sprite->animEnded) - { - sprite->invisible = TRUE; - sprite->callback = SpriteCallbackDummy; - } - break; - case 1: - sprite->y--; - sprite->data[1]++; - if (sprite->y <= 72) - { - sprite->y = 72; - sprite->data[0]++; - } - break; - case 2: - if (++sprite->data[1] >= 48) - { - sprite->invisible = TRUE; - sprite->callback = SpriteCallbackDummy; - } - break; - } -} - -void sub_814AFE8(struct PokemonJump2 *arg0, int multiplayerId) -{ - arg0->unk81A8[multiplayerId]->callback = sub_814B038; - arg0->unk81A8[multiplayerId]->y2 = 0; - sub_814ADB4(arg0->unk81A8[multiplayerId]); -} - -bool32 sub_814B010(struct PokemonJump2 *arg0, int multiplayerId) -{ - return arg0->unk81A8[multiplayerId]->callback == sub_814B038; -} - -static void sub_814B038(struct Sprite *sprite) -{ - if (++sprite->data[1] > 1) - { - if (++sprite->data[2] & 1) - sprite->y2 = 2; - else - sprite->y2 = -2; - - sprite->data[1] = 0; - } - - if (sprite->data[2] > 12) - { - sprite->y2 = 0; - sprite->callback = SpriteCallbackDummy; - } -} - -void sub_814B080(struct PokemonJump2 *arg0, int multiplayerId) -{ - sub_814ADB4(arg0->unk81A8[multiplayerId]); - arg0->unk81A8[multiplayerId]->callback = sub_814B100; -} - -void sub_814B0A8(struct PokemonJump2 *arg0) -{ - int i; - u16 numPlayers = sub_81499A4(); - for (i = 0; i < numPlayers; i++) - { - if (arg0->unk81A8[i]->callback == sub_814B100) - { - arg0->unk81A8[i]->invisible = FALSE; - arg0->unk81A8[i]->callback = SpriteCallbackDummy; - arg0->unk81A8[i]->subpriority = 10; - } - } -} - -static void sub_814B100(struct Sprite *sprite) -{ - if (++sprite->data[0] > 3) - { - sprite->data[0] = 0; - sprite->invisible ^= 1; - } -} - -void sub_814B134(struct PokemonJump2 *arg0) -{ - int i; - u16 numPlayers = sub_81499A4(); - for (i = 0; i < numPlayers; i++) - arg0->unk81A8[i]->subpriority = arg0->unk81FC[i]; -} - -void sub_814B168(struct PokemonJump2 *arg0, int multiplayerId) -{ - sub_814ADB4(arg0->unk81A8[multiplayerId]); - arg0->unk81A8[multiplayerId]->callback = sub_814B1CC; -} - -bool32 sub_814B190(struct PokemonJump2 *arg0) -{ - int i; - u16 numPlayers = sub_81499A4(); - for (i = 0; i < numPlayers; i++) - { - if (arg0->unk81A8[i]->callback == sub_814B1CC) - return TRUE; - } - - return FALSE; -} - -static void sub_814B1CC(struct Sprite *sprite) -{ - switch (sprite->data[0]) - { - case 0: - PlaySE(SE_BIKE_HOP); - sprite->data[1] = 0; - sprite->data[0]++; - // fall through - case 1: - sprite->data[1] += 4; - if (sprite->data[1] > 0x7F) - sprite->data[1] = 0; - - sprite->y2 = -(gSineTable[sprite->data[1]] >> 3); - if (sprite->data[1] == 0) - { - if (++sprite->data[2] < 2) - sprite->data[0] = 0; - else - sprite->callback = SpriteCallbackDummy; - } - break; - } -} - -void sub_814B240(struct PokemonJump2 *arg0, s16 x, s16 y, u8 multiplayerId) -{ - u8 spriteId = CreateSprite(&gUnknown_846E2B4, x, y, 1); - if (spriteId != MAX_SPRITES) - { - gSprites[spriteId].invisible = TRUE; - arg0->unk81BC[multiplayerId] = &gSprites[spriteId]; - } -} - -void sub_814B294(struct PokemonJump2 *arg0) -{ - int i; - int count; - u8 spriteId; - - count = 0; - for (i = 0; i < 4; i++) - { - spriteId = CreateSprite(gUnknown_846E160[i], gUnknown_846E150[count], gUnknown_846E100[i][0], 2); - arg0->unk81D0[count] = &gSprites[spriteId]; - count++; - } - - for (i = 3; i >= 0; i--) - { - spriteId = CreateSprite(gUnknown_846E160[i], gUnknown_846E150[count], gUnknown_846E100[i][0], 2); - arg0->unk81D0[count] = &gSprites[spriteId]; - arg0->unk81D0[count]->hFlip = 1; - count++; - } -} - -void sub_814B348(struct PokemonJump2 *arg0, int arg1) -{ - int i, count, palNum; - int priority; - - if (arg1 > 5) - { - arg1 = 10 - arg1; - priority = 3; - palNum = arg0->unkF; - } - else - { - priority = 2; - palNum = arg0->unkE; - } - - count = 0; - for (i = 0; i < 4; i++) - { - arg0->unk81D0[count]->y = gUnknown_846E100[i][arg1]; - arg0->unk81D0[count]->oam.priority = priority; - arg0->unk81D0[count]->oam.paletteNum = palNum; - StartSpriteAnim(arg0->unk81D0[count], arg1); - count++; - } - - for (i = 3; i >= 0; i--) - { - arg0->unk81D0[count]->y = gUnknown_846E100[i][arg1]; - arg0->unk81D0[count]->oam.priority = priority; - arg0->unk81D0[count]->oam.paletteNum = palNum; - StartSpriteAnim(arg0->unk81D0[count], arg1); - count++; - } -} - -void sub_814B43C(struct PokemonJump2 *arg0) -{ - StartMinigameCountdown(9, 7, 120, 80, 0); - sub_814B134(arg0); -} - -bool32 sub_814B460(void) -{ - return IsMinigameCountdownRunning(); -} diff --git a/src/pokemon_jump_6.c b/src/pokemon_jump_6.c deleted file mode 100644 index 1266a0f75..000000000 --- a/src/pokemon_jump_6.c +++ /dev/null @@ -1,140 +0,0 @@ -#include "global.h" -#include "gflib.h" -#include "menu.h" -#include "script.h" -#include "strings.h" -#include "task.h" -#include "text_window.h" - -static void Task_ShowPokemonJumpRecords(u8 taskId); -static void TruncateToFirstWordOnly(u8 *str); -static void sub_814B5C4(u16 windowId); - -static struct PokemonJumpRecords *sub_814B46C(void) -{ - return &gSaveBlock2Ptr->pokeJump; -} - -void ResetPokeJumpResults(void) -{ - struct PokemonJumpRecords *pokeJump = sub_814B46C(); - pokeJump->jumpsInRow = 0; - pokeJump->bestJumpScore = 0; - pokeJump->excellentsInRow = 0; - pokeJump->gamesWithMaxPlayers = 0; - pokeJump->unused2 = 0; - pokeJump->unused1 = 0; -} - -bool32 sub_814B494(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow) -{ - struct PokemonJumpRecords *pokeJump = sub_814B46C(); - bool32 ret = FALSE; - - if (pokeJump->bestJumpScore < jumpScore && jumpScore <= 99990) - pokeJump->bestJumpScore = jumpScore, ret = TRUE; - if (pokeJump->jumpsInRow < jumpsInRow && jumpsInRow <= 9999) - pokeJump->jumpsInRow = jumpsInRow, ret = TRUE; - if (pokeJump->excellentsInRow < excellentsInRow && excellentsInRow <= 9999) - pokeJump->excellentsInRow = excellentsInRow, ret = TRUE; - - return ret; -} - -void sub_814B4E8(void) -{ - struct PokemonJumpRecords *pokeJump = sub_814B46C(); - if (pokeJump->gamesWithMaxPlayers < 9999) - pokeJump->gamesWithMaxPlayers++; -} - -void ShowPokemonJumpRecords(void) -{ - u8 taskId = CreateTask(Task_ShowPokemonJumpRecords, 0); - Task_ShowPokemonJumpRecords(taskId); -} - -static const struct WindowTemplate gUnknown_846E2CC = -{ - .bg = 0, - .tilemapLeft = 1, - .tilemapTop = 1, - .width = 28, - .height = 9, - .paletteNum = 15, - .baseBlock = 0x1, -}; - -static const u8 *const gUnknown_846E2D4[] = {gText_JumpsInARow, gText_BestScore2, gText_ExcellentsInARow}; - -static void Task_ShowPokemonJumpRecords(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - switch (data[0]) - { - case 0: - data[1] = AddWindow(&gUnknown_846E2CC); - sub_814B5C4(data[1]); - CopyWindowToVram(data[1], COPYWIN_BOTH); - data[0]++; - break; - case 1: - if (!IsDma3ManagerBusyWithBgCopy()) - data[0]++; - break; - case 2: - if (JOY_NEW(A_BUTTON | B_BUTTON)) - { - rbox_fill_rectangle(data[1]); - CopyWindowToVram(data[1], COPYWIN_MAP); - data[0]++; - } - break; - case 3: - if (!IsDma3ManagerBusyWithBgCopy()) - { - RemoveWindow(data[1]); - DestroyTask(taskId); - EnableBothScriptContexts(); - } - break; - } -} - -static void sub_814B5C4(u16 windowId) -{ - int i, x; - int results[3]; - struct PokemonJumpRecords *pokeJump = sub_814B46C(); - u8 strbuf[8]; - results[0] = pokeJump->jumpsInRow; - results[1] = pokeJump->bestJumpScore; - results[2] = pokeJump->excellentsInRow; - - TextWindow_SetStdFrame0_WithPal(windowId, 0x21D, 0xD0); - DrawTextBorderOuter(windowId, 0x21D, 0xD); - FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); - AddTextPrinterParameterized5(windowId, 2, gText_PkmnJumpRecords, 0, 0, TEXT_SPEED_FF, NULL, 1, 0); - for (i = 0; i < NELEMS(gUnknown_846E2D4); i++) - { - AddTextPrinterParameterized5(windowId, 2, gUnknown_846E2D4[i], 0, 20 + (i * 14), TEXT_SPEED_FF, NULL, 1, 0); - ConvertIntToDecimalStringN(strbuf, results[i], STR_CONV_MODE_LEFT_ALIGN, 5); - TruncateToFirstWordOnly(strbuf); - x = 0xDE - GetStringWidth(2, strbuf, 0); - AddTextPrinterParameterized5(windowId, 2, strbuf, x, 20 + (i * 14), TEXT_SPEED_FF, NULL, 0, 0); - } - PutWindowTilemap(windowId); -} - -static void TruncateToFirstWordOnly(u8 *str) -{ - for (;*str != EOS; str++) - { - if (*str == CHAR_SPACE) - { - *str = EOS; - break; - } - } -} diff --git a/sym_ewram.txt b/sym_ewram.txt index 4d6a6dd51..b426b2ddf 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -129,8 +129,7 @@ .include "src/mevent_show_card.o" .include "src/mevent_show_news.o" .include "src/seagallop.o" - .include "src/pokemon_jump_2.o" - .include "src/pokemon_jump_4.o" + .include "src/pokemon_jump.o" .include "src/berry_crush.o" .include "src/dodrio_berry_picking.o" .include "src/dodrio_berry_picking_2.o" |