summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_2.c2
-rw-r--r--src/battle_811DA74.c986
-rw-r--r--src/battle_ai.c2
-rw-r--r--src/daycare.c84
-rw-r--r--src/decoration_inventory.c156
-rwxr-xr-x[-rw-r--r--]src/field_effect.c2847
-rw-r--r--src/palette.c8
-rw-r--r--src/record_mixing.c101
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
-}
-*/
-