diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_2.c | 2 | ||||
-rw-r--r-- | src/battle_811DA74.c | 986 | ||||
-rw-r--r-- | src/battle_ai.c | 2 | ||||
-rw-r--r-- | src/daycare.c | 84 | ||||
-rw-r--r-- | src/decoration_inventory.c | 156 | ||||
-rwxr-xr-x[-rw-r--r--] | src/field_effect.c | 2847 | ||||
-rw-r--r-- | src/palette.c | 8 | ||||
-rw-r--r-- | src/record_mixing.c | 101 |
8 files changed, 4009 insertions, 177 deletions
diff --git a/src/battle_2.c b/src/battle_2.c index 119085e14..17a583441 100644 --- a/src/battle_2.c +++ b/src/battle_2.c @@ -1796,7 +1796,7 @@ void sub_8010874(void) void sub_8010B88(void) { - struct UnknownStruct4 sp0 = gUnknown_02024CA8[gUnknown_02024A60]; + struct UnkBattleStruct4 sp0 = gUnknown_02024CA8[gUnknown_02024A60]; s32 i; u8 *ptr; u32 *ptr2; diff --git a/src/battle_811DA74.c b/src/battle_811DA74.c index 328b45f49..56a4bd0c4 100644 --- a/src/battle_811DA74.c +++ b/src/battle_811DA74.c @@ -1,11 +1,15 @@ #include "global.h" #include "asm.h" +#include "battle.h" +#include "battle_interface.h" +#include "data2.h" #include "link.h" #include "m4a.h" #include "main.h" #include "palette.h" #include "pokemon.h" #include "sound.h" +#include "songs.h" #include "sprite.h" #include "string_util.h" #include "text.h" @@ -19,9 +23,18 @@ struct UnknownStruct1 struct UnknownStruct2 { - u8 unk0; - u8 unk1; - u8 filler2[7]; + u8 unk0_0:1; + u8 unk0_1:2; + u8 unk0_3:1; + u8 unk0_4:1; + u8 unk0_5:1; + u8 unk0_6:1; + u8 unk0_7:1; + u8 unk1_0:1; + u8 filler2[2]; + u8 unk4; + u8 unk5; + u8 filler6[3]; u8 unk9; u8 fillerA[2]; }; @@ -34,32 +47,100 @@ struct UnknownStruct3 u8 ppBonuses; }; +struct UnknownStruct4 +{ + u8 unk0_0:2; + u8 unk0_2:1; + u8 unk0_3:1; +}; + +struct UnknownStruct5 +{ + u8 unk0_0:7; + u8 unk0_7:1; +}; + +struct UnknownStruct6 +{ + u8 filler0[9]; + u8 unk9; +}; + extern u32 gBitTable[]; extern u16 gBattleTypeFlags; +extern struct UnknownStruct5 gUnknown_020238C8; +extern u8 gUnknown_020238CC[]; extern u8 gUnknown_02023A60[][0x200]; extern u8 gUnknown_02024A60; extern u32 gUnknown_02024A64; extern u16 gUnknown_02024A6A[]; extern u8 gUnknown_02024BE0[]; +extern u8 gUnknown_02024D26; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E68[]; extern u8 gUnknown_02024E6D; +extern u32 gUnknown_02024E70[]; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u32 *gUnknown_0202F7B4; +extern u32 gUnknown_0202F7B8; +extern u16 gUnknown_0202F7BC; +extern u8 gUnknown_0202F7BE; +extern u16 gUnknown_0202F7C0; +extern u8 gUnknown_0202F7C4; extern struct Window gUnknown_03004210; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; extern MainCallback gUnknown_030042D0; extern void (*gUnknown_03004330[])(void); extern u8 gUnknown_03004340[]; extern u8 gUnknown_0300434C[]; +extern u8 gBattleMonForms[]; +extern u8 gAnimScriptActive; +extern void (*gAnimScriptCallback)(void); extern void (*const gUnknown_083FE4F4[])(void); -extern u8 unk_2000000[]; +extern u8 ewram[]; -#define EWRAM_17800 ((u8 *)(unk_2000000 + 0x17800)) -#define EWRAM_17810 ((struct UnknownStruct2 *)(unk_2000000 + 0x17810)) +#define ewram17800 ((struct UnknownStruct4 *)(ewram + 0x17800)) +#define ewram17810 ((struct UnknownStruct2 *)(ewram + 0x17810)) +#define ewram17840 (*(struct UnknownStruct6 *)(ewram + 0x17840)) +extern u8 move_anim_start_t3(); +extern u8 sub_8078874(); +extern void sub_8044CA0(u8); +extern void sub_8030E38(struct Sprite *); +extern void sub_80E43C0(); +extern void sub_8047858(); +extern void move_anim_start_t2_for_situation(); +extern void load_gfxc_health_bar(); +extern void sub_8043D84(); +extern void sub_8120AA8(); +extern void sub_8031F24(void); +extern void sub_80326EC(); +extern void ExecuteMoveAnim(); +extern void sub_80324BC(); +extern u8 sub_8031720(); +extern u8 mplay_80342A4(); +extern void oamt_add_pos2_onto_pos1(); +extern void oamt_set_x3A_32(); +extern void sub_8078B34(struct Sprite *); +extern void sub_80105EC(struct Sprite *); +extern s32 sub_803FC34(u16); +extern void sub_8031AF4(); +extern void sub_80313A0(struct Sprite *); +extern u8 sub_8046400(); +extern void sub_80312F0(struct Sprite *); +extern u8 CreateInvisibleSpriteWithCallback(); +extern void sub_80318FC(); +extern u8 sub_8077ABC(); +extern u8 sub_8077F68(); +extern u8 sub_8079E90(); extern void nullsub_10(); extern void sub_8045A5C(); extern void sub_804777C(); extern void sub_8043DFC(); -extern s16 sub_8045C78(); +//extern s16 sub_8045C78(); extern void sub_80440EC(); extern void sub_80324F8(); extern void nullsub_9(u16); @@ -77,6 +158,11 @@ void sub_811E0A0(void); void dp01_tbl3_exec_completed(void); u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *b); void sub_811EC68(u8); +void sub_811F864(u8, u8); +void sub_811FA5C(void); +void sub_811FF30(void); +void sub_812071C(u8); +void sub_81208E0(void); void nullsub_74(void) { @@ -117,9 +203,9 @@ void sub_811DB1C(void) void sub_811DB84(void) { - if ((--EWRAM_17810[gUnknown_02024A60].unk9) == 0xFF) + if ((--ewram17810[gUnknown_02024A60].unk9) == 0xFF) { - EWRAM_17810[gUnknown_02024A60].unk9 = 0; + ewram17810[gUnknown_02024A60].unk9 = 0; dp01_tbl3_exec_completed(); } } @@ -143,7 +229,7 @@ void sub_811DBC0(void) r6 = FALSE; if (r6) { - EWRAM_17810[gUnknown_02024A60].unk9 = 3; + ewram17810[gUnknown_02024A60].unk9 = 3; gUnknown_03004330[gUnknown_02024A60] = sub_811DB84; } } @@ -152,12 +238,13 @@ void sub_811DCA0(void) { u8 r2; - if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 8)) + if (!ewram17810[gUnknown_02024A60].unk0_3) { - r2 = EWRAM_17810[gUnknown_02024A60 ^ 2].unk0 & 8; - if (!r2 && (++EWRAM_17810[gUnknown_02024A60].unk9) != 1) + // I couldn't get it to work as a bitfield here + r2 = *((u8 *)&ewram17810[gUnknown_02024A60 ^ 2]) & 8; + if (!r2 && (++ewram17810[gUnknown_02024A60].unk9) != 1) { - EWRAM_17810[gUnknown_02024A60].unk9 = r2; + ewram17810[gUnknown_02024A60].unk9 = r2; if (IsDoubleBattle() && !(gBattleTypeFlags & 0x40)) { DestroySprite(&gSprites[gUnknown_0300434C[gUnknown_02024A60 ^ 2]]); @@ -169,7 +256,7 @@ void sub_811DCA0(void) sub_8045A5C(gUnknown_03004340[gUnknown_02024A60], &gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], 0); sub_804777C(gUnknown_02024A60); sub_8043DFC(gUnknown_03004340[gUnknown_02024A60]); - (s8)EWRAM_17810[4].unk9 &= ~1; + (s8)ewram17810[4].unk9 &= ~1; gUnknown_03004330[gUnknown_02024A60] = sub_811DBC0; } } @@ -213,7 +300,7 @@ void sub_811DE98(void) void sub_811DF34(void) { - if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x40)) + if (!ewram17810[gUnknown_02024A60].unk0_6) { FreeSpriteOamMatrix(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]); DestroySprite(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]); @@ -252,7 +339,7 @@ void sub_811E034(void) { if (gSprites[gUnknown_03004340[gUnknown_02024A60]].callback == SpriteCallbackDummy) { - if (EWRAM_17800[gUnknown_02024A60 * 4] & 4) + if (ewram17800[gUnknown_02024A60].unk0_2) move_anim_start_t4(gUnknown_02024A60, gUnknown_02024A60, gUnknown_02024A60, 6); gUnknown_03004330[gUnknown_02024A60] = sub_811E0A0; } @@ -260,16 +347,16 @@ void sub_811E034(void) void sub_811E0A0(void) { - if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x40)) + if (!ewram17810[gUnknown_02024A60].unk0_6) dp01_tbl3_exec_completed(); } void sub_811E0CC(void) { - if (EWRAM_17810[gUnknown_02024A60].unk1 & 1) + if (ewram17810[gUnknown_02024A60].unk1_0) { - EWRAM_17810[gUnknown_02024A60].unk0 &= 0x7F; - (s8)EWRAM_17810[gUnknown_02024A60].unk1 &= ~1; + ewram17810[gUnknown_02024A60].unk0_7 = 0; + ewram17810[gUnknown_02024A60].unk1_0 = 0; FreeSpriteTilesByTag(0x27F9); FreeSpritePaletteByTag(0x27F9); CreateTask(c3_0802FDF4, 10); @@ -285,10 +372,10 @@ void sub_811E0CC(void) void sub_811E1BC(void) { - if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x88)) + if (!ewram17810[gUnknown_02024A60].unk0_3 && !ewram17810[gUnknown_02024A60].unk0_7) sub_8141828(gUnknown_02024A60, &gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]]); if (gSprites[gUnknown_0300434C[gUnknown_02024A60]].callback == SpriteCallbackDummy - && !(EWRAM_17810[gUnknown_02024A60].unk0 & 8)) + && !ewram17810[gUnknown_02024A60].unk0_3) { DestroySprite(&gSprites[gUnknown_0300434C[gUnknown_02024A60]]); gUnknown_03004330[gUnknown_02024A60] = sub_811E0CC; @@ -344,13 +431,13 @@ void dp01_tbl3_exec_completed(void) void sub_811E38C(void) { - if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x10)) + if (!ewram17810[gUnknown_02024A60].unk0_4) dp01_tbl3_exec_completed(); } void sub_811E3B8(void) { - if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x20)) + if (!ewram17810[gUnknown_02024A60].unk0_5) dp01_tbl3_exec_completed(); } @@ -455,7 +542,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) case 5: case 6: case 7: - data16 = GetMonData(&gPlayerParty[a], gUnknown_02023A60[gUnknown_02024A60][1] + MON_DATA_CHECKSUM); + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gUnknown_02023A60[gUnknown_02024A60][1] - 4); buffer[0] = data16; buffer[1] = data16 >> 8; size = 2; @@ -470,7 +557,7 @@ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) case 10: case 11: case 12: - buffer[0] = GetMonData(&gPlayerParty[a], gUnknown_02023A60[gUnknown_02024A60][1] + MON_DATA_MARKINGS); + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gUnknown_02023A60[gUnknown_02024A60][1] - 9); size = 1; break; case 17: @@ -710,3 +797,848 @@ void sub_811EC10(void) } dp01_tbl3_exec_completed(); } + +void sub_811EC68(u8 a) +{ + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gUnknown_02023A60[gUnknown_02024A60][3]; + struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gUnknown_02023A60[gUnknown_02024A60][3]; + s32 i; + + switch (gUnknown_02023A60[gUnknown_02024A60][1]) + { + case 0: + { + u8 iv; + + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); + SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + iv = battlePokemon->hpIV; + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); + iv = battlePokemon->attackIV; + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + iv = battlePokemon->defenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + iv = battlePokemon->speedIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + iv = battlePokemon->spAttackIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + iv = battlePokemon->spDefenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); + SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); + SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); + SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); + SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + } + break; + case 1: + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 2: + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 3: + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + break; + case 4: + case 5: + case 6: + case 7: + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gUnknown_02023A60[gUnknown_02024A60][1] - 4, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 8: + SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gUnknown_02023A60[gUnknown_02024A60][3]); + SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gUnknown_02023A60[gUnknown_02024A60][4]); + SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gUnknown_02023A60[gUnknown_02024A60][5]); + SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gUnknown_02023A60[gUnknown_02024A60][6]); + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gUnknown_02023A60[gUnknown_02024A60][7]); + break; + case 9: + case 10: + case 11: + case 12: + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gUnknown_02023A60[gUnknown_02024A60][1] - 9, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 17: + SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 18: + SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 19: + SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 20: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 21: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 22: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 23: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 24: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 25: + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 26: + SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 27: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 28: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 29: + SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 30: + SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 31: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gUnknown_02023A60[gUnknown_02024A60][3]); + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gUnknown_02023A60[gUnknown_02024A60][4]); + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gUnknown_02023A60[gUnknown_02024A60][5]); + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gUnknown_02023A60[gUnknown_02024A60][6]); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gUnknown_02023A60[gUnknown_02024A60][7]); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gUnknown_02023A60[gUnknown_02024A60][8]); + break; + case 32: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 33: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 34: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 35: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 36: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 37: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 38: + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 39: + SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 40: + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 41: + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 42: + SetMonData(&gPlayerParty[a], MON_DATA_HP, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 43: + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 44: + SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 45: + SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 46: + SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 47: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 48: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 49: + SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 50: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 51: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 52: + SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 53: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 54: + SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 55: + SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 56: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 57: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 58: + SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + case 59: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gUnknown_02023A60[gUnknown_02024A60][3]); + break; + } + sub_80324F8(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], gUnknown_02024A60); +} + +void sub_811F664(void) +{ + u8 *dst; + u8 i; + + dst = (u8 *)&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]] + gUnknown_02023A60[gUnknown_02024A60][1]; + for (i = 0; i < gUnknown_02023A60[gUnknown_02024A60][2]; i++) + dst[i] = gUnknown_02023A60[gUnknown_02024A60][3 + i]; + dp01_tbl3_exec_completed(); +} + +void sub_811F6D8(void) +{ + sub_80318FC(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], gUnknown_02024A60); + GetMonSpriteTemplate_803C56C( + GetMonData(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], MON_DATA_SPECIES), + battle_get_per_side_status(gUnknown_02024A60)); + gUnknown_02024BE0[gUnknown_02024A60] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(gUnknown_02024A60, 2), + sub_8077F68(gUnknown_02024A60), + sub_8079E90(gUnknown_02024A60)); + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].pos2.x = -240; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data0 = gUnknown_02024A60; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].oam.paletteNum = gUnknown_02024A60; + StartSpriteAnim(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]], gBattleMonForms[gUnknown_02024A60]); + gUnknown_03004330[gUnknown_02024A60] = sub_811DDE8; +} + +void sub_811F7F4(void) +{ + sub_8032AA8(gUnknown_02024A60, gUnknown_02023A60[gUnknown_02024A60][2]); + gUnknown_02024A6A[gUnknown_02024A60] = gUnknown_02023A60[gUnknown_02024A60][1]; + sub_80318FC(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], gUnknown_02024A60); + sub_811F864(gUnknown_02024A60, gUnknown_02023A60[gUnknown_02024A60][2]); + gUnknown_03004330[gUnknown_02024A60] = sub_811E1BC; +} + +void sub_811F864(u8 a, u8 b) +{ + u16 species; + + sub_8032AA8(a, b); + gUnknown_02024A6A[a] = gUnknown_02023A60[a][1]; + species = GetMonData(&gPlayerParty[gUnknown_02024A6A[a]], MON_DATA_SPECIES); + gUnknown_0300434C[a] = CreateInvisibleSpriteWithCallback(sub_80312F0); + GetMonSpriteTemplate_803C56C(species, battle_get_per_side_status(a)); + gUnknown_02024BE0[a] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(a, 2), + sub_8077F68(a), + sub_8079E90(a)); + gSprites[gUnknown_0300434C[a]].data1 = gUnknown_02024BE0[a]; + gSprites[gUnknown_02024BE0[a]].data0 = a; + gSprites[gUnknown_02024BE0[a]].data2 = species; + gSprites[gUnknown_02024BE0[a]].oam.paletteNum = a; + StartSpriteAnim(&gSprites[gUnknown_02024BE0[a]], gBattleMonForms[a]); + gSprites[gUnknown_02024BE0[a]].invisible = TRUE; + gSprites[gUnknown_02024BE0[a]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[a]].data0 = sub_8046400(0, 0xFF); +} + +void sub_811F9D0(void) +{ + if (gUnknown_02023A60[gUnknown_02024A60][1] == 0) + { + ewram17810[gUnknown_02024A60].unk4 = 0; + gUnknown_03004330[gUnknown_02024A60] = sub_811FA5C; + } + else + { + FreeSpriteOamMatrix(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]); + DestroySprite(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]); + sub_8043DB0(gUnknown_03004340[gUnknown_02024A60]); + dp01_tbl3_exec_completed(); + } +} + +void sub_811FA5C(void) +{ + switch (ewram17810[gUnknown_02024A60].unk4) + { + case 0: + if (ewram17800[gUnknown_02024A60].unk0_2) + move_anim_start_t4(gUnknown_02024A60, gUnknown_02024A60, gUnknown_02024A60, 5); + ewram17810[gUnknown_02024A60].unk4 = 1; + break; + case 1: + if (!ewram17810[gUnknown_02024A60].unk0_6) + { + ewram17810[gUnknown_02024A60].unk4 = 0; + move_anim_start_t4(gUnknown_02024A60, gUnknown_02024A60, gUnknown_02024A60, 1); + gUnknown_03004330[gUnknown_02024A60] = sub_811DF34; + } + break; + } +} + +void sub_811FAE4(void) +{ + s16 xOffset; + u32 gender; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (battle_get_per_side_status(gUnknown_02024A60) & 2) + xOffset = 16; + else + xOffset = -16; + gender = gLinkPlayers[sub_803FC34(gUnknown_02024A60)].gender; + } + else + { + xOffset = 0; + gender = gLinkPlayers[GetMultiplayerId() ^ 1].gender; + } + sub_8031AF4(gender, gUnknown_02024A60); + GetMonSpriteTemplate_803C5A0(gender, battle_get_per_side_status(gUnknown_02024A60)); + gUnknown_02024BE0[gUnknown_02024A60] = CreateSprite( + &gUnknown_02024E8C, + 80 + xOffset, 80 + 4 * (8 - gTrainerBackPicCoords[gender].coords), + sub_8079E90(gUnknown_02024A60)); + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].oam.paletteNum = gUnknown_02024A60; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].pos2.x = 240; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data0 = -2; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].callback = sub_80313A0; + gUnknown_03004330[gUnknown_02024A60] = sub_811DAE4; +} + +void sub_811FC30(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_811FC3C(void) +{ + oamt_add_pos2_onto_pos1(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]); + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data0 = 35; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data2 = -40; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data4 = gSprites[gUnknown_02024BE0[gUnknown_02024A60]].pos1.y; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].callback = sub_8078B34; + oamt_set_x3A_32(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]], SpriteCallbackDummy); + gUnknown_03004330[gUnknown_02024A60] = sub_811DB1C; +} + +void sub_811FCE8(void) +{ + if (ewram17810[gUnknown_02024A60].unk4 == 0) + { + if (ewram17800[gUnknown_02024A60].unk0_2) + move_anim_start_t4(gUnknown_02024A60, gUnknown_02024A60, gUnknown_02024A60, 5); + ewram17810[gUnknown_02024A60].unk4++; + } + else if (!ewram17810[gUnknown_02024A60].unk0_6) + { + ewram17810[gUnknown_02024A60].unk4 = 0; + sub_80324F8(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], gUnknown_02024A60); + PlaySE12WithPanning(SE_POKE_DEAD, -64); + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data1 = 0; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data2 = 5; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].callback = sub_80105EC; + gUnknown_03004330[gUnknown_02024A60] = sub_811DE98; + } +} + +void sub_811FDCC(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_811FDD8(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_811FDE4(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_811FDF0(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_811FDFC(void) +{ + if (mplay_80342A4(gUnknown_02024A60) == 0) + { + u32 r0 = gUnknown_02023A60[gUnknown_02024A60][1] + | (gUnknown_02023A60[gUnknown_02024A60][2] << 8); + + gUnknown_0202F7C4 = gUnknown_02023A60[gUnknown_02024A60][3]; + gUnknown_0202F7BC = gUnknown_02023A60[gUnknown_02024A60][4] + | (gUnknown_02023A60[gUnknown_02024A60][5] << 8); + gUnknown_0202F7B8 = gUnknown_02023A60[gUnknown_02024A60][6] + | (gUnknown_02023A60[gUnknown_02024A60][7] << 8) + | (gUnknown_02023A60[gUnknown_02024A60][8] << 16) + | (gUnknown_02023A60[gUnknown_02024A60][9] << 24); + gUnknown_0202F7BE = gUnknown_02023A60[gUnknown_02024A60][10]; + gUnknown_0202F7C0 = gUnknown_02023A60[gUnknown_02024A60][12] + | (gUnknown_02023A60[gUnknown_02024A60][13] << 8); + gUnknown_0202F7B4 = (u32 *)&gUnknown_02023A60[gUnknown_02024A60][16]; + gUnknown_02024E70[gUnknown_02024A60] = *gUnknown_0202F7B4; + + if (sub_8031720(r0, gUnknown_0202F7C4) != 0) + dp01_tbl3_exec_completed(); + else + { + ewram17810[gUnknown_02024A60].unk4 = 0; + gUnknown_03004330[gUnknown_02024A60] = sub_811FF30; + } + } +} + +void sub_811FF30(void) +{ + u16 r4 = gUnknown_02023A60[gUnknown_02024A60][1] + | (gUnknown_02023A60[gUnknown_02024A60][2] << 8); + u8 r7 = gUnknown_02023A60[gUnknown_02024A60][11]; + + switch (ewram17810[gUnknown_02024A60].unk4) + { + case 0: + if (ewram17800[gUnknown_02024A60].unk0_2 && !ewram17800[gUnknown_02024A60].unk0_3) + { + ewram17800[gUnknown_02024A60].unk0_3 = 1; + move_anim_start_t4(gUnknown_02024A60, gUnknown_02024A60, gUnknown_02024A60, 5); + } + ewram17810[gUnknown_02024A60].unk4 = 1; + break; + case 1: + if (!ewram17810[gUnknown_02024A60].unk0_6) + { + sub_80326EC(0); + ExecuteMoveAnim(r4); + ewram17810[gUnknown_02024A60].unk4 = 2; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80326EC(1); + if ((ewram17800[gUnknown_02024A60].unk0_2) && r7 <= 1) + { + move_anim_start_t4(gUnknown_02024A60, gUnknown_02024A60, gUnknown_02024A60, 6); + ewram17800[gUnknown_02024A60].unk0_3 = 0; + } + ewram17810[gUnknown_02024A60].unk4 = 3; + } + break; + case 3: + if (!ewram17810[gUnknown_02024A60].unk0_6) + { + sub_8031F24(); + sub_80324BC( + gUnknown_02024A60, + gUnknown_02023A60[gUnknown_02024A60][1] | (gUnknown_02023A60[gUnknown_02024A60][2] << 8)); + ewram17810[gUnknown_02024A60].unk4 = 0; + dp01_tbl3_exec_completed(); + } + break; + } +} + +void sub_8120094(void) +{ + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + sub_8120AA8(*(u16 *)&gUnknown_02023A60[gUnknown_02024A60][2]); + sub_8002EB0(&gUnknown_03004210, gUnknown_020238CC, 144, 2, 15); + gUnknown_03004330[gUnknown_02024A60] = sub_811DFA0; +} + +void sub_81200F8(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120104(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120110(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_812011C(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120128(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120134(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120140(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_812014C(void) +{ + s16 r7; + + load_gfxc_health_bar(0); + r7 = gUnknown_02023A60[gUnknown_02024A60][2] | (gUnknown_02023A60[gUnknown_02024A60][3] << 8); + if (r7 != 0x7FFF) + { + u32 maxHP = GetMonData(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], MON_DATA_MAX_HP); + u32 hp = GetMonData(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], MON_DATA_HP); + + sub_8043D84(gUnknown_02024A60, gUnknown_03004340[gUnknown_02024A60], maxHP, hp, r7); + } + else + { + u32 maxHP = GetMonData(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], MON_DATA_MAX_HP); + + sub_8043D84(gUnknown_02024A60, gUnknown_03004340[gUnknown_02024A60], maxHP, 0, r7); + } + gUnknown_03004330[gUnknown_02024A60] = bx_t3_healthbar_update; +} + +void sub_812023C(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120248(void) +{ + if (mplay_80342A4(gUnknown_02024A60) == 0) + { + sub_8045A5C(gUnknown_03004340[gUnknown_02024A60], &gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], 9); + ewram17810[gUnknown_02024A60].unk0_4 = 0; + gUnknown_03004330[gUnknown_02024A60] = sub_811E38C; + } +} + +void sub_81202BC(void) +{ + if (mplay_80342A4(gUnknown_02024A60) == 0) + { + move_anim_start_t2_for_situation( + gUnknown_02023A60[gUnknown_02024A60][1], + gUnknown_02023A60[gUnknown_02024A60][2] + | (gUnknown_02023A60[gUnknown_02024A60][3] << 8) + | (gUnknown_02023A60[gUnknown_02024A60][4] << 16) + | (gUnknown_02023A60[gUnknown_02024A60][5] << 24)); + gUnknown_03004330[gUnknown_02024A60] = sub_811E38C; + } +} + +void sub_8120324(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120330(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_812033C(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120348(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120354(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120360(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_812036C(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120378(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120384(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120390(void) +{ + gUnknown_020238C8.unk0_0 = 0; + dp01_tbl3_exec_completed(); +} + +void sub_81203AC(void) +{ + gUnknown_020238C8.unk0_0 = gUnknown_02023A60[gUnknown_02024A60][1]; + dp01_tbl3_exec_completed(); +} + +void sub_81203E4(void) +{ + gUnknown_020238C8.unk0_7 = 0; + dp01_tbl3_exec_completed(); +} + +void sub_81203FC(void) +{ + gUnknown_020238C8.unk0_7 ^= 1; + dp01_tbl3_exec_completed(); +} + +void dp01t_29_3_blink(void) +{ + if (gSprites[gUnknown_02024BE0[gUnknown_02024A60]].invisible == TRUE) + dp01_tbl3_exec_completed(); + else + { + gUnknown_02024E6D = 1; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data1 = 0; + sub_8047858(gUnknown_02024A60); + gUnknown_03004330[gUnknown_02024A60] = bx_blink_t3; + } +} + +void sub_8120494(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_81204A0(void) +{ + s8 pan; + + if (battle_side_get_owner(gUnknown_02024A60) == 0) + pan = -64; + else + pan = 63; + PlaySE12WithPanning(gUnknown_02023A60[gUnknown_02024A60][1] | (gUnknown_02023A60[gUnknown_02024A60][2] << 8), pan); + dp01_tbl3_exec_completed(); +} + +void sub_81204E4(void) +{ + PlayFanfare(gUnknown_02023A60[gUnknown_02024A60][1] | (gUnknown_02023A60[gUnknown_02024A60][2] << 8)); + dp01_tbl3_exec_completed(); +} + +void sub_8120514(void) +{ + PlayCry3( + GetMonData(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], MON_DATA_SPECIES), + -25, 5); + dp01_tbl3_exec_completed(); +} + +void dp01t_2E_3_battle_intro(void) +{ + sub_80E43C0(gUnknown_02023A60[gUnknown_02024A60][1]); + gUnknown_02024DE8 |= 1; + dp01_tbl3_exec_completed(); +} + +void sub_8120588(void) +{ + u8 r4; + u8 taskId; + + oamt_add_pos2_onto_pos1(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]); + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data0 = 50; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data2 = -40; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data4 = gSprites[gUnknown_02024BE0[gUnknown_02024A60]].pos1.y; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].callback = sub_8078B34; + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].data5 = gUnknown_02024A60; + oamt_set_x3A_32(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]], sub_8030E38); + StartSpriteAnim(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]], 1); + r4 = AllocSpritePalette(0xD6F9); + LoadCompressedPalette( + gTrainerBackPicPaletteTable[gLinkPlayers[sub_803FC34(gUnknown_02024A60)].gender].data, + 0x100 + r4 * 16, 0x20); + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].oam.paletteNum = r4; + taskId = CreateTask(sub_812071C, 5); + gTasks[taskId].data[0] = gUnknown_02024A60; + if (ewram17810[gUnknown_02024A60].unk0_0) + gTasks[gUnknown_02024E68[gUnknown_02024A60]].func = sub_8044CA0; + ewram17840.unk9 |= 1; + gUnknown_03004330[gUnknown_02024A60] = nullsub_74; +} + +void sub_812071C(u8 taskId) +{ + u8 r9; + + if (gTasks[taskId].data[1] < 24) + { + gTasks[taskId].data[1]++; + return; + } + + r9 = gUnknown_02024A60; + gUnknown_02024A60 = gTasks[taskId].data[0]; + if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + gUnknown_02023A60[gUnknown_02024A60][1] = gUnknown_02024A6A[gUnknown_02024A60]; + sub_811F864(gUnknown_02024A60, 0); + } + else + { + gUnknown_02023A60[gUnknown_02024A60][1] = gUnknown_02024A6A[gUnknown_02024A60]; + sub_811F864(gUnknown_02024A60, 0); + gUnknown_02024A60 ^= 2; + gUnknown_02023A60[gUnknown_02024A60][1] = gUnknown_02024A6A[gUnknown_02024A60]; + sub_80318FC(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], gUnknown_02024A60); + sub_811F864(gUnknown_02024A60, 0); + gUnknown_02024A60 ^= 2; + } + gUnknown_03004330[gUnknown_02024A60] = sub_811DCA0; + gUnknown_02024A60 = r9; + DestroyTask(taskId); +} + +void dp01t_30_3_80EB11C(void) +{ + if (gUnknown_02023A60[gUnknown_02024A60][1] != 0 && battle_side_get_owner(gUnknown_02024A60) == 0) + { + dp01_tbl3_exec_completed(); + return; + } + + ewram17810[gUnknown_02024A60].unk0_0 = 1; + gUnknown_02024E68[gUnknown_02024A60] = sub_8044804( + gUnknown_02024A60, + (struct BattleInterfaceStruct2 *)&gUnknown_02023A60[gUnknown_02024A60][4], + gUnknown_02023A60[gUnknown_02024A60][1], + gUnknown_02023A60[gUnknown_02024A60][2]); + ewram17810[gUnknown_02024A60].unk5 = 0; + if (gUnknown_02023A60[gUnknown_02024A60][2] != 0) + ewram17810[gUnknown_02024A60].unk5 = 0x5D; + gUnknown_03004330[gUnknown_02024A60] = sub_81208E0; +} + +void sub_81208E0(void) +{ + if (ewram17810[gUnknown_02024A60].unk5++ >= 93) + { + ewram17810[gUnknown_02024A60].unk5 = 0; + dp01_tbl3_exec_completed(); + } +} + +void sub_8120920(void) +{ + if (ewram17810[gUnknown_02024A60].unk0_0) + gTasks[gUnknown_02024E68[gUnknown_02024A60]].func = sub_8044CA0; + dp01_tbl3_exec_completed(); +} + +void sub_812096C(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120978(void) +{ + if (sub_8078874(gUnknown_02024A60) != 0) + { + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].invisible = gUnknown_02023A60[gUnknown_02024A60][1]; + sub_8031F88(gUnknown_02024A60); + } + dp01_tbl3_exec_completed(); +} + +void sub_81209D8(void) +{ + if (mplay_80342A4(gUnknown_02024A60) == 0) + { + u8 r3 = gUnknown_02023A60[gUnknown_02024A60][1]; + u16 r4 = gUnknown_02023A60[gUnknown_02024A60][2] | (gUnknown_02023A60[gUnknown_02024A60][3] << 8); + u8 var = gUnknown_02024A60; + + if (move_anim_start_t3(var, var, var, r3, r4) != 0) + dp01_tbl3_exec_completed(); + else + gUnknown_03004330[gUnknown_02024A60] = sub_811E3B8; + } +} + +void sub_8120A40(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120A4C(void) +{ + dp01_tbl3_exec_completed(); +} + +void sub_8120A58(void) +{ + gUnknown_02024D26 = gUnknown_02023A60[gUnknown_02024A60][1]; + FadeOutMapMusic(5); + BeginFastPaletteFade(3); + dp01_tbl3_exec_completed(); + gUnknown_03004330[gUnknown_02024A60] = sub_811E29C; +} + +void nullsub_75(void) +{ +} diff --git a/src/battle_ai.c b/src/battle_ai.c index f10c6a013..dbd926000 100644 --- a/src/battle_ai.c +++ b/src/battle_ai.c @@ -269,7 +269,7 @@ void BattleAI_HandleItemUseBeforeAISetup(void) s32 i; u8 *data = (u8 *)UNK_2016A00_STRUCT; - for (i = 0; (u32)i < sizeof(struct UnknownStruct1); i++) + for (i = 0; (u32)i < sizeof(struct UnkBattleStruct1); i++) data[i] = 0; if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) diff --git a/src/daycare.c b/src/daycare.c index 92be45cfa..5bcbff6af 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1,5 +1,7 @@ #include "global.h" #include "pokemon.h" +#include "species.h" +#include "items.h" #include "string_util.h" #include "asm.h" @@ -34,67 +36,29 @@ u8 Daycare_CountPokemon(struct BoxPokemon *daycare_data) } #ifndef ASDF -__attribute__((naked)) -void sub_8041324(struct BoxPokemon * box_pokemon, void * void_pointer) +void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixing_UnknownStruct * void_pointer) { - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - mov r9, r0\n\ - mov r10, r1\n\ - movs r7, 0\n\ - movs r5, 0\n\ - mov r6, r10\n\ - adds r6, 0x74\n\ - movs r0, 0x1\n\ - mov r8, r0\n\ -_0804133E:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 4\n\ - mov r1, r9\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetBoxMonData\n\ - cmp r0, 0\n\ - beq _0804136E\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetBoxMonData\n\ - adds r1, r0, 0\n\ - cmp r1, 0\n\ - bne _0804136E\n\ - lsls r0, r5, 1\n\ - adds r0, r6, r0\n\ - b _08041374\n\ -_0804136E:\n\ - lsls r0, r5, 1\n\ - adds r0, r6, r0\n\ - mov r1, r8\n\ -_08041374:\n\ - strh r1, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x1\n\ - bls _0804133E\n\ - mov r0, r10\n\ - str r7, [r0, 0x70]\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); + u8 i; + u8 specCount; + specCount = 0; + for (i=0; i<2; i++) + { + if (GetBoxMonData(&box_pokemon[i], MON_DATA_SPECIES) != SPECIES_NONE) + { + specCount ++; + if (GetBoxMonData(&box_pokemon[i], MON_DATA_HELD_ITEM) == ITEM_NONE) + { + void_pointer->unk74[i] = 0; + } else + { + void_pointer->unk74[i] = 1; + } + } else + { + void_pointer->unk74[i] = 1; + } + } + void_pointer->unk70 = specCount; } #endif diff --git a/src/decoration_inventory.c b/src/decoration_inventory.c new file mode 100644 index 000000000..a483629b1 --- /dev/null +++ b/src/decoration_inventory.c @@ -0,0 +1,156 @@ +// +// Created by Scott Norton on 6/5/17. +// + +#include "global.h" +#include "sprite.h" +#include "task.h" +#include "decoration.h" +#include "decoration_inventory.h" + +void ClearDecorationInventory(u8 invIdx) +{ + u8 i; + for (i=0; i<gDecorationInventories[invIdx].size; i++) + { + gDecorationInventories[invIdx].items[i] = DECOR_NONE; + } +} + +void ClearDecorationInventories(void) +{ + u8 i; + for (i=0; i<8; i++) + { + ClearDecorationInventory(i); + } +} + +s8 sub_8133F9C(u8 invIdx) +{ + s8 i; + for (i=0; i<(s8)gDecorationInventories[invIdx].size; i++) + { + if (gDecorationInventories[invIdx].items[i] == DECOR_NONE) + { + return i; + } + } + return -1; +} + +bool8 sub_8133FE4(u8 decorIdx) +{ + u8 invIdx; + u8 i; + invIdx = gDecorations[decorIdx].decor_field_13; + for (i=0; i<gDecorationInventories[invIdx].size; i++) + { + if (gDecorationInventories[invIdx].items[i] == decorIdx) + { + return TRUE; + } + } + return FALSE; +} + +bool8 IsThereStorageSpaceForDecoration(u8 decorIdx) +{ + u8 invIdx; + s8 invSlot; + if (decorIdx == DECOR_NONE) + { + return FALSE; + } + invIdx = gDecorations[decorIdx].decor_field_13; + invSlot = sub_8133F9C(invIdx); + if (invSlot == -1) + { + return FALSE; + } + gDecorationInventories[invIdx].items[invSlot] = decorIdx; + return TRUE; +} + +bool8 sub_8134074(u8 decorIdx) +{ + u8 invIdx; + if (decorIdx == DECOR_NONE) + { + return FALSE; + } + invIdx = gDecorations[decorIdx].decor_field_13; + if (sub_8133F9C(invIdx) == -1) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_81340A8(u8 decorIdx) +{ + u8 i; + u8 invIdx; + i = 0; + if (decorIdx == DECOR_NONE) + { + return FALSE; + } + for (i=0; i<gDecorationInventories[gDecorations[decorIdx].decor_field_13].size; i++) + { + invIdx = gDecorations[decorIdx].decor_field_13; + if (gDecorationInventories[invIdx].items[i] == decorIdx) + { + gDecorationInventories[invIdx].items[i] = DECOR_NONE; + sub_8134104(invIdx); + return TRUE; + } + } + return FALSE; +} + +void sub_8134104(u8 invIdx) +{ + u8 i; + u8 j; + u8 tmp; + for (i=0; i<gDecorationInventories[invIdx].size; i++) + { + for (j=i+1; j<gDecorationInventories[invIdx].size; j++) + { + if (gDecorationInventories[invIdx].items[j] != 0 && (gDecorationInventories[invIdx].items[i] == DECOR_NONE || gDecorationInventories[invIdx].items[i] > gDecorationInventories[invIdx].items[j])) + { + tmp = gDecorationInventories[invIdx].items[i]; + gDecorationInventories[invIdx].items[i] = gDecorationInventories[invIdx].items[j]; + gDecorationInventories[invIdx].items[j] = tmp; + } + } + } +} + +u8 sub_8134194(u8 invIdx) +{ + u8 i; + u8 count; + count = 0; + for (i=0; i<gDecorationInventories[invIdx].size; i++) + { + if (gDecorationInventories[invIdx].items[i] != 0) + { + count++; + } + } + return count; +} + +u8 sub_81341D4(void) +{ + u8 i; + u8 count; + count = 0; + for (i=0; i<8; i++) + { + count += sub_8134194(i); + } + return count; +} diff --git a/src/field_effect.c b/src/field_effect.c index bbc1144c1..6cff8b864 100644..100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1,8 +1,26 @@ #include "global.h" -#include "field_effect.h" +#include "asm.h" +#include "data2.h" +#include "script.h" +#include "trig.h" +#include "main.h" #include "field_weather.h" +#include "decompress.h" #include "sprite.h" +#include "menu.h" +#include "palette.h" #include "text.h" +#include "rom4.h" +#include "task.h" +#include "sound.h" +#include "songs.h" +#include "decoration.h" +#include "field_player_avatar.h" +#include "field_map_obj_helpers.h" +#include "field_map_obj.h" +#include "metatile_behavior.h" +#include "field_camera.h" +#include "field_effect.h" typedef bool8 (*FldEffCmd)(u8 **, u32 *); @@ -207,3 +225,2830 @@ bool8 FieldEffectActiveListContains(u8 id) return TRUE; return FALSE; } + +u8 CreateTrainerSprite_BirchSpeech(u8 gender, s16 x, s16 y, u8 subpriority, u8 *buffer) +{ + struct SpriteTemplate spriteTemplate; + LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[gender], buffer); + LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[gender], buffer); + spriteTemplate.tileTag = gTrainerFrontPicTable[gender].tag; + spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[gender].tag; + spriteTemplate.oam = &gOamData_839F0F4; + spriteTemplate.anims = gDummySpriteAnimTable; + spriteTemplate.images = NULL; + spriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + spriteTemplate.callback = SpriteCallbackDummy; + return CreateSprite(&spriteTemplate, x, y, subpriority); +} + +void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) +{ + LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); + LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20); +} + +u8 CreateBirchSprite(s16 x, s16 y, u8 subpriority) +{ + LoadSpritePalette(&gUnknown_0839F114); + return CreateSprite(&gSpriteTemplate_839F128, x, y, subpriority); +} + +u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) +{ + DecompressPicFromTable_2(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, gUnknown_081FAF4C[3], gUnknown_081FAF4C[3], species); + LoadCompressedObjectPalette(&gMonPaletteTable[species]); + GetMonSpriteTemplate_803C56C(species, 3); + gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; + sub_807DE38(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); + return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); +} + +u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority) +{ + const struct SpritePalette *spritePalette; + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g); + spritePalette = sub_80409C8(species, d, g); + LoadCompressedObjectPalette(spritePalette); + GetMonSpriteTemplate_803C56C(species, 3); + gUnknown_02024E8C.paletteTag = spritePalette->tag; + sub_807DE38(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); +} + +void FreeResourcesAndDestroySprite(struct Sprite *sprite) +{ + sub_807DE68(); + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + if (sprite->oam.affineMode != 0) + { + FreeOamMatrix(sprite->oam.matrixNum); + } + DestroySprite(sprite); +} + +#undef NONMATCHING +#ifdef NONMATCHING +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed += (((0x1f - curRed) * r) >> 4); + curGreen += (((0x1f - curGreen) * g) >> 4); + curBlue += (((0x1f - curBlue) * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} + +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed -= ((curRed * r) >> 4); + curGreen -= ((curGreen * g) >> 4); + curBlue -= ((curBlue * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} +#else +__attribute__((naked)) +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D00 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r9, r5\n" + "\tmov r8, r4\n" + "\tmov r6, r8\n" + "\tands r6, r5\n" + "\tmov r8, r6\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 2\n" + "\tands r6, r4\n" + "\tlsrs r6, 5\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 7\n" + "\tands r4, r5\n" + "\tlsrs r4, 10\n" + "\tmov r7, r9\n" + "\tmov r5, r8\n" + "\tsubs r7, r5\n" + "\tmov r12, r7\n" + "\tmov r7, r12\n" + "\tmuls r7, r1\n" + "\tadds r1, r7, 0\n" + "\tasrs r1, 4\n" + "\tadd r8, r1\n" + "\tmov r5, r9\n" + "\tsubs r1, r5, r6\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tadds r6, r1\n" + "\tsubs r5, r4\n" + "\tmov r9, r5\n" + "\tmov r1, r9\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tadds r4, r1\n" + "\tmov r7, r8\n" + "\tlsls r7, 16\n" + "\tlsls r6, 21\n" + "\torrs r6, r7\n" + "\tlsls r4, 26\n" + "\torrs r4, r6\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D04 @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D00: .4byte gPlttBufferUnfaded\n" + "_08085D04: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} + +__attribute__((naked)) +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r6,lr}\n" + "\tmov r6, r8\n" + "\tpush {r6}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D78 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r8, r5\n" + "\tmov r6, r8\n" + "\tands r6, r4\n" + "\tmov r8, r6\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 2\n" + "\tands r5, r4\n" + "\tlsrs r5, 5\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 7\n" + "\tands r4, r6\n" + "\tlsrs r4, 10\n" + "\tmov r6, r8\n" + "\tmuls r6, r1\n" + "\tadds r1, r6, 0\n" + "\tasrs r1, 4\n" + "\tmov r6, r8\n" + "\tsubs r6, r1\n" + "\tadds r1, r5, 0\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tsubs r5, r1\n" + "\tadds r1, r4, 0\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tsubs r4, r1\n" + "\tlsls r6, 16\n" + "\tlsls r5, 21\n" + "\torrs r5, r6\n" + "\tlsls r4, 26\n" + "\torrs r4, r5\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D7C @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D78: .4byte gPlttBufferUnfaded\n" + "_08085D7C: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} +#endif + +void Task_PokecenterHeal(u8 taskId); +extern const void (*gUnknown_0839F268[4])(struct Task *); +u8 CreatePokeballGlowSprite(s16, s16, s16, u16); +u8 PokecenterHealEffectHelper(s16, s16); + +bool8 FldEff_PokecenterHeal(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x5d; + task->data[3] = 0x24; + task->data[4] = 0x7c; + task->data[5] = 0x18; + return FALSE; +} + +void Task_PokecenterHeal(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0839F268[task->data[0]](task); +} + +void PokecenterHealEffect_0(struct Task *task) +{ + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 1); + task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]); +} + +void PokecenterHealEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 1) + { + gSprites[task->data[7]].data0++; + task->data[0]++; + } +} + +void PokecenterHealEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 4) + { + task->data[0]++; + } +} + +void PokecenterHealEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL); + DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal)); + } +} + +void Task_HallOfFameRecord(u8 taskId); +extern const void (*gUnknown_0839F278[4])(struct Task *); +void HallOfFameRecordEffectHelper(s16, s16, s16, u8); + +bool8 FldEff_HallOfFameRecord(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x75; + task->data[3] = 0x34; + return FALSE; +} + +void Task_HallOfFameRecord(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0839F278[task->data[0]](task); +} + +void HallOfFameRecordEffect_0(struct Task *task) +{ + u8 taskId; + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 0); + taskId = FindTaskIdByFunc(Task_HallOfFameRecord); + HallOfFameRecordEffectHelper(taskId, 0x78, 0x18, 0); + HallOfFameRecordEffectHelper(taskId, 0x28, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0x48, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xa8, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1); +} + +void HallOfFameRecordEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 1) + { + task->data[15]++; // was this ever initialized? is this ever used? + task->data[0]++; + } +} + +void HallOfFameRecordEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 4) + { + task->data[0]++; + } +} + +void HallOfFameRecordEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD); + DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); + } +} + +void SpriteCB_PokeballGlowEffect(struct Sprite *); +extern const void (*gUnknown_0839F288[8])(struct Sprite *); +extern const struct SpriteTemplate gSpriteTemplate_839F208; +extern const struct SpriteTemplate gSpriteTemplate_839F220; +extern const struct SpriteTemplate gSpriteTemplate_839F238; +extern const struct SpriteTemplate gSpriteTemplate_839F250; +extern const struct SubspriteTable gUnknown_0839F1A0; +extern const struct SubspriteTable gUnknown_0839F1C8; +extern const struct Coords16 gUnknown_0839F2A8[6]; + +u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect); + sprite = &gSprites[spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + sprite->data5 = data5; + sprite->data6 = data6; + sprite->data7 = spriteId; + return spriteId; +} + +void SpriteCB_PokeballGlowEffect(struct Sprite *sprite) +{ + gUnknown_0839F288[sprite->data0](sprite); +} + +void PokeballGlowEffect_0(struct Sprite *sprite) +{ + u8 endSpriteId; + if (sprite->data1 == 0 || (--sprite->data1) == 0) + { + sprite->data1 = 25; + endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_839F208, gUnknown_0839F2A8[sprite->data2].x + sprite->pos2.x, gUnknown_0839F2A8[sprite->data2].y + sprite->pos2.y, 0); + gSprites[endSpriteId].oam.priority = 2; + gSprites[endSpriteId].data0 = sprite->data7; + sprite->data2++; + sprite->data6--; + PlaySE(SE_BOWA); + } + if (sprite->data6 == 0) + { + sprite->data1 = 32; + sprite->data0++; + } +} + +extern const u8 gUnknown_0839F2C0[4]; // red +extern const u8 gUnknown_0839F2C4[4]; // green +extern const u8 gUnknown_0839F2C8[4]; // blue + +void PokeballGlowEffect_1(struct Sprite *sprite) +{ + if ((--sprite->data1) == 0) + { + sprite->data0++; + sprite->data1 = 8; + sprite->data2 = 0; + sprite->data3 = 0; + if (sprite->data5) + { + PlayFanfare(BGM_ME_ASA); + } + } +} + +void PokeballGlowEffect_2(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data1) == 0) + { + sprite->data1 = 8; + sprite->data2++; + sprite->data2 &= 3; + if (sprite->data2 == 0) + { + sprite->data3++; + } + } + phase = (sprite->data2 + 3) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = (sprite->data2 + 2) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = (sprite->data2 + 1) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = sprite->data2; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + if (sprite->data3 > 2) + { + sprite->data0++; + sprite->data1 = 8; + sprite->data2 = 0; + } +} + +void PokeballGlowEffect_3(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data1) == 0) + { + sprite->data1 = 8; + sprite->data2++; + sprite->data2 &= 3; + if (sprite->data2 == 3) + { + sprite->data0++; + sprite->data1 = 30; + } + } + phase = sprite->data2; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); +} + +void PokeballGlowEffect_4(struct Sprite *sprite) +{ + if ((--sprite->data1) == 0) + { + sprite->data0++; + } +} + +void PokeballGlowEffect_5(struct Sprite *sprite) +{ + sprite->data0++; +} + +void PokeballGlowEffect_6(struct Sprite *sprite) +{ + if (sprite->data5 == 0 || IsFanfareTaskInactive()) + { + sprite->data0++; + } +} + +void PokeballGlowEffect_7(struct Sprite *sprite) +{ +} + +void SpriteCB_PokeballGlow(struct Sprite *sprite) +{ + if (gSprites[sprite->data0].data0 > 4) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +u8 PokecenterHealEffectHelper(s16 x, s16 y) +{ + u8 spriteIdAtEnd; + struct Sprite *sprite; + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F220, x, y, 0); + sprite = &gSprites[spriteIdAtEnd]; + sprite->oam.priority = 2; + sprite->invisible = 1; + SetSubspriteTables(sprite, &gUnknown_0839F1A0); + return spriteIdAtEnd; +} + +void SpriteCB_PokecenterMonitor(struct Sprite *sprite) +{ + if (sprite->data0 != 0) + { + sprite->data0 = 0; + sprite->invisible = 0; + StartSpriteAnim(sprite, 1); + } + if (sprite->animEnded) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3) +{ + u8 spriteIdAtEnd; + if (!a3) + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F238, a1, a2, 0); + SetSubspriteTables(&gSprites[spriteIdAtEnd], &gUnknown_0839F1C8); + } else + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F250, a1, a2, 0); + } + gSprites[spriteIdAtEnd].invisible = 1; + gSprites[spriteIdAtEnd].data0 = a0; +} + +void SpriteCB_HallOfFameMonitor(struct Sprite *sprite) +{ + if (gTasks[sprite->data0].data[15]) + { + if (sprite->data1 == 0 || (--sprite->data1) == 0) + { + sprite->data1 = 16; + sprite->invisible ^= 1; + } + sprite->data2++; + } + if (sprite->data2 > 127) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +void mapldr_080842E8(void); +void mapldr_08084390(void); +void task00_8084310(u8); +void c3_080843F8(u8); + +void sub_80865BC(void) +{ + SetMainCallback2(c2_exit_to_overworld_2_switch); + gUnknown_0300485C = mapldr_080842E8; +} + +void mapldr_080842E8(void) +{ + pal_fill_black(); + CreateTask(task00_8084310, 0); + ScriptContext2_Enable(); + FreezeMapObjects(); + gUnknown_0300485C = NULL; +} + +void task00_8084310(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (!task->data[0]) + { + if (!sub_807D770()) + { + return; + } + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; + if ((int)gUnknown_0202FF84[0] > 5) + { + gUnknown_0202FF84[0] = 0; + } + FieldEffectStart(FLDEFF_USE_FLY); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_USE_FLY)) + { + flag_var_implications_of_teleport_(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gUnknown_0300485C = mapldr_08084390; + DestroyTask(taskId); + } +} + +void mapldr_08084390(void) +{ + sub_8053E90(); + pal_fill_black(); + CreateTask(c3_080843F8, 0); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + if (gPlayerAvatar.flags & 0x08) + { + FieldObjectTurn(&gMapObjects[gPlayerAvatar.mapObjectId], DIR_WEST); + } + ScriptContext2_Enable(); + FreezeMapObjects(); + gUnknown_0300485C = NULL; +} + +void c3_080843F8(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (task->data[0] == 0) + { + if (gPaletteFade.active) + { + return; + } + FieldEffectStart(FLDEFF_FLY_IN); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_FLY_IN)) + { + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(taskId); + } +} + +extern void pal_fill_for_map_transition(void); +void sub_8086774(u8); +extern const bool8 (*gUnknown_0839F2CC[7])(struct Task *); +extern void CameraObjectReset2(void); +extern void CameraObjectReset1(void); + +void sub_8086748(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + CreateTask(sub_8086774, 0); + gUnknown_0300485C = NULL; +} + +void sub_8086774(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F2CC[task->data[0]](task)); // return code signifies whether to continue blocking here +} + +bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] +{ + struct MapObject *playerObject; + struct Sprite *playerSprite; + playerObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + playerSprite = &gSprites[gPlayerAvatar.spriteId]; + CameraObjectReset2(); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + gPlayerAvatar.unk6 = 1; + FieldObjectSetSpecialAnim(playerObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); + task->data[4] = playerSprite->subspriteMode; + playerObject->mapobj_bit_26 = 1; + playerSprite->oam.priority = 1; + playerSprite->subspriteMode = 2; + task->data[0]++; + return TRUE; +} + +bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] +{ + if (sub_807D770()) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); + task->data[1] = 1; + task->data[2] = 0; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; + PlaySE(SE_RU_HYUU); + task->data[0]++; + return FALSE; +} + +bool8 sub_80868E4(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y += task->data[1]; + if (task->data[1] < 8) + { + task->data[2] += task->data[1]; + if (task->data[2] & 0xf) + { + task->data[1] <<= 1; + } + } + if (task->data[3] == 0 && sprite->pos2.y >= -16) + { + task->data[3]++; + mapObject->mapobj_bit_26 = 0; + sprite->subspriteMode = task->data[4]; + mapObject->mapobj_bit_2 = 1; + } + if (sprite->pos2.y >= 0) + { + PlaySE(SE_W070); + mapObject->mapobj_bit_3 = 1; + mapObject->mapobj_bit_5 = 1; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_808699C(struct Task *task) +{ + task->data[0]++; + task->data[1] = 4; + task->data[2] = 0; + SetCameraPanningCallback(NULL); + return TRUE; +} + +bool8 sub_80869B8(struct Task *task) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if ((task->data[2] & 3) == 0) + { + task->data[1] >>= 1; + } + if (task->data[1] == 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80869F8(struct Task *task) +{ + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeMapObjects(); + InstallCameraPanAheadCallback(); + DestroyTask(FindTaskIdByFunc(sub_8086774)); + return FALSE; +} + +void sub_8086A68(u8); +extern const bool8 (*gUnknown_0839F2E8[6])(struct Task *); +extern const bool8 (*gUnknown_0839F300[7])(struct Task *); +extern void sub_80B4824(u8); +extern void sub_8053FF8(void); +extern void fade_8080918(void); + +void sub_8086B98(struct Task *); +void sub_8086BE4(struct Task *); +void sub_8086C30(void); +void sub_8086C40(void); +bool8 sub_8054034(void); +void sub_8086C94(void); +void sub_80B483C(void); +void sub_8086CBC(u8); + +void sub_8086A2C(u8 a0, u8 priority) +{ + u8 taskId; + taskId = CreateTask(sub_8086A68, priority); + gTasks[taskId].data[1] = 0; + if (a0 == 0x6a) + { + gTasks[taskId].data[1] = 1; + } +} + +void sub_8086A68(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F2E8[task->data[0]](task)); +} + +bool8 sub_8086AA0(struct Task *task) +{ + FreezeMapObjects(); + CameraObjectReset2(); + sub_80B4824(task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086AC0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); + task->data[0]++; + task->data[2] = 0; + task->data[3] = 0; + if ((u8)task->data[1] == 0) + { + task->data[0] = 4; + } + PlaySE(SE_ESUKA); + } + return FALSE; +} + +bool8 sub_8086B30(struct Task *task) +{ + sub_8086B98(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B54(struct Task *task) +{ + sub_8086B98(task); + sub_8086C40(); + return FALSE; +} + +bool8 sub_8086B64(struct Task *task) +{ + sub_8086BE4(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B88(struct Task *task) +{ + sub_8086BE4(task); + sub_8086C40(); + return FALSE; +} + +void sub_8086B98(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[2]); + sprite->pos2.y = Sin(0x94, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +void sub_8086BE4(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[2]); + sprite->pos2.y = Sin(0x76, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +void sub_8086C30(void) +{ + sub_8053FF8(); + fade_8080918(); +} + +void sub_8086C40(void) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + sub_80B483C(); + warp_in(); + gUnknown_0300485C = sub_8086C94; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_8086A68)); + } +} + +void sub_8086C94(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + CreateTask(sub_8086CBC, 0); + gUnknown_0300485C = NULL; +} + +void sub_8086CBC(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F300[task->data[0]](task)); +} + +bool8 sub_8086CF4(struct Task *task) +{ + struct MapObject *mapObject; + s16 x; + s16 y; + u8 behavior; + CameraObjectReset2(); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(DIR_EAST)); + PlayerGetDestCoords(&x, &y); + behavior = MapGridGetMetatileBehaviorAt(x, y); + task->data[0]++; + task->data[1] = 16; + if (behavior == 0x6b) + { + behavior = 1; + task->data[0] = 3; + } else + { + behavior = 0; + } + sub_80B4824(behavior); + return TRUE; +} + +bool8 sub_8086D70(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086DB0(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0] = 5; + } + return FALSE; +} + +bool8 sub_8086E10(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086E50(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +extern bool8 sub_80B4850(void); + +bool8 sub_8086EB0(struct Task *task) +{ + if (sub_80B4850()) + { + return FALSE; + } + sub_80B483C(); + task->data[0]++; + return TRUE; +} + +bool8 sub_8086ED4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + CameraObjectReset1(); + ScriptContext2_Disable(); + FieldObjectSetSpecialAnim(mapObject, GetGoSpeed0AnimId(DIR_EAST)); + DestroyTask(FindTaskIdByFunc(sub_8086CBC)); + } + return FALSE; +} + +void sub_8086F64(u8); +extern const bool8 (*gUnknown_0839F31C[5])(struct Task *, struct MapObject *); + +bool8 FldEff_UseWaterfall(void) +{ + u8 taskId; + taskId = CreateTask(sub_8086F64, 0xff); + gTasks[taskId].data[1] = gUnknown_0202FF84[0]; + sub_8086F64(taskId); + return FALSE; +} + +void sub_8086F64(u8 taskId) +{ + while (gUnknown_0839F31C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])); +} + +bool8 sub_8086FB0(struct Task *task, struct MapObject *mapObject) +{ + ScriptContext2_Enable(); + gPlayerAvatar.unk6 = 1; + task->data[0]++; + return FALSE; +} + +bool8 waterfall_1_do_anim_probably(struct Task *task, struct MapObject *mapObject) +{ + ScriptContext2_Enable(); + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) + { + FieldObjectClearAnimIfSpecialAnimFinished(mapObject); + gUnknown_0202FF84[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } + return FALSE; +} + +bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct MapObject *mapObject) +{ + if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + return FALSE; + } + task->data[0]++; + return TRUE; +} + +bool8 sub_8087030(struct Task *task, struct MapObject *mapObject) +{ + FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(DIR_NORTH)); + task->data[0]++; + return FALSE; +} + +bool8 sub_8087058(struct Task *task, struct MapObject *mapObject) +{ + if (!FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + return FALSE; + } + if (MetatileBehavior_IsWaterfall(mapObject->mapobj_unk_1E)) + { + task->data[0] = 3; + return TRUE; + } + ScriptContext2_Disable(); + gPlayerAvatar.unk6 = 0; + DestroyTask(FindTaskIdByFunc(sub_8086F64)); + FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); + return FALSE; +} + +void Task_Dive(u8); +extern const bool8 (*gUnknown_0839F330[3])(struct Task *); +extern int dive_warp(struct MapPosition *, u16); + +bool8 FldEff_UseDive(void) +{ + u8 taskId; + taskId = CreateTask(Task_Dive, 0xff); + gTasks[taskId].data[15] = gUnknown_0202FF84[0]; + gTasks[taskId].data[14] = gUnknown_0202FF84[1]; + Task_Dive(taskId); + return FALSE; +} + +void Task_Dive(u8 taskId) +{ + while (gUnknown_0839F330[gTasks[taskId].data[0]](&gTasks[taskId])); +} + +bool8 sub_8087124(struct Task *task) +{ + gPlayerAvatar.unk6 = 1; + task->data[0]++; + return FALSE; +} + +bool8 dive_2_unknown(struct Task *task) +{ + ScriptContext2_Enable(); + gUnknown_0202FF84[0] = task->data[15]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + return FALSE; +} + +bool8 dive_3_unknown(struct Task *task) +{ + struct MapPosition mapPosition; + PlayerGetDestCoords(&mapPosition.x, &mapPosition.y); + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + dive_warp(&mapPosition, gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E); + DestroyTask(FindTaskIdByFunc(Task_Dive)); + FieldEffectActiveListRemove(FLDEFF_USE_DIVE); + } + return FALSE; +} + +void sub_80871D0(u8); +extern const bool8 (*gUnknown_0839F33C[6])(struct Task *, struct MapObject *, struct Sprite *); +void mapldr_080851BC(void); + +void sub_80871B8(u8 priority) +{ + CreateTask(sub_80871D0, priority); +} + +void sub_80871D0(u8 taskId) +{ + while (gUnknown_0839F33C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_808722C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + FreezeMapObjects(); + CameraObjectReset2(); + SetCameraPanningCallback(NULL); + gPlayerAvatar.unk6 = 1; + mapObject->mapobj_bit_26 = 1; + task->data[1] = 1; + task->data[0]++; + return TRUE; +} + +bool8 sub_8087264(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if (task->data[2] > 7) + { + task->data[2] = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8087298(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->pos2.y = 0; + task->data[3] = 1; + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP); + PlaySE(SE_W153); + task->data[0]++; + return TRUE; +} + +bool8 sub_80872E4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + s16 centerToCornerVecY; + SetCameraPanning(0, task->data[1]); + if (task->data[1] = -task->data[1], ++task->data[2] <= 17) + { + if (!(task->data[2] & 1) && (task->data[1] <= 3)) + { + task->data[1] <<= 1; + } + } else if (!(task->data[2] & 4) && (task->data[1] > 0)) + { + task->data[1] >>= 1; + } + if (task->data[2] > 6) + { + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + if (sprite->pos2.y > -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY)) + { + sprite->pos2.y -= task->data[3]; + if (task->data[3] <= 7) + { + task->data[3]++; + } + } else + { + task->data[4] = 1; + } + } + if (task->data[5] == 0 && sprite->pos2.y < -0x10) + { + task->data[5]++; + mapObject->mapobj_bit_26 = 1; + sprite->oam.priority = 1; + sprite->subspriteMode = 2; + } + if (task->data[1] == 0 && task->data[4] != 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80873D8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8053FF8(); + fade_8080918(); + task->data[0]++; + return FALSE; +} + +bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + warp_in(); + gUnknown_0300485C = mapldr_080851BC; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80871D0)); + } + return FALSE; +} + +void sub_8087470(u8); +extern const bool8 (*gUnknown_0839F354[4])(struct Task *, struct MapObject *, struct Sprite *); +extern u8 sub_80608A4(u8); + +void mapldr_080851BC(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + gUnknown_0300485C = NULL; + CreateTask(sub_8087470, 0); +} + +void sub_8087470(u8 taskId) +{ + while (gUnknown_0839F354[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + CameraObjectReset2(); + FreezeMapObjects(); + gPlayerAvatar.unk6 = 1; + mapObject->mapobj_bit_13 = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_807D770()) + { + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8087548(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite = &gSprites[task->data[1]]; + if (sprite->animCmdIndex > 1) + { + task->data[0]++; + mapObject->mapobj_bit_13 = 0; + CameraObjectReset1(); + PlaySE(SE_W091); + FieldObjectSetSpecialAnim(mapObject, sub_80608A4(DIR_EAST)); + } + return FALSE; +} + +bool8 sub_808759C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087470)); + } + return FALSE; +} + +extern void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy); +extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]; + +u8 FldEff_LavaridgeGymWarp(void) +{ + u8 spriteId; + sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); + gSprites[spriteId].oam.priority = gUnknown_0202FF84[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_8087638(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP); + } +} + +void sub_808766C(u8); +extern const bool8 (*gUnknown_0839F364[5])(struct Task *, struct MapObject *, struct Sprite *); + +void sub_8087654(u8 priority) +{ + CreateTask(sub_808766C, priority); +} + +void sub_808766C(u8 taskId) +{ + while(gUnknown_0839F364[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80876C8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + FreezeMapObjects(); + CameraObjectReset2(); + gPlayerAvatar.unk6 = 1; + mapObject->mapobj_bit_26 = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80876F8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + if (task->data[1] > 3) + { + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } else + { + task->data[1]++; + FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); + PlaySE(SE_FU_ZUZUZU); + } + } + return FALSE; +} + +bool8 sub_8087774(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gSprites[task->data[1]].animCmdIndex == 2) + { + mapObject->mapobj_bit_13 = 1; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80877AC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) + { + sub_8053FF8(); + fade_8080918(); + task->data[0]++; + } + return FALSE; +} + +void sub_80878C4(u8); +extern u8 gUnknown_0839F380[5]; +extern const void (*gUnknown_0839F378[2])(struct Task *); +void mapldr_080859D4(void); + +bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + warp_in(); + gUnknown_0300485C = sub_8086748; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_808766C)); + } + return FALSE; +} + +u8 FldEff_PopOutOfAsh(void) +{ + u8 spriteId; + sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); + gSprites[spriteId].oam.priority = gUnknown_0202FF84[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_808788C(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH); + } +} + +void sub_80878A8(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + CreateTask(sub_80878C4, 0x50); +} + +void sub_80878C4(u8 taskId) +{ + gUnknown_0839F378[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80878F4(struct Task *task) +{ + task->data[0]++; + task->data[14] = 64; + task->data[15] = player_get_direction_lower_nybble(); +} + +void sub_8087914(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + if (task->data[14] != 0 && (--task->data[14]) == 0) + { + sub_8053FF8(); + fade_8080918(); + } + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + if (task->data[14] == 0 && !gPaletteFade.active && sub_8054034() == TRUE) + { + FieldObjectSetDirection(mapObject, task->data[15]); + sub_8053678(); + warp_in(); + gUnknown_0300485C = mapldr_080859D4; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80878C4)); + } else if (task->data[1] == 0 || (--task->data[1]) == 0) + { + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); + if (task->data[2] < 12) + { + task->data[2]++; + } + task->data[1] = 8 >> (task->data[2] >> 2); + } + } +} + +void sub_8087A74(u8); +extern const void (*gUnknown_0839F388[2])(struct Task *); + +void mapldr_080859D4(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + gUnknown_0300485C = NULL; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + CreateTask(sub_8087A74, 0); +} + +void sub_8087A74(u8 taskId) +{ + gUnknown_0839F388[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087AA4(struct Task *task) +{ + if (sub_807D770()) + { + task->data[0]++; + task->data[15] = player_get_direction_lower_nybble(); + } +} + +void sub_8087AC8(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) && !FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + return; + } + if (task->data[2] >= 32 && task->data[15] == player_get_direction_lower_nybble()) + { + mapObject->mapobj_bit_13 = 0; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087A74)); + return; + } + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); + if (task->data[2] < 32) + { + task->data[2]++; + } + task->data[1] = task->data[2] >> 2; + } + mapObject->mapobj_bit_13 ^= 1; +} + +void sub_8087BBC(u8); +extern const void (*gUnknown_0839F390[4])(struct Task *); +void mapldr_08085D88(void); + +void sub_8087BA8(void) +{ + CreateTask(sub_8087BBC, 0); +} + +void sub_8087BBC(u8 taskId) +{ + gUnknown_0839F390[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087BEC(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + CameraObjectReset2(); + task->data[15] = player_get_direction_lower_nybble(); + task->data[0]++; +} + +void sub_8087C14(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + task->data[1] = 8; + task->data[2]++; + } + if (task->data[2] > 7 && task->data[15] == mapObject->mapobj_unk_18) + { + task->data[0]++; + task->data[1] = 4; + task->data[2] = 8; + task->data[3] = 1; + PlaySE(SE_TK_WARPIN); + } +} + +void sub_8087CA4(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((--task->data[1]) <= 0) + { + task->data[1] = 4; + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + } + sprite->pos1.y -= task->data[3]; + task->data[4] += task->data[3]; + if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8)) + { + task->data[3] <<= 1; + } + if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != 0)) + { + sprite->subspriteMode = 2; + } + if (task->data[4] >= 0xa8) + { + task->data[0]++; + sub_8053FF8(); + fade_8080918(); + } +} + +void sub_8087D78(struct Task *task) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + sub_8053570(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gUnknown_0300485C = mapldr_08085D88; + DestroyTask(FindTaskIdByFunc(sub_8087BBC)); + } +} + +void sub_8087E1C(u8); +extern const void (*gUnknown_0839F3A0[3])(struct Task *); + +void mapldr_08085D88(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + gUnknown_0300485C = NULL; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + CameraObjectReset2(); + CreateTask(sub_8087E1C, 0); +} + +void sub_8087E1C(u8 taskId) +{ + gUnknown_0839F3A0[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087E4C(struct Task *task) +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + if (sub_807D770()) + { + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; + task->data[0]++; + task->data[1] = 8; + task->data[2] = 1; + task->data[14] = sprite->subspriteMode; + task->data[15] = player_get_direction_lower_nybble(); + PlaySE(SE_TK_WARPIN); + } +} + +void sub_8087ED8(struct Task *task) +{ + u8 unknown_0839F380[5]; + struct MapObject *mapObject; + struct Sprite *sprite; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((sprite->pos2.y += task->data[1]) >= -8) + { + if (task->data[13] == 0) + { + task->data[13]++; + mapObject->mapobj_bit_2 = 1; + sprite->subspriteMode = task->data[14]; + } + } else + { + sprite->oam.priority = 1; + if (sprite->subspriteMode != 0) + { + sprite->subspriteMode = 2; + } + } + if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1)) + { + task->data[1]--; + } + if ((--task->data[2]) == 0) + { + task->data[2] = 4; + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + } + if (sprite->pos2.y >= 0) + { + sprite->pos2.y = 0; + task->data[0]++; + task->data[1] = 1; + task->data[2] = 0; + } +} + +void sub_8087FDC(struct Task *task) +{ + u8 unknown_0839F380[5]; + struct MapObject *mapObject; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if ((--task->data[1]) == 0) + { + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + task->data[1] = 8; + if ((++task->data[2]) > 4 && task->data[14] == mapObject->mapobj_unk_18) + { + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087E1C)); + } + } +} + +void sub_8088120(u8); +void sub_808847C(u8); +u8 sub_8088830(u32, u32, u32); +extern const void (*gUnknown_0839F3AC[7])(struct Task *); +extern const void (*gUnknown_0839F3C8[7])(struct Task *); +extern const u32 gFieldMoveStreaksTiles[0x200]; +extern const u16 gFieldMoveStreaksPalette[16]; +extern const u16 gFieldMoveStreaksTilemap[10 * 32]; +extern const u32 gDarknessFieldMoveStreaksTiles[0x80]; +extern const u16 gDarknessFieldMoveStreaksPalette[16]; +extern const u16 gDarknessFieldMoveStreaksTilemap[10 * 32]; +void sub_80883DC(void); +void sub_808843C(u16); +void sub_8088890(struct Sprite *); + +bool8 FldEff_FieldMoveShowMon(void) +{ + u8 taskId; + if (is_light_level_1_2_3_5_or_6(sav1_map_get_light_level()) == TRUE) + { + taskId = CreateTask(sub_8088120, 0xff); + } else + { + taskId = CreateTask(sub_808847C, 0xff); + } + gTasks[taskId].data[15] = sub_8088830(gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); + return FALSE; +} + +bool8 FldEff_FieldMoveShowMonInit(void) +{ + struct Pokemon *pokemon; + u32 flag = gUnknown_0202FF84[0] & 0x80000000; + pokemon = &gPlayerParty[(u8)gUnknown_0202FF84[0]]; + gUnknown_0202FF84[0] = GetMonData(pokemon, MON_DATA_SPECIES); + gUnknown_0202FF84[1] = GetMonData(pokemon, MON_DATA_OT_ID); + gUnknown_0202FF84[2] = GetMonData(pokemon, MON_DATA_PERSONALITY); + gUnknown_0202FF84[0] |= flag; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + return FALSE; +} + +void sub_8088120(u8 taskId) +{ + gUnknown_0839F3AC[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088150(struct Task *task) +{ + task->data[11] = REG_WININ; + task->data[12] = REG_WINOUT; + StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback); + task->data[1] = 0xf0f1; + task->data[2] = 0x5051; + task->data[3] = 0x3f; + task->data[4] = 0x3e; + REG_WIN0H = task->data[1]; + REG_WIN0V = task->data[2]; + REG_WININ = task->data[3]; + REG_WINOUT = task->data[4]; + SetVBlankCallback(sub_80883DC); + task->data[0]++; +} + +void sub_80881C0(struct Task *task) +{ + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + CpuCopy16(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x200); + CpuFill32(0, (void *)(VRAM + delta), 0x800); + LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20); + sub_808843C(delta); + task->data[0]++; +} + +void sub_8088228(struct Task *task) +{ + s16 v0; + s16 v2; + s16 v3; + task->data[5] -= 16; + v0 = ((u16)task->data[1] >> 8); + v2 = ((u16)task->data[2] >> 8); + v3 = ((u16)task->data[2] & 0xff); + v0 -= 16; + v2 -= 2; + v3 += 2; + if (v0 < 0) + { + v0 = 0; + } + if (v2 < 0x28) + { + v2 = 0x28; + } + if (v3 > 0x78) + { + v3 = 0x78; + } + task->data[1] = (v0 << 8) | (task->data[1] & 0xff); + task->data[2] = (v2 << 8) | v3; + if (v0 == 0 && v2 == 0x28 && v3 == 0x78) + { + gSprites[task->data[15]].callback = sub_8088890; + task->data[0]++; + } +} + +void sub_80882B4(struct Task *task) +{ + task->data[5] -= 16; + if (gSprites[task->data[15]].data7) + { + task->data[0]++; + } +} + +void sub_80882E4(struct Task *task) +{ + s16 v2; + s16 v3; + task->data[5] -= 16; + v2 = (task->data[2] >> 8); + v3 = (task->data[2] & 0xff); + v2 += 6; + v3 -= 6; + if (v2 > 0x50) + { + v2 = 0x50; + } + if (v3 < 0x51) + { + v3 = 0x51; + } + task->data[2] = (v2 << 8) | v3; + if (v2 == 0x50 && v3 == 0x51) + { + task->data[0]++; + } +} + +void sub_8088338(struct Task *task) +{ + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + task->data[1] = 0xf1; + task->data[2] = 0xa1; + task->data[3] = task->data[11]; + task->data[4] = task->data[12]; + task->data[0]++; +} + +void sub_8088380(struct Task *task) +{ + IntrCallback callback; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + SetVBlankCallback(callback); + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowConfig_81E6CE4); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_8088120)); +} + +void sub_80883DC(void) +{ + struct Task *task; + IntrCallback callback; + task = &gTasks[FindTaskIdByFunc(sub_8088120)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + callback(); + REG_WIN0H = task->data[1]; + REG_WIN0V = task->data[2]; + REG_WININ = task->data[3]; + REG_WINOUT = task->data[4]; + REG_BG0HOFS = task->data[5]; + REG_BG0VOFS = task->data[6]; +} + +void sub_808843C(u16 offs) +{ + u16 i; + u16 *dest; + dest = (u16 *)(VRAM + 0x140 + offs); + for (i=0; i<0x140; i++, dest++) + { + *dest = gFieldMoveStreaksTilemap[i] | 0xf000; + } +} + +void sub_80886B0(void); +bool8 sub_8088708(struct Task *); +void sub_80886F8(struct Task *); +bool8 sub_80887C0(struct Task *); + +void sub_808847C(u8 taskId) +{ + gUnknown_0839F3C8[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80884AC(struct Task *task) +{ + REG_BG0HOFS = task->data[1]; + REG_BG0VOFS = task->data[2]; + StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); + SetVBlankCallback(sub_80886B0); + task->data[0]++; +} + +void sub_80884E8(struct Task *task) +{ + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + task->data[12] = delta; + CpuCopy16(gDarknessFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x80); + CpuFill32(0, (void *)(VRAM + delta), 0x800); + LoadPalette(gDarknessFieldMoveStreaksPalette, 0xf0, 0x20); + task->data[0]++; +} + +void sub_8088554(struct Task *task) +{ + if (sub_8088708(task)) + { + REG_WIN1H = 0x00f0; + REG_WIN1V = 0x2878; + gSprites[task->data[15]].callback = sub_8088890; + task->data[0]++; + } + sub_80886F8(task); +} + +void sub_80885A8(struct Task *task) +{ + sub_80886F8(task); + if (gSprites[task->data[15]].data7) + { + task->data[0]++; + } +} + +void sub_80885D8(struct Task *task) +{ + sub_80886F8(task); + task->data[3] = task->data[1] & 7; + task->data[4] = 0; + REG_WIN1H = 0xffff; + REG_WIN1V = 0xffff; + task->data[0]++; +} + +void sub_808860C(struct Task *task) +{ + sub_80886F8(task); + if (sub_80887C0(task)) + { + task->data[0]++; + } +} + +void sub_808862C(struct Task *task) +{ + IntrCallback intrCallback; + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + SetVBlankCallback(intrCallback); + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowConfig_81E6CE4); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_808847C)); +} + +void sub_80886B0(void) +{ + IntrCallback intrCallback; + struct Task *task; + task = &gTasks[FindTaskIdByFunc(sub_808847C)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + intrCallback(); + REG_BG0HOFS = task->data[1]; + REG_BG0VOFS = task->data[2]; +} + +void sub_80886F8(struct Task *task) +{ + task->data[1] -= 16; + task->data[3] += 16; +} + +#ifdef NONMATCHING +bool8 sub_8088708(struct Task *task) +{ + u16 i; + u16 srcOffs; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = (task->data[3] >> 3) & 0x1f; + if (dstOffs >= task->data[4]) + { + dstOffs = (32 - dstOffs) & 0x1f; + srcOffs = (32 - task->data[4]) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = gDarknessFieldMoveStreaksTilemap[srcOffs + i * 32] | 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = gDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} +#else +__attribute__((naked)) +bool8 sub_8088708(struct Task *task) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x4\n" + "\tadds r5, r0, 0\n" + "\tldrh r2, [r5, 0x10]\n" + "\tmovs r1, 0x10\n" + "\tldrsh r0, [r5, r1]\n" + "\tcmp r0, 0x1F\n" + "\tble _08088724\n" + "\tmovs r0, 0x1\n" + "\tb _080887A8\n" + "_08088724:\n" + "\tldrh r0, [r5, 0xE]\n" + "\tlsls r0, 16\n" + "\tasrs r3, r0, 19\n" + "\tmovs r1, 0x1F\n" + "\tands r3, r1\n" + "\tmovs r4, 0x10\n" + "\tldrsh r0, [r5, r4]\n" + "\tcmp r3, r0\n" + "\tblt _080887A6\n" + "\tmovs r0, 0x20\n" + "\tsubs r3, r0, r3\n" + "\tands r3, r1\n" + "\tsubs r0, r2\n" + "\tmov r12, r0\n" + "\tmov r7, r12\n" + "\tands r7, r1\n" + "\tmov r12, r7\n" + "\tldrh r0, [r5, 0x20]\n" + "\tldr r1, _080887B8 @ =0x06000140\n" + "\tadds r1, r0\n" + "\tmov r8, r1\n" + "\tmovs r4, 0\n" + "\tldr r7, _080887BC @ =gDarknessFieldMoveStreaksTilemap\n" + "\tmov r10, r7\n" + "\tmovs r0, 0xF0\n" + "\tlsls r0, 8\n" + "\tmov r9, r0\n" + "\tadds r1, r3, 0x1\n" + "\tmovs r0, 0x1F\n" + "\tands r1, r0\n" + "\tstr r1, [sp]\n" + "\tmov r6, r12\n" + "\tadds r6, 0x1\n" + "\tands r6, r0\n" + "_08088768:\n" + "\tlsls r1, r4, 5\n" + "\tadds r2, r1, r3\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tmov r7, r12\n" + "\tadds r0, r7, r1\n" + "\tlsls r0, 1\n" + "\tadd r0, r10\n" + "\tldrh r0, [r0]\n" + "\tmov r7, r9\n" + "\torrs r0, r7\n" + "\tstrh r0, [r2]\n" + "\tldr r0, [sp]\n" + "\tadds r2, r1, r0\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tadds r1, r6, r1\n" + "\tlsls r1, 1\n" + "\tadd r1, r10\n" + "\tldrh r0, [r1]\n" + "\tmov r1, r9\n" + "\torrs r0, r1\n" + "\tstrh r0, [r2]\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tcmp r4, 0x9\n" + "\tbls _08088768\n" + "\tldrh r0, [r5, 0x10]\n" + "\tadds r0, 0x2\n" + "\tstrh r0, [r5, 0x10]\n" + "_080887A6:\n" + "\tmovs r0, 0\n" + "_080887A8:\n" + "\tadd sp, 0x4\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_080887B8: .4byte 0x06000140\n" + "_080887BC: .4byte gDarknessFieldMoveStreaksTilemap"); +} +#endif + +bool8 sub_80887C0(struct Task *task) +{ + u16 i; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = task->data[3] >> 3; + if (dstOffs >= task->data[4]) + { + dstOffs = (task->data[1] >> 3) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} + +u8 sub_8088830(u32 a0, u32 a1, u32 a2) +{ + u16 v0; + u8 monSprite; + struct Sprite *sprite; + v0 = (a0 & 0x80000000) >> 16; + a0 &= 0x7fffffff; + monSprite = CreateMonSprite_FieldMove(a0, a1, a2, 0x140, 0x50, 0); + sprite = &gSprites[monSprite]; + sprite->callback = SpriteCallbackDummy; + sprite->oam.priority = 0; + sprite->data0 = a0; + sprite->data6 = v0; + return monSprite; +} + +void sub_80888D4(struct Sprite *); + +void sub_8088890(struct Sprite *sprite) +{ + if ((sprite->pos1.x -= 20) <= 0x78) + { + sprite->pos1.x = 0x78; + sprite->data1 = 30; + sprite->callback = sub_80888D4; + if (sprite->data6) + { + PlayCry2(sprite->data0, 0, 0x7d, 0xa); + } else + { + PlayCry1(sprite->data0, 0); + } + } +} + +void sub_80888F0(struct Sprite *); + +void sub_80888D4(struct Sprite *sprite) +{ + if ((--sprite->data1) == 0) + { + sprite->callback = sub_80888F0; + } +} + +void sub_80888F0(struct Sprite *sprite) +{ + if (sprite->pos1.x < -0x40) + { + sprite->data7 = 1; + } else + { + sprite->pos1.x -= 20; + } +} + +void sub_8088954(u8); +extern const void (*gUnknown_0839F3E4[5])(struct Task *); + +u8 FldEff_UseSurf(void) +{ + u8 taskId; + taskId = CreateTask(sub_8088954, 0xff); + gTasks[taskId].data[15] = gUnknown_0202FF84[0]; + sav1_reset_battle_music_maybe(); + sub_8053FB0(0x016d); + return FALSE; +} + +void sub_8088954(u8 taskId) +{ + gUnknown_0839F3E4[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088984(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + gPlayerAvatar.unk6 = 1; + SetPlayerAvatarStateMask(8); + PlayerGetDestCoords(&task->data[1], &task->data[2]); + MoveCoords(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18, &task->data[1], &task->data[2]); + task->data[0]++; +} + +void sub_80889E4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_8088A30(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject)) + { + gUnknown_0202FF84[0] = task->data[15] | 0x80000000; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } +} + +void sub_8088A78(struct Task *task) +{ + struct MapObject *mapObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(3)); + FieldObjectClearAnimIfSpecialAnimFinished(mapObject); + FieldObjectSetSpecialAnim(mapObject, sub_80608D0(mapObject->placeholder18)); + gUnknown_0202FF84[0] = task->data[1]; + gUnknown_0202FF84[1] = task->data[2]; + gUnknown_0202FF84[2] = gPlayerAvatar.mapObjectId; + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_SURF_BLOB); + task->data[0]++; + } +} + +void sub_8088AF4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + gPlayerAvatar.unk6 = 0; + gPlayerAvatar.flags &= 0xdf; + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(mapObject->placeholder18)); + sub_8127ED0(mapObject->mapobj_unk_1A, 1); + UnfreezeMapObjects(); + ScriptContext2_Disable(); + FieldEffectActiveListRemove(FLDEFF_USE_SURF); + DestroyTask(FindTaskIdByFunc(sub_8088954)); + } +} + +void sub_8088BC4(struct Sprite *); + +u8 FldEff_NPCFlyOut(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_8088BC4; + sprite->data1 = gUnknown_0202FF84[0]; + PlaySE(SE_W019); + return spriteId; +} + +void sub_8088BC4(struct Sprite *sprite) +{ + struct Sprite *npcSprite; + sprite->pos2.x = Cos(sprite->data2, 0x8c); + sprite->pos2.y = Sin(sprite->data2, 0x48); + sprite->data2 = (sprite->data2 + 4) & 0xff; + if (sprite->data0) + { + npcSprite = &gSprites[sprite->data1]; + npcSprite->coordOffsetEnabled = 0; + npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x; + npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + npcSprite->pos2.x = 0; + npcSprite->pos2.y = 0; + } + if (sprite->data2 >= 0x80) + { + FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT); + } +} + +void sub_8088C70(u8); +extern const void (*gUnknown_0839F3F8[9])(struct Task *); +extern void sub_8127EFC(u8, u8); +u8 sub_8088F60(void); +bool8 sub_8088FA4(u8); +void sub_8088FC0(u8); +void sub_8088FFC(u8, u8); +void sub_8089018(struct Sprite *); +void sub_80890D8(struct Sprite *); +extern const union AffineAnimCmd *gSpriteAffineAnimTable_0839F44C[]; + +u8 FldEff_UseFly(void) +{ + u8 taskId; + taskId = CreateTask(sub_8088C70, 0xfe); + gTasks[taskId].data[1] = gUnknown_0202FF84[0]; + return 0; +} + +void sub_8088C70(u8 taskId) +{ + gUnknown_0839F3F8[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088CA0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.unk6 = 0x01; + SetPlayerAvatarStateMask(1); + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_8088CF8(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + gUnknown_0202FF84[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + } +} + +void sub_8088D3C(struct Task *task) +{ + struct MapObject *mapObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[15] & 0x08) + { + sub_8127ED0(mapObject->mapobj_unk_1A, 2); + sub_8127EFC(mapObject->mapobj_unk_1A, 0); + } + task->data[1] = sub_8088F60(); + task->data[0]++; + } +} + +void sub_8088D94(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + task->data[0]++; + task->data[2] = 16; + SetPlayerAvatarTransitionFlags(0x01); + FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], 0x02); + } +} + +void sub_8088DD8(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if ((task->data[2] == 0 || (--task->data[2]) == 0) && FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + PlaySE(SE_W019); + sub_8088FC0(task->data[1]); + } +} + +void sub_8088E2C(struct Task *task) +{ + struct MapObject *mapObject; + if ((++task->data[2]) >= 8) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x03)); + StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); + mapObject->mapobj_bit_12 = 1; + FieldObjectSetSpecialAnim(mapObject, 0x48); + if (task->data[15] & 0x08) + { + DestroySprite(&gSprites[mapObject->mapobj_unk_1A]); + } + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_8088EB4(struct Task *task) +{ + struct MapObject *mapObject; + if ((++task->data[2]) >= 10) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + mapObject->mapobj_bit_12 = 0; + mapObject->mapobj_bit_22 = 0; + sub_8088FFC(task->data[1], mapObject->spriteId); + CameraObjectReset2(); + task->data[0]++; + } +} + +void sub_8088F10(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + fade_8080918(); + task->data[0]++; + } +} + +void sub_8088F30(struct Task *task) +{ + if (!gPaletteFade.active) + { + FieldEffectActiveListRemove(FLDEFF_USE_FLY); + DestroyTask(FindTaskIdByFunc(sub_8088C70)); + } +} + +u8 sub_8088F60(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_8089018; + return spriteId; +} + +u8 sub_8088FA4(u8 spriteId) +{ + return gSprites[spriteId].data7; +} + +void sub_8088FC0(u8 spriteId) +{ + struct Sprite *sprite; + sprite = &gSprites[spriteId]; + sprite->callback = sub_80890D8; + sprite->pos1.x = 0x78; + sprite->pos1.y = 0x00; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + memset(&sprite->data0, 0, 8 * sizeof(u16) /* zero all data cells */); + sprite->data6 = 0x40; +} + +void sub_8088FFC(u8 a0, u8 a1) +{ + gSprites[a0].data6 = a1; +} + +void sub_8089018(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + if (sprite->data0 == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 0); + sprite->pos1.x = 0x76; + sprite->pos1.y = -0x30; + sprite->data0++; + sprite->data1 = 0x40; + sprite->data2 = 0x100; + } + sprite->data1 += (sprite->data2 >> 8); + sprite->pos2.x = Cos(sprite->data1, 0x78); + sprite->pos2.y = Sin(sprite->data1, 0x78); + if (sprite->data2 < 0x800) + { + sprite->data2 += 0x60; + } + if (sprite->data1 > 0x81) + { + sprite->data7++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0); + } + } +} + +void sub_80890D8(struct Sprite *sprite) +{ + struct Sprite *sprite1; + sprite->pos2.x = Cos(sprite->data2, 0x8c); + sprite->pos2.y = Sin(sprite->data2, 0x48); + sprite->data2 = (sprite->data2 + 4) & 0xff; + if (sprite->data6 != 0x40) + { + sprite1 = &gSprites[sprite->data6]; + sprite1->coordOffsetEnabled = 0; + sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x; + sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + sprite1->pos2.x = 0; + sprite1->pos2.y = 0; + } + if (sprite->data2 >= 0x80) + { + sprite->data7 = 1; + } +} + +void sub_808914C(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + if (sprite->data0 == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 1); + sprite->pos1.x = 0x5e; + sprite->pos1.y = -0x20; + sprite->data0++; + sprite->data1 = 0xf0; + sprite->data2 = 0x800; + sprite->data4 = 0x80; + } + sprite->data1 += sprite->data2 >> 8; + sprite->data3 += sprite->data2 >> 8; + sprite->data1 &= 0xff; + sprite->pos2.x = Cos(sprite->data1, 0x20); + sprite->pos2.y = Sin(sprite->data1, 0x78); + if (sprite->data2 > 0x100) + { + sprite->data2 -= sprite->data4; + } + if (sprite->data4 < 0x100) + { + sprite->data4 += 24; + } + if (sprite->data2 < 0x100) + { + sprite->data2 = 0x100; + } + if (sprite->data3 >= 60) + { + sprite->data7++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->invisible = 1; + } + } +} + +void sub_8089230(u8 spriteId) +{ + sub_8088FC0(spriteId); + gSprites[spriteId].callback = sub_808914C; +} + +void sub_8089270(u8); +extern const void (*gUnknown_0839F454[7])(struct Task *); +extern const s16 gUnknown_0839F470[18]; + +u8 FldEff_FlyIn(void) +{ + CreateTask(sub_8089270, 0xfe); + return 0; +} + +void sub_8089270(u8 taskId) +{ + gUnknown_0839F454[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80892A0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + task->data[2] = 17; + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.unk6 = 1; + SetPlayerAvatarStateMask(0x01); + if (task->data[15] & 0x08) + { + sub_8127ED0(mapObject->mapobj_unk_1A, 0); + } + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x3)); + CameraObjectReset2(); + FieldObjectTurn(mapObject, DIR_WEST); + StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); + mapObject->mapobj_bit_13 = 0; + task->data[1] = sub_8088F60(); + sub_8088FC0(task->data[1]); + sub_8088FFC(task->data[1], mapObject->spriteId); + } +} + +void sub_8089354(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + if (task->data[2] == 0 || (--task->data[2]) == 0) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + sub_8088FFC(task->data[1], 0x40); + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_80893C0(struct Task *task) +{ + s16 unknown_0839F470[18]; + struct Sprite *sprite; + memcpy(unknown_0839F470, gUnknown_0839F470, sizeof gUnknown_0839F470); + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y = unknown_0839F470[task->data[2]]; + if ((++task->data[2]) >= 18) + { + task->data[0]++; + } +} + +void sub_8089414(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + if (sub_8088FA4(task->data[1])) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + mapObject->mapobj_bit_12 = 0; + sub_805C058(mapObject, mapObject->coords2.x, mapObject->coords2.y); + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->coordOffsetEnabled = 1; + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_808948C(struct Task *task) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gPlayerAvatar.mapObjectId])) + { + task->data[0]++; + sub_8089230(task->data[1]); + } +} + +void sub_80894C4(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + DestroySprite(&gSprites[task->data[1]]); + task->data[0]++; + task->data[1] = 0x10; + } +} + +void fishE(struct Task *task) +{ + u8 state; + struct MapObject *mapObject; + if ((--task->data[1]) == 0) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + state = 0; + if (task->data[15] & 0x08) + { + state = 3; + sub_8127ED0(mapObject->mapobj_unk_1A, 1); + } + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(state)); + FieldObjectTurn(mapObject, DIR_SOUTH); + gPlayerAvatar.flags = task->data[15]; + gPlayerAvatar.unk6 = 0; + FieldEffectActiveListRemove(FLDEFF_FLY_IN); + DestroyTask(FindTaskIdByFunc(sub_8089270)); + } +} diff --git a/src/palette.c b/src/palette.c index 165eb2eae..a610049bc 100644 --- a/src/palette.c +++ b/src/palette.c @@ -615,7 +615,7 @@ static u8 UpdateFastPaletteFade(void) if (b < b0) b = b0; - gPlttBufferFaded[i] = r | (g << 5) | (b << 10); + gPlttBufferFaded[i] = RGB(r, g, b); } break; case FAST_FADE_OUT_TO_WHTIE: @@ -633,7 +633,7 @@ static u8 UpdateFastPaletteFade(void) if (b > 31) b = 31; - gPlttBufferFaded[i] = r | (g << 5) | (b << 10); + gPlttBufferFaded[i] = RGB(r, g, b); } break; case FAST_FADE_IN_FROM_BLACK: @@ -659,7 +659,7 @@ static u8 UpdateFastPaletteFade(void) if (b > b0) b = b0; - gPlttBufferFaded[i] = r | (g << 5) | (b << 10); + gPlttBufferFaded[i] = RGB(r, g, b); } break; case FAST_FADE_OUT_TO_BLACK: @@ -677,7 +677,7 @@ static u8 UpdateFastPaletteFade(void) if (b < 0) b = 0; - gPlttBufferFaded[i] = r | (g << 5) | (b << 10); + gPlttBufferFaded[i] = RGB(r, g, b); } } diff --git a/src/record_mixing.c b/src/record_mixing.c index c84cfd2ae..f9cb4116e 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -13,18 +13,19 @@ #include "strings2.h" #include "task.h" + extern void *recordMixingSecretBases; extern void *recordMixingTvShows; extern void *gUnknown_083D0274; extern void *gUnknown_083D0278; extern void *recordMixingEasyChatPairs; -extern void *gUnknown_083D0280; extern void *gUnknown_083D0284; extern u8 gUnknown_083D0288[2]; extern u8 gUnknown_083D028A[2][3]; extern u8 gUnknown_083D0290[9][4]; -extern struct RecordMixing_UnknownStruct gUnknown_02038738[2]; //Don't know what type this points to +extern struct RecordMixing_UnknownStruct gUnknown_02038738; //Don't know what type this points to +extern struct RecordMixing_UnknownStruct *gUnknown_083D0280; extern u16 gSpecialVar_0x8005; extern u32 gUnknown_03005D2C; extern u8 gUnknown_03000718; @@ -40,11 +41,11 @@ void sub_80B929C(void) struct PlayerRecords { struct SecretBaseRecord secretBases[20]; - u8 tvShows[25][36]; + TVShow tvShows[25]; u8 filler1004[0x40]; u8 filler1044[0x40]; struct EasyChatPair easyChatPairs[5]; - u8 filler10AC[0x78]; + struct RecordMixing_UnknownStruct filler10AC; u8 filler1124[0xA4]; u16 filler11C8[0x34]; }; @@ -65,10 +66,10 @@ void RecordMixing_PrepareExchangePacket(void) memcpy(unk_2018000.filler1004, gUnknown_083D0274, 0x40); memcpy(unk_2018000.filler1044, gUnknown_083D0278, 0x40); memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, 0x28); - gUnknown_02038738[0] = gSaveBlock1.filler_303C[0]; - gUnknown_02038738[1] = gSaveBlock1.filler_303C[1]; - sub_8041324(gSaveBlock1.daycareData, gUnknown_02038738); - memcpy(unk_2018000.filler10AC, gUnknown_083D0280, 0x78); + gUnknown_02038738.data[0] = gSaveBlock1.filler_303C.data[0]; + gUnknown_02038738.data[1] = gSaveBlock1.filler_303C.data[1]; + sub_8041324(gSaveBlock1.daycareData, &gUnknown_02038738); + memcpy(&unk_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixing_UnknownStruct)); memcpy(unk_2018000.filler1124, gUnknown_083D0284, 0xA4); if (GetMultiplayerId() == 0) @@ -83,7 +84,7 @@ void RecordMixing_ReceiveExchangePacket(u32 a) sub_80B9B1C(unk_2008000.filler1044, sizeof(struct PlayerRecords), a); //UB: Too many arguments for function "sub_80FA4E4" sub_80FA4E4(unk_2008000.easyChatPairs, sizeof(struct PlayerRecords), a); - sub_80B9C6C(unk_2008000.filler10AC, sizeof(struct PlayerRecords), a, unk_2008000.tvShows); + sub_80B9C6C(&unk_2008000.filler10AC, sizeof(struct PlayerRecords), a, unk_2008000.tvShows); sub_80B9B70(unk_2008000.filler1124, sizeof(struct PlayerRecords), a); sub_80B9F3C(unk_2008000.filler11C8, a); } @@ -428,14 +429,20 @@ u8 sub_80B9BBC(u16 *a) #undef NONMATCHING #ifdef NONMATCHING -void sub_80B9BC4(u32 a, u32 b, u32 c, u32 d) +void sub_80B9BC4(struct RecordMixing_UnknownStruct *a, size_t b, u8 c[][2], u8 d, u8 e) { + struct RecordMixing_UnknownStructSub *offA; + struct RecordMixing_UnknownStructSub *offB; + struct RecordMixing_UnknownStructSub v0; + v0 = (offA = ((struct RecordMixing_UnknownStruct *)(b * c[d][0] + (u32)&a))->data)[c[d][1]]; + offA[c[d][1]] = (offB = ((struct RecordMixing_UnknownStruct *)(b * c[e][0] + (u32)&a))->data)[c[e][1]]; + offB[c[e][1]] = v0; //ToDo: Figure out what this strange stack usage is } #else __attribute__((naked)) -void sub_80B9BC4(u32 a, u32 b, u32 c, u32 d) +void sub_80B9BC4(struct RecordMixing_UnknownStruct *a, size_t b, u8 c[][2], u8 d, u8 e) { asm(".syntax unified\n\ push {r4-r6,lr}\n\ @@ -517,75 +524,3 @@ u8 sub_80B9C4C(u8 *a) return r2; } -struct UnkStruct1 -{ - u8 unk0[4]; - u8 unk4[4]; - u8 unk8[4]; - u8 fillerC[0x10]; - u8 unk1C[4][2]; - u8 filler24[8]; - void *unk2C; - u32 unk30; - u32 unk34; - void *unk38; - u32 unk3C; - u32 unk40; - u8 filler44[4]; - u32 unk48; - u32 unk4C; - u32 unk50; - -}; - -/* -//Not finished -extern void sub_80B9C6C(void *a, u32 b, u8 c, void *d) -{ - struct UnkStruct1 s; - u16 r8; - u16 r3; - - s.unk2C = a; - s.unk30 = b; - s.unk38 = d; - s.unk34 = c; - s.unk40 = Random(); - SeedRng(gLinkPlayers[0].trainerId); - r8 = GetLinkPlayerCount(); - r3 = 0; - - s.unk4C = 12; - - while (r3 < 4) - { - - s.unk4[r3] |= 0xFF; - s.unk8[r3] = 0; - - s.unk1C[r3][0] = 0; - s.unk1C[r3][1] = 0; - r3++; - } - s.unk3C = 0; - r3 = 0; - s.unk50 = r8 << 16; - s.unk48 = s.unk30 * s.unk34; - - if (s.unk3C < r8) - { - do //_080B9D00 - { - u32 *r6 = (u32 *)(s.unk2C + s.unk30 * r3); - if (r6[0x1C] != 0 && r6[0x1C] > 0) - { - - } - //_080B9D3C - } - while (r3 < r8); - } - //_080B9D46 -} -*/ - |