summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2017-06-10 03:20:02 -0400
committerProjectRevoTPP <projectrevotpp@hotmail.com>2017-06-10 03:20:02 -0400
commit10f798323e88e4cdf8fe881956dd5ad41121e1a3 (patch)
tree3871c3b6abb80424dc77870f1e1ad7ce38a3afe2 /src
parent16fd2ca3856668cd4e7cb5e94d3022ac5edce8a3 (diff)
parentfe13cf593a7c14480de940e413177586cc8eae2e (diff)
finish decompiling player_pc.c
Diffstat (limited to 'src')
-rw-r--r--src/battle_2.c2198
-rw-r--r--src/battle_ai.c3
-rw-r--r--src/battle_interface.c66
-rw-r--r--src/battle_party_menu.c12
-rw-r--r--src/battle_records.c4
-rw-r--r--src/battle_setup.c13
-rw-r--r--src/berry_tag_screen.c24
-rw-r--r--src/braille_puzzles.c74
-rw-r--r--src/calculate_base_damage.c8
-rw-r--r--src/clear_save_data_menu.c141
-rw-r--r--src/coins.c3
-rw-r--r--src/contest_painting.c51
-rw-r--r--src/credits.c1220
-rw-r--r--src/daycare.c367
-rw-r--r--src/decompress.c5
-rw-r--r--src/diploma.c5
-rw-r--r--src/easy_chat.c231
-rw-r--r--src/field_camera.c106
-rw-r--r--src/field_control_avatar.c68
-rw-r--r--src/field_map_obj.c5227
-rw-r--r--src/field_player_avatar.c18
-rw-r--r--src/field_poison.c48
-rw-r--r--src/field_region_map.c3
-rw-r--r--src/field_special_scene.c122
-rw-r--r--src/fldeff_cut.c86
-rw-r--r--src/intro.c142
-rw-r--r--src/item.c21
-rw-r--r--src/item_use.c199
-rw-r--r--src/link.c5
-rw-r--r--src/mail.c3
-rw-r--r--src/main.c16
-rw-r--r--src/main_menu.c38
-rw-r--r--src/matsuda_debug_menu.c72
-rw-r--r--src/mauville_old_man.c33
-rw-r--r--src/menu.c14
-rw-r--r--src/mori_debug_menu.c7
-rw-r--r--src/mystery_event_menu.c410
-rw-r--r--src/naming_screen.c7
-rw-r--r--src/option_menu.c321
-rw-r--r--src/party_menu.c1530
-rw-r--r--src/player_pc.c440
-rw-r--r--src/pokedex.c1570
-rw-r--r--src/pokemon_1.c2
-rw-r--r--src/pokemon_2.c1044
-rw-r--r--src/pokemon_3.c118
-rw-r--r--src/pokemon_size_record.c4
-rw-r--r--src/pokemon_summary_screen.c13
-rw-r--r--src/pokenav.c3
-rw-r--r--src/record_mixing.c237
-rw-r--r--src/rom3.c49
-rw-r--r--src/rom_8077ABC.c15
-rw-r--r--src/save_failed_screen.c114
-rw-r--r--src/save_menu_util.c6
-rw-r--r--src/scrcmd.c4
-rw-r--r--src/script_menu.c26
-rw-r--r--src/script_pokemon_util_80C4BF0.c149
-rw-r--r--src/script_pokemon_util_80F99CC.c269
-rw-r--r--src/secret_base.c1056
-rw-r--r--src/shop.c29
-rw-r--r--src/smokescreen.c4
-rw-r--r--src/start_menu.c325
-rw-r--r--src/starter_choose.c57
-rw-r--r--src/string_util.c29
-rw-r--r--src/text.c78
-rw-r--r--src/title_screen.c2
-rw-r--r--src/trainer_card.c13
-rw-r--r--src/trainer_see.c4
-rw-r--r--src/trig.c1
-rw-r--r--src/tv.c2773
-rw-r--r--src/wallclock.c136
70 files changed, 16548 insertions, 4943 deletions
diff --git a/src/battle_2.c b/src/battle_2.c
index a9f0fd57a..3ca3387b8 100644
--- a/src/battle_2.c
+++ b/src/battle_2.c
@@ -1,5 +1,7 @@
#include "global.h"
+#include "asm.h"
#include "battle.h"
+#include "data2.h"
#include "main.h"
#include "text.h"
#include "palette.h"
@@ -10,13 +12,11 @@
#include "link.h"
#include "name_string_util.h"
#include "battle_setup.h"
-
-struct UnknownStruct5
-{
- u32 unk0;
- u32 unk4;
- u32 unk8;
-};
+#include "rng.h"
+#include "sound.h"
+#include "songs.h"
+#include "trig.h"
+#include "abilities.h"
struct UnknownStruct6
{
@@ -55,35 +55,191 @@ struct UnknownPokemonStruct2
/*0x1D*/ u8 language;
};
-extern const struct UnknownStruct5 gUnknown_081F9674;
-extern const u8 gUnknown_081F96C8[];
-extern const struct Trainer gTrainers[];
-extern const u8 gSpeciesNames[][11];
-extern const struct BattleMove gBattleMoves[];
+struct UnknownStruct9
+{
+ u8 unk0;
+ u16 unk2;
+};
+
+struct UnknownStruct10
+{
+ u8 unk0_0:1;
+ u8 unk0_1:1;
+ u8 unk0_2:1;
+ u8 filler1[1];
+ u8 unk2;
+ u8 unk3;
+ u8 filler4[8];
+};
+
+struct UnknownStruct11
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+ u8 unk5_0:1;
+ u8 unk5_1:1;
+ u16 unk6;
+ u8 unk8[10];
+ u8 unk12;
+ u8 unk13;
+ u8 unk14[10];
+ u8 filler1E[2];
+ u16 unk20;
+ u16 unk22;
+ u16 unk24;
+ u16 unk26;
+ u16 unk28;
+ u8 unk2A[10];
+ u8 filler34[2];
+ u8 unk36[10];
+};
+
+struct UnknownStruct12
+{
+ u32 unk0;
+ u8 filler4[0x54];
+};
+
+struct UnknownStruct13
+{
+ u32 unk0_0:1;
+ u32 unk0_1:1;
+ u32 unk0_2:1;
+ u32 unk0_3:1;
+ u32 unk0_4:1;
+ u32 unk0_5:1;
+ u32 unk0_6:1;
+ u32 unk0_7:1;
+ u32 unk1_0:1;
+ u32 unk1_1:1;
+ u32 unk1_2:1;
+ u32 unk1_3:2;
+ u32 unk1_5:1;
+ u32 unk1_6:1;
+ u32 unk1_7:1;
+ u32 unk2_0:1;
+ u32 unk2_1:1;
+ u32 unk2_2:1;
+ u32 unk2_3:1;
+ u8 filler4[12];
+};
+
+extern const u16 gUnknown_08D004E0[];
+extern const struct MonCoords gCastformFrontSpriteCoords[];
+extern const struct BaseStats gBaseStats[];
+extern const u32 gBitTable[];
extern u8 ewram[];
#define ewram0 (*(struct UnknownStruct7 *)(ewram + 0x0))
#define ewram4 (*(struct UnknownStruct8 *)(ewram + 0x4))
+#define ewram16000 (ewram[0x16000])
+#define ewram16001 (ewram[0x16001])
+#define ewram16002 (ewram[0x16002])
+#define ewram16003 (ewram[0x16003])
+#define ewram1600C (ewram[0x1600C])
+#define ewram1600E (ewram[0x1600E])
+#define ewram1601B (ewram[0x1601B])
+#define ewram16020 ((u8 *)(ewram + 0x16020))
+#define ewram16056 (ewram[0x16056])
+#define ewram16058 (ewram[0x16058])
+#define ewram16059 (ewram[0x16059])
+#define ewram16078 (ewram[0x16078])
+#define ewram16084 (ewram[0x16084])
+#define ewram16086 (ewram[0x16086])
+#define ewram16087 (ewram[0x16087])
+#define ewram16088 (ewram[0x16088])
+#define ewram16089 (ewram[0x16089])
+#define ewram160A1 (ewram[0x160A1])
+#define ewram160A6 (ewram[0x160A6])
+#define ewram160AC ((u8 *)(ewram + 0x160AC))
+#define ewram160BC ((u16 *)(ewram + 0x160BC)) // hp
+#define ewram160C8 (ewram[0x160C8])
+#define ewram160C9 (ewram[0x160C9])
#define ewram160CB (ewram[0x160CB])
+#define ewram160CC ((u8 *)(ewram + 0x160CC))
+#define ewram160E6 (ewram[0x160E6])
+#define ewram160E8 ((u8 *)(ewram + 0x160E8))
+#define ewram160F0 ((u8 *)(ewram + 0x160F0))
+#define ewram160F9 (ewram[0x160F9])
+#define ewram16100 ((u8 *)(ewram + 0x16100))
+#define ewram16108 ((u8 *)(ewram + 0x16108))
+#define ewram16110 (ewram[0x16110])
+#define ewram16111 (ewram[0x16111])
+#define ewram16113 (ewram[0x16113])
+#define ewram17100 ((u32 *)(ewram + 0x17100))
+#define ewram17130 (ewram[0x17130])
+#define ewram17160 (ewram[0x17160])
+#define ewram17800 ((struct UnknownStruct9 *)(ewram + 0x17800))
+#define ewram17810 ((struct UnknownStruct10 *)(ewram + 0x17810))
#define ewram1D000 ((struct Pokemon *)(ewram + 0x1D000))
extern struct UnknownPokemonStruct2 gUnknown_02023A00[];
+extern u8 gUnknown_02024260[][0x200];
+extern u8 gUnknown_02024A60;
+extern u32 gUnknown_02024A64;
+extern u8 gUnknown_02024A68;
+extern u16 gUnknown_02024A6A[];
+extern u8 gUnknown_02024A7F;
+extern u8 gUnknown_02024A7A[];
+extern struct UnknownStruct12 gUnknown_02024AD0[];
+extern u8 gUnknown_02024BE0[];
+extern u16 gUnknown_02024BE6;
+extern u8 byte_2024C06;
+extern u8 gUnknown_02024C0B;
+extern u8 gUnknown_02024C0C;
+extern u8 gUnknown_02024C0E;
+extern u8 gUnknown_02024C18[];
+extern u16 gUnknown_02024C2C[];
+extern u16 gUnknown_02024C34[];
+extern u16 gUnknown_02024C3C[];
+extern u16 gUnknown_02024C44[];
+extern u16 gUnknown_02024C4C[];
+extern u16 gUnknown_02024C54[];
+extern u8 gUnknown_02024C5C[];
+extern u16 gUnknown_02024C60[];
+extern u32 gUnknown_02024C6C;
+extern u8 gUnknown_02024C70[];
+extern u16 gUnknown_02024C7A[];
+extern u8 gUnknown_02024C80[][12];
+extern u32 gUnknown_02024C98[];
+//extern u8 gUnknown_02024CA8[][0x1C];
+extern u16 gUnknown_02024D18;
+extern u16 gUnknown_02024D1A;
+extern u16 gUnknown_02024D1C;
extern u8 gUnknown_02024D1E[];
extern u8 gUnknown_02024D1F[]; // I don't actually know what type this is.
+extern u8 gUnknown_02024D26;
+extern struct UnknownStruct13 gUnknown_02024D28[];
+extern u8 gUnknown_02024DBC[];
+extern u16 gUnknown_02024DE8;
+extern u8 gUnknown_02024E60[];
+extern u8 gUnknown_02024E64[];
+extern u8 gUnknown_02038470[];
extern u16 gUnknown_030041B0;
extern u16 gUnknown_030041B4;
extern u16 gUnknown_030041B8;
extern struct Window gUnknown_030041D0;
+extern u16 gUnknown_03004200;
extern struct Window gUnknown_03004210;
+extern u16 gUnknown_03004244;
extern struct Window gUnknown_03004250;
extern u16 gUnknown_03004240;
extern u16 gUnknown_03004280;
+extern u32 gUnknown_03004284;
extern u16 gUnknown_03004288;
extern u16 gUnknown_030042A0;
extern u16 gUnknown_030042A4;
extern u16 gUnknown_030042C0;
extern u16 gUnknown_030042C4;
extern MainCallback gUnknown_030042D0;
+extern void (*gUnknown_030042D4)(void);
+extern struct UnknownStruct11 gUnknown_030042E0;
+extern u8 gUnknown_03004324;
+extern void (*gUnknown_03004330[])(void);
+extern u8 gUnknown_03004340[];
extern struct UnknownStruct6 gUnknown_03004DE0;
//extern u16 gUnknown_03004DE0[][0xA0]; // possibly?
extern u16 gBattleTypeFlags;
@@ -92,6 +248,13 @@ extern u8 gReservedSpritePaletteCount;
extern u16 gTrainerBattleOpponent;
extern struct BattleEnigmaBerry gEnigmaBerries[];
extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
+extern u8 gBattleMonForms[];
+extern u8 gPlayerMonIndex;
+extern u8 gEnemyMonIndex;
+extern u16 gBattleWeather;
+extern u32 gBattleMoveDamage;
+extern struct BattlePokemon gBattleMons[];
+extern u8 gBattleMoveFlags;
extern void sub_800B858(void);
extern void dp12_8087EA4(void);
@@ -106,8 +269,31 @@ extern void sub_800DE30(u8);
extern void sub_800B950(void);
extern u8 battle_load_something();
extern void OpenPartyMenu();
-
-void sub_800E7F8(void);
+extern void sub_8089668();
+extern void sub_800D74C();
+extern void sub_804777C(u8);
+extern void sub_8043DFC();
+extern u8 CreateInvisibleSpriteWithCallback(void (*)(struct Sprite *));
+extern void dp01_build_cmdbuf_x00_a_b_0(u8 a, u8 b, u8 c);
+extern void dp01_build_cmdbuf_x04_4_4_4(u8 a);
+extern void dp01_build_cmdbuf_x07_7_7_7(u8 a);
+extern void dp01_build_cmdbuf_x12_a_bb(u8 a, u8 b, u16 c);
+extern void dp01_build_cmdbuf_x2E_a(u8 a, u8 b);
+extern void dp01_build_cmdbuf_x2F_2F_2F_2F(u8 a);
+extern void dp01_build_cmdbuf_x30_TODO(u8 a, u8 *b, u8 c);
+extern void dp01_battle_side_mark_buffer_for_execution();
+extern u8 GetNationalPokedexFlag();
+extern void sub_800C704(u8, u8, u8);
+extern u8 sub_8018324();
+extern u8 sub_801A02C();
+extern u8 sub_8015DFC();
+extern u8 sub_8016558();
+extern u8 sub_80173A4();
+extern u8 sub_80170DC();
+extern u8 ItemId_GetHoldEffect(u16);
+extern void sub_8094C98();
+
+void InitBattle(void);
void sub_800EC9C(void);
void sub_800F104(void);
void sub_800F298(void);
@@ -116,6 +302,40 @@ void sub_800F838(struct Sprite *);
u8 CreateNPCTrainerParty(struct Pokemon *, u16);
void sub_800FCFC(void);
void sub_8010824(void);
+void sub_80101B8(void);
+void c2_081284E0(void);
+void sub_8010278(struct Sprite *);
+void sub_80102AC(struct Sprite *);
+void nullsub_37(struct Sprite *);
+void sub_8010320(struct Sprite *);
+void sub_8010494(struct Sprite *);
+void sub_801053C(struct Sprite *);
+void oac_poke_ally_(struct Sprite *);
+void nullsub_86(struct Sprite *);
+void objc_dp11b_pingpong(struct Sprite *);
+void sub_8010874(void);
+void bc_8012FAC(void);
+void bc_load_battlefield(void);
+void sub_8011384(void);
+void bc_801333C(void);
+void bc_battle_begin_message(void);
+void bc_8013568(void);
+void sub_8011800(void);
+void sub_8011834(void);
+void bc_801362C(void);
+void sub_8011970(void);
+void sub_80119B4(void);
+void sub_8011B00(void);
+void sub_8011E8C(void);
+void sub_8012324(void);
+void sub_8012FBC(u8, u8);
+u8 b_first_side();
+void sub_801365C(u8);
+void sub_801377C(void);
+void sub_80138F0(void);
+void b_cancel_multi_turn_move_maybe(u8);
+void b_std_message();
+void sub_80156DC();
void sub_800E7C4(void)
{
@@ -127,11 +347,11 @@ void sub_800E7C4(void)
}
else
{
- sub_800E7F8();
+ InitBattle();
}
}
-void sub_800E7F8(void)
+void InitBattle(void)
{
s32 i;
@@ -547,7 +767,7 @@ void sub_800F104(void)
{
gBattleTypeFlags = *pSavedBattleTypeFlags;
gMain.savedCallback = *pSavedCallback;
- SetMainCallback2(sub_800E7F8);
+ SetMainCallback2(InitBattle);
}
break;
}
@@ -565,25 +785,42 @@ void sub_800F298(void)
BuildOamBuffer();
switch (gUnknown_02024D1E[0])
{
- case 0:
- if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
+ case 0:
+ if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
+ {
+ ewram0.unk0 = 1;
+ ewram0.unk1 = 1;
+ sub_800E9EC();
+ sub_800EAAC();
+ SendBlock(bitmask_all_link_players_but_self(), ewram, 0x20);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 1:
+ if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ {
+ u8 taskId;
+
+ ResetBlockReceivedFlags();
+ id = 0;
+ if (gBlockRecvBuffer[0][0] == 0x100)
{
- ewram0.unk0 = 1;
- ewram0.unk1 = 1;
- sub_800E9EC();
- sub_800EAAC();
- SendBlock(bitmask_all_link_players_but_self(), ewram, 0x20);
- gUnknown_02024D1E[0]++;
+ if (playerId == 0)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ id++;
}
- break;
- case 1:
- if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ if (id == 0)
{
- u8 taskId;
+ s32 i;
- ResetBlockReceivedFlags();
- id = 0;
- if (gBlockRecvBuffer[0][0] == 0x100)
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0])
+ break;
+ }
+ if (i == MAX_LINK_PLAYERS)
{
if (playerId == 0)
gBattleTypeFlags |= 12;
@@ -593,231 +830,214 @@ void sub_800F298(void)
}
if (id == 0)
{
- s32 i;
-
- for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ while (id < MAX_LINK_PLAYERS)
{
- if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0])
+ if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId)
+ if (id < playerId)
+ break;
+ if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId)
break;
- }
- if (i == MAX_LINK_PLAYERS)
- {
- if (playerId == 0)
- gBattleTypeFlags |= 12;
- else
- gBattleTypeFlags |= 8;
id++;
}
- if (id == 0)
- {
- while (id < MAX_LINK_PLAYERS)
- {
- if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId)
- if (id < playerId)
- break;
- if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId)
- break;
- id++;
- }
- if (id == MAX_LINK_PLAYERS)
- gBattleTypeFlags |= 12;
- else
- gBattleTypeFlags |= 8;
- }
+ if (id == MAX_LINK_PLAYERS)
+ gBattleTypeFlags |= 12;
+ else
+ gBattleTypeFlags |= 8;
+ }
+ }
+ sub_800EB08();
+ memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3);
+ taskId = CreateTask(sub_800DE30, 0);
+ gTasks[taskId].data[1] = 0x10E;
+ gTasks[taskId].data[2] = 0x5A;
+ gTasks[taskId].data[5] = 0;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[4] = 0;
+ for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ {
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F;
+ break;
+ case 1:
+ gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F;
+ break;
+ case 2:
+ gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
+ break;
+ case 3:
+ gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
+ break;
}
- sub_800EB08();
- memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3);
- taskId = CreateTask(sub_800DE30, 0);
- gTasks[taskId].data[1] = 0x10E;
- gTasks[taskId].data[2] = 0x5A;
- gTasks[taskId].data[5] = 0;
- gTasks[taskId].data[3] = 0;
- gTasks[taskId].data[4] = 0;
- for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ }
+ ZeroPlayerPartyMons();
+ ZeroEnemyPartyMons();
+ gUnknown_02024D1E[0]++;
+ goto step_2;
+ }
+ break;
+ case 2:
+ step_2:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 3:
+ if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ {
+ ResetBlockReceivedFlags();
+ for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ {
+ if (id == playerId)
{
switch (gLinkPlayers[id].lp_field_18)
{
- case 0:
- gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F;
- break;
- case 1:
- gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F;
- break;
- case 2:
- gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
- break;
- case 3:
- gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
- break;
+ case 0:
+ case 3:
+ memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
+ case 1:
+ case 2:
+ memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
}
}
- ZeroPlayerPartyMons();
- ZeroEnemyPartyMons();
- gUnknown_02024D1E[0]++;
- goto step_2;
- }
- break;
- case 2:
- step_2:
- if (sub_8007ECC())
- {
- SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2);
- gUnknown_02024D1E[0]++;
- }
- break;
- case 3:
- if ((GetBlockReceivedStatus() & 0xF) == 0xF)
- {
- ResetBlockReceivedFlags();
- for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ else
{
- if (id == playerId)
+ if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
+ || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
{
switch (gLinkPlayers[id].lp_field_18)
{
- case 0:
- case 3:
- memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- case 1:
- case 2:
- memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
+ case 0:
+ case 3:
+ memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
+ case 1:
+ case 2:
+ memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
}
}
else
{
- if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
- || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
- {
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- case 1:
- case 2:
- memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- }
- }
- else
+ switch (gLinkPlayers[id].lp_field_18)
{
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- case 1:
- case 2:
- memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
- break;
- }
+ case 0:
+ case 3:
+ memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
+ case 1:
+ case 2:
+ memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
+ break;
}
}
}
- gUnknown_02024D1E[0]++;
}
- break;
- case 4:
- if (sub_8007ECC())
- {
- SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon));
- gUnknown_02024D1E[0]++;
- }
- break;
- case 5:
- if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 4:
+ if (sub_8007ECC())
+ {
+ SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon));
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 5:
+ if ((GetBlockReceivedStatus() & 0xF) == 0xF)
+ {
+ ResetBlockReceivedFlags();
+ for (id = 0; id < MAX_LINK_PLAYERS; id++)
{
- ResetBlockReceivedFlags();
- for (id = 0; id < MAX_LINK_PLAYERS; id++)
+ if (id == playerId)
{
- if (id == playerId)
+ switch (gLinkPlayers[id].lp_field_18)
+ {
+ case 0:
+ case 3:
+ memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ case 1:
+ case 2:
+ memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ }
+ }
+ else
+ {
+ if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
+ || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
{
switch (gLinkPlayers[id].lp_field_18)
{
- case 0:
- case 3:
- memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- case 1:
- case 2:
- memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
+ case 0:
+ case 3:
+ memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ case 1:
+ case 2:
+ memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
}
}
else
{
- if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
- || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
- {
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- case 1:
- case 2:
- memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- }
- }
- else
+ switch (gLinkPlayers[id].lp_field_18)
{
- switch (gLinkPlayers[id].lp_field_18)
- {
- case 0:
- case 3:
- memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- case 1:
- case 2:
- memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
- break;
- }
+ case 0:
+ case 3:
+ memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
+ case 1:
+ case 2:
+ memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
+ break;
}
}
}
+ }
- shedinja_something(&gPlayerParty[0]);
- shedinja_something(&gPlayerParty[1]);
- shedinja_something(&gPlayerParty[2]);
- shedinja_something(&gPlayerParty[3]);
- shedinja_something(&gPlayerParty[4]);
- shedinja_something(&gPlayerParty[5]);
+ shedinja_something(&gPlayerParty[0]);
+ shedinja_something(&gPlayerParty[1]);
+ shedinja_something(&gPlayerParty[2]);
+ shedinja_something(&gPlayerParty[3]);
+ shedinja_something(&gPlayerParty[4]);
+ shedinja_something(&gPlayerParty[5]);
- shedinja_something(&gEnemyParty[0]);
- shedinja_something(&gEnemyParty[1]);
- shedinja_something(&gEnemyParty[2]);
- shedinja_something(&gEnemyParty[3]);
- shedinja_something(&gEnemyParty[4]);
- shedinja_something(&gEnemyParty[5]);
+ shedinja_something(&gEnemyParty[0]);
+ shedinja_something(&gEnemyParty[1]);
+ shedinja_something(&gEnemyParty[2]);
+ shedinja_something(&gEnemyParty[3]);
+ shedinja_something(&gEnemyParty[4]);
+ shedinja_something(&gEnemyParty[5]);
- gUnknown_02024D1E[0]++;
- }
- break;
- case 6:
- sub_800B950();
gUnknown_02024D1E[0]++;
- gUnknown_02024D1E[1] = 0;
- gUnknown_02024D1E[2] = 0;
- break;
- case 7:
- if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0)
+ }
+ break;
+ case 6:
+ sub_800B950();
+ gUnknown_02024D1E[0]++;
+ gUnknown_02024D1E[1] = 0;
+ gUnknown_02024D1E[2] = 0;
+ break;
+ case 7:
+ if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0)
+ {
+ gUnknown_030042D0 = gMain.callback1;
+ gMain.callback1 = sub_8010824;
+ SetMainCallback2(sub_800F808);
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
- gUnknown_030042D0 = gMain.callback1;
- gMain.callback1 = sub_8010824;
- SetMainCallback2(sub_800F808);
- if (gBattleTypeFlags & BATTLE_TYPE_LINK)
- {
- gTrainerBattleOpponent = 0x800;
- gBattleTypeFlags |= BATTLE_TYPE_20;
- }
+ gTrainerBattleOpponent = 0x800;
+ gBattleTypeFlags |= BATTLE_TYPE_20;
}
- break;
+ }
+ break;
}
}
@@ -842,42 +1062,42 @@ void sub_800F838(struct Sprite *sprite)
switch (sprite->data0)
{
- case 0:
- sprite->data0++;
- sprite->data1 = 0;
- sprite->data2 = 0x281;
- sprite->data3 = 0;
- sprite->data4 = 1;
- // fall through
- case 1:
- sprite->data4--;
- if (sprite->data4 == 0)
- {
- s32 i;
- s32 r2;
- s32 r0;
+ case 0:
+ sprite->data0++;
+ sprite->data1 = 0;
+ sprite->data2 = 0x281;
+ sprite->data3 = 0;
+ sprite->data4 = 1;
+ // fall through
+ case 1:
+ sprite->data4--;
+ if (sprite->data4 == 0)
+ {
+ s32 i;
+ s32 r2;
+ s32 r0;
- sprite->data4 = 2;
- r2 = sprite->data1 + sprite->data3 * 32;
- r0 = sprite->data2 - sprite->data3 * 32;
- for (i = 0; i < 29; i += 2)
- {
- arr[r2 + i] = 0x3D;
- arr[r0 + i] = 0x3D;
- }
- sprite->data3++;
- if (sprite->data3 == 21)
- {
- sprite->data0++;
- sprite->data1 = 32;
- }
+ sprite->data4 = 2;
+ r2 = sprite->data1 + sprite->data3 * 32;
+ r0 = sprite->data2 - sprite->data3 * 32;
+ for (i = 0; i < 29; i += 2)
+ {
+ arr[r2 + i] = 0x3D;
+ arr[r0 + i] = 0x3D;
}
- break;
- case 2:
- sprite->data1--;
- if (sprite->data1 == 20)
- SetMainCallback2(sub_800E7C4);
- break;
+ sprite->data3++;
+ if (sprite->data3 == 21)
+ {
+ sprite->data0++;
+ sprite->data1 = 32;
+ }
+ }
+ break;
+ case 2:
+ sprite->data1--;
+ if (sprite->data1 == 20)
+ SetMainCallback2(sub_800E7C4);
+ break;
}
}
@@ -910,68 +1130,1454 @@ u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum)
switch (gTrainers[trainerNum].partyFlags)
{
- case 0:
+ case 0:
+ {
+ struct TrainerPartyMember0 *partyData = gTrainers[trainerNum].party;
+
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ nameHash += gSpeciesNames[partyData[i].species][j];
+ personalityValue += nameHash << 8;
+ fixedIV = partyData[i].iv * 31 / 255;
+ CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
+ break;
+ }
+ case 1:
+ {
+ struct TrainerPartyMember1 *partyData = gTrainers[trainerNum].party;
+
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ nameHash += gSpeciesNames[partyData[i].species][j];
+ personalityValue += nameHash << 8;
+ fixedIV = partyData[i].iv * 31 / 255;
+ CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
+
+ for (j = 0; j < 4; j++)
{
- struct TrainerPartyMember0 *partyData = gTrainers[trainerNum].party;
+ SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]);
+ SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
+ }
+ break;
+ }
+ case 2:
+ {
+ struct TrainerPartyMember2 *partyData = gTrainers[trainerNum].party;
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
- nameHash += gSpeciesNames[partyData[i].species][j];
- personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
- break;
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ nameHash += gSpeciesNames[partyData[i].species][j];
+ personalityValue += nameHash << 8;
+ fixedIV = partyData[i].iv * 31 / 255;
+ CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
+
+ SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem);
+ break;
+ }
+ case 3:
+ {
+ struct TrainerPartyMember3 *partyData = gTrainers[trainerNum].party;
+
+ for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
+ nameHash += gSpeciesNames[partyData[i].species][j];
+ personalityValue += nameHash << 8;
+ fixedIV = partyData[i].iv * 31 / 255;
+ CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
+
+ SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem);
+ for (j = 0; j < 4; j++)
+ {
+ SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]);
+ SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
}
- case 1:
+ break;
+ }
+ }
+ }
+ gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle;
+ }
+ return gTrainers[trainerNum].partySize;
+}
+
+void sub_800FCD4(void)
+{
+ if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F )
+ REG_BG0CNT = 0x9800;
+}
+
+void sub_800FCFC(void)
+{
+ Random(); // unused return value
+ REG_BG0HOFS = gUnknown_030042A4;
+ REG_BG0VOFS = gUnknown_030042A0;
+ REG_BG1HOFS = gUnknown_030042C0;
+ REG_BG1VOFS = gUnknown_030041B4;
+ REG_BG2HOFS = gUnknown_03004288;
+ REG_BG2VOFS = gUnknown_03004280;
+ REG_BG3HOFS = gUnknown_030041B0;
+ REG_BG3VOFS = gUnknown_030041B8;
+ REG_WIN0H = gUnknown_030042C4;
+ REG_WIN0V = gUnknown_03004240;
+ REG_WIN1H = gUnknown_03004200;
+ REG_WIN1V = gUnknown_03004244;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_8089668();
+}
+
+void nullsub_36(struct Sprite *sprite)
+{
+}
+
+void sub_800FDB0(struct Sprite *sprite)
+{
+ if (sprite->data0 != 0)
+ sprite->pos1.x = sprite->data1 + ((sprite->data2 & 0xFF00) >> 8);
+ else
+ sprite->pos1.x = sprite->data1 - ((sprite->data2 & 0xFF00) >> 8);
+ sprite->data2 += 0x180;
+ if (sprite->affineAnimEnded)
+ {
+ FreeSpriteTilesByTag(0x2710);
+ FreeSpritePaletteByTag(0x2710);
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+}
+
+void sub_800FE20(struct Sprite *sprite)
+{
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->callback = sub_800FDB0;
+ PlaySE(SE_BT_START);
+}
+
+void sub_800FE40(u8 taskId)
+{
+ struct Pokemon *sp4 = NULL;
+ struct Pokemon *sp8 = NULL;
+ u8 r2 = ewram160CB;
+ u32 r7;
+ s32 i;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ switch (gLinkPlayers[r2].lp_field_18)
+ {
+ case 0:
+ case 2:
+ sp4 = gPlayerParty;
+ sp8 = gEnemyParty;
+ break;
+ case 1:
+ case 3:
+ sp4 = gEnemyParty;
+ sp8 = gPlayerParty;
+ break;
+ }
+ }
+ else
+ {
+ sp4 = gPlayerParty;
+ sp8 = gEnemyParty;
+ }
+
+ r7 = 0;
+ for (i = 0; i < 6; i++)
+ {
+ u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2);
+ u16 hp = GetMonData(&sp4[i], MON_DATA_HP);
+ u32 status = GetMonData(&sp4[i], MON_DATA_STATUS);
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp != 0 && status == 0)
+ r7 |= 1 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (hp != 0 && (species == SPECIES_EGG || status != 0))
+ r7 |= 2 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp == 0)
+ r7 |= 3 << i * 2;
+ }
+ gTasks[taskId].data[3] = r7;
+
+ r7 = 0;
+ for (i = 0; i < 6; i++)
+ {
+ u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2);
+ u16 hp = GetMonData(&sp8[i], MON_DATA_HP);
+ u32 status = GetMonData(&sp8[i], MON_DATA_STATUS);
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp != 0 && status == 0)
+ r7 |= 1 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (hp != 0 && (species == SPECIES_EGG || status != 0))
+ r7 |= 2 << i * 2;
+
+ if (species == 0)
+ continue;
+ if (species != SPECIES_EGG && hp == 0)
+ r7 |= 3 << i * 2;
+ }
+ gTasks[taskId].data[4] = r7;
+}
+
+void c2_8011A1C(void)
+{
+ s32 i;
+ u8 taskId;
+
+ SetHBlankCallback(NULL);
+ SetVBlankCallback(NULL);
+ CpuFill32(0, (void *)VRAM, VRAM_SIZE);
+ REG_MOSAIC = 0;
+ REG_WIN0H = 0xF0;
+ REG_WIN0V = 0x5051;
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ gUnknown_030042C4 = 0xF0;
+ gUnknown_03004240 = 0x5051;
+ dp12_8087EA4();
+
+ for (i = 0; i < 80; i++)
+ {
+ gUnknown_03004DE0.unk0[i] = 0xF0;
+ gUnknown_03004DE0.unk780[i] = 0xF0;
+ }
+ for (i = 80; i < 160; i++)
+ {
+ asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
+ gUnknown_03004DE0.unk0[i] = 0xFF10;
+ gUnknown_03004DE0.unk780[i] = 0xFF10;
+ }
+ SetUpWindowConfig(&gWindowConfig_81E6C58);
+ ResetPaletteFade();
+ gUnknown_030042A4 = 0;
+ gUnknown_030042A0 = 0;
+ gUnknown_030042C0 = 0;
+ gUnknown_030041B4 = 0;
+ gUnknown_03004288 = 0;
+ gUnknown_03004280 = 0;
+ gUnknown_030041B0 = 0;
+ gUnknown_030041B8 = 0;
+
+ InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
+ InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0);
+ InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC);
+ sub_800D6D4();
+ LoadCompressedPalette(gUnknown_08D004E0, 0, 64);
+ sub_800D74C();
+ ResetSpriteData();
+ ResetTasks();
+ sub_800E23C();
+ REG_WINOUT = 0x37;
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 4;
+ SetVBlankCallback(sub_800FCFC);
+ taskId = CreateTask(sub_800DE30, 0);
+ gTasks[taskId].data[1] = 0x10E;
+ gTasks[taskId].data[2] = 0x5A;
+ gTasks[taskId].data[5] = 1;
+ sub_800FE40(taskId);
+ SetMainCallback2(sub_80101B8);
+ gUnknown_02024D1E[0] = 0;
+}
+
+void sub_80101B8(void)
+{
+ c2_081284E0();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ RunTasks();
+}
+
+void c2_081284E0(void)
+{
+ switch (gUnknown_02024D1E[0])
+ {
+ case 0:
+ gUnknown_02024D1E[1] = 0xFF;
+ gUnknown_02024D1E[0]++;
+ break;
+ case 1:
+ gUnknown_02024D1E[1]--;
+ if (gUnknown_02024D1E[1] == 0)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gUnknown_02024D1E[0]++;
+ }
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ SetMainCallback2(gMain.savedCallback);
+ break;
+ }
+}
+
+void oac_poke_opponent(struct Sprite *sprite)
+{
+ sprite->callback = sub_8010278;
+ StartSpriteAnimIfDifferent(sprite, 0);
+ BeginNormalPaletteFade(0x00020000, 0, 10, 10, 0x3DEF);
+}
+
+void sub_8010278(struct Sprite *sprite)
+{
+ if ((gUnknown_02024DE8 & 1) == 0)
+ {
+ sprite->pos2.x += 2;
+ if (sprite->pos2.x == 0)
+ {
+ sprite->callback = sub_80102AC;
+ PlayCry1(sprite->data2, 25);
+ }
+ }
+}
+
+void sub_80102AC(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ sub_804777C(sprite->data0);
+ sub_8043DFC(gUnknown_03004340[sprite->data0]);
+ sprite->callback = nullsub_37;
+ StartSpriteAnimIfDifferent(sprite, 0);
+ BeginNormalPaletteFade(0x00020000, 0, 10, 0, 0x3DEF);
+ }
+}
+
+void nullsub_37(struct Sprite *sprite)
+{
+}
+
+void unref_sub_801030C(struct Sprite *sprite)
+{
+ sprite->data3 = 6;
+ sprite->data4 = 1;
+ sprite->callback = sub_8010320;
+}
+
+void sub_8010320(struct Sprite *sprite)
+{
+ sprite->data4--;
+ if (sprite->data4 == 0)
+ {
+ sprite->data4 = 8;
+ sprite->invisible ^= 1;
+ sprite->data3--;
+ if (sprite->data3 == 0)
+ {
+ sprite->invisible = FALSE;
+ sprite->callback = nullsub_37;
+ gUnknown_03004284 = 0;
+ }
+ }
+}
+
+void sub_8010384(struct Sprite *sprite)
+{
+ u8 r6 = sprite->data0;
+ u16 species;
+ u8 yOffset;
+
+ if (ewram17800[r6].unk2 != 0)
+ species = ewram17800[r6].unk2;
+ else
+ species = sprite->data2;
+
+ GetMonData(&gEnemyParty[gUnknown_02024A6A[r6]], MON_DATA_PERSONALITY); // Unused return value
+
+ if (species == SPECIES_UNOWN)
+ {
+ u32 personalityValue = GetMonData(&gEnemyParty[gUnknown_02024A6A[r6]], MON_DATA_PERSONALITY);
+ u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C);
+ u16 unownSpecies;
+
+ if (unownForm == 0)
+ unownSpecies = SPECIES_UNOWN; // Use the A Unown form
+ else
+ unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters
+
+ yOffset = gMonFrontPicCoords[unownSpecies].y_offset;
+ }
+ else if (species == SPECIES_CASTFORM)
+ {
+ yOffset = gCastformFrontSpriteCoords[gBattleMonForms[r6]].y_offset;
+ }
+ else if (species > NUM_SPECIES)
+ {
+ yOffset = gMonFrontPicCoords[SPECIES_NONE].y_offset;
+ }
+ else
+ {
+ yOffset = gMonFrontPicCoords[species].y_offset;
+ }
+
+ sprite->data3 = 8 - yOffset / 8;
+ sprite->data4 = 1;
+ sprite->callback = sub_8010494;
+}
+
+void sub_8010494(struct Sprite *sprite)
+{
+ s32 i;
+
+ sprite->data4--;
+ if (sprite->data4 == 0)
+ {
+ sprite->data4 = 2;
+ sprite->pos2.y += 8;
+ sprite->data3--;
+ if (sprite->data3 < 0)
+ {
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+ else
+ {
+ u8 *dst = (u8 *)gUnknown_081FAF4C[battle_get_per_side_status(sprite->data0)] + (gBattleMonForms[sprite->data0] << 11) + (sprite->data3 << 8);
+
+ for (i = 0; i < 0x100; i++)
+ *(dst++) = 0;
+ StartSpriteAnim(sprite, gBattleMonForms[sprite->data0]);
+ }
+ }
+}
+
+void sub_8010520(struct Sprite *sprite)
+{
+ sprite->data3 = 8;
+ sprite->data4 = sprite->invisible;
+ sprite->callback = sub_801053C;
+}
+
+void sub_801053C(struct Sprite *sprite)
+{
+ sprite->data3--;
+ if (sprite->data3 == 0)
+ {
+ sprite->invisible ^= 1;
+ sprite->data3 = 8;
+ }
+}
+
+void sub_8010574(struct Sprite *sprite)
+{
+ sprite->invisible = sprite->data4;
+ sprite->data4 = FALSE;
+ sprite->callback = nullsub_37;
+}
+
+void sub_80105A0(struct Sprite *sprite)
+{
+ sprite->callback = oac_poke_ally_;
+}
+
+void oac_poke_ally_(struct Sprite *sprite)
+{
+ if ((gUnknown_02024DE8 & 1) == 0)
+ {
+ sprite->pos2.x -= 2;
+ if (sprite->pos2.x == 0)
+ {
+ sprite->callback = nullsub_86;
+ sprite->data1 = 0;
+ }
+ }
+}
+
+void sub_80105DC(struct Sprite *sprite)
+{
+ sprite->callback = nullsub_86;
+}
+
+void nullsub_86(struct Sprite *sprite)
+{
+}
+
+void sub_80105EC(struct Sprite *sprite)
+{
+ if ((gUnknown_02024DE8 & 1) == 0)
+ {
+ sprite->pos2.x += sprite->data1;
+ sprite->pos2.y += sprite->data2;
+ }
+}
+
+void dp11b_obj_instanciate(u8 a, u8 b, s8 c, s8 d)
+{
+ u8 spriteId;
+ u8 r7;
+
+ if (b)
+ {
+ if (ewram17810[a].unk0_1)
+ return;
+ }
+ else
+ {
+ if (ewram17810[a].unk0_2)
+ return;
+ }
+
+ spriteId = CreateInvisibleSpriteWithCallback(objc_dp11b_pingpong);
+ if (b == TRUE)
+ {
+ r7 = gUnknown_03004340[a];
+ ewram17810[a].unk2 = spriteId;
+ ewram17810[a].unk0_1 = 1;
+ gSprites[spriteId].data0 = 0x80;
+ }
+ else
+ {
+ r7 = gUnknown_02024BE0[a];
+ ewram17810[a].unk3 = spriteId;
+ ewram17810[a].unk0_2 = 1;
+ gSprites[spriteId].data0 = 0xC0;
+ }
+ gSprites[spriteId].data1 = c;
+ gSprites[spriteId].data2 = d;
+ gSprites[spriteId].data3 = r7;
+ gSprites[spriteId].data4 = b;
+ gSprites[r7].pos2.x = 0;
+ gSprites[r7].pos2.y = 0;
+}
+
+void dp11b_obj_free(u8 a, u8 b)
+{
+ u8 r4;
+
+ if (b == TRUE)
+ {
+ if (!ewram17810[a].unk0_1)
+ return;
+ r4 = gSprites[ewram17810[a].unk2].data3;
+ DestroySprite(&gSprites[ewram17810[a].unk2]);
+ ewram17810[a].unk0_1 = 0;
+ }
+ else
+ {
+ if (!ewram17810[a].unk0_2)
+ return;
+ r4 = gSprites[ewram17810[a].unk3].data3;
+ DestroySprite(&gSprites[ewram17810[a].unk3]);
+ ewram17810[a].unk0_2 = 0;
+ }
+ gSprites[r4].pos2.x = 0;
+ gSprites[r4].pos2.y = 0;
+}
+
+void objc_dp11b_pingpong(struct Sprite *sprite)
+{
+ u8 spriteId = sprite->data3;
+ s32 var;
+
+ if (sprite->data4 == 1)
+ var = sprite->data0;
+ else
+ var = sprite->data0;
+
+ gSprites[spriteId].pos2.y = Sin(var, sprite->data2) + sprite->data2;
+ sprite->data0 = (sprite->data0 + sprite->data1) & 0xFF;
+}
+
+void nullsub_41(void)
+{
+}
+
+void sub_8010800(void)
+{
+ sub_8010874();
+ gUnknown_02024D1E[1] = 0;
+ gUnknown_030042D4 = bc_8012FAC;
+}
+
+void sub_8010824(void)
+{
+ gUnknown_030042D4();
+ gUnknown_02024A60 = 0;
+
+ for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++)
+ gUnknown_03004330[gUnknown_02024A60]();
+}
+
+void sub_8010874(void)
+{
+ s32 i;
+ s32 j;
+ u8 *r4;
+
+ sub_801365C(0);
+ sub_801377C();
+
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_02024C98[i] = 0;
+
+ r4 = (u8 *)&gUnknown_02024CA8[i];
+ for (j = 0; j < (u32)0x1C; j++)
+ r4[j] = 0;
+
+ gUnknown_02024CA8[i].unk16 = 2;
+ gUnknown_02024C70[i] = 0;
+ gUnknown_02024C34[i] = 0;
+ gUnknown_02024C3C[i] = 0;
+ gUnknown_02024C44[i] = 0;
+ gUnknown_02024C4C[i] = 0;
+ gUnknown_02024C5C[i] = 0xFF;
+ gUnknown_02024C54[i] = 0;
+ gUnknown_02024C2C[i] = 0;
+ ewram17100[i] = 0;
+ }
+
+ for (i = 0; i < 2; i++)
+ {
+ gUnknown_02024C7A[i] = 0;
+
+ r4 = (u8 *)&gUnknown_02024C80[i];
+ for (j = 0; j < (u32)12; j++)
+ r4[j] = 0;
+ }
+
+ gPlayerMonIndex = 0;
+ gEnemyMonIndex = 0;
+ gBattleWeather = 0;
+
+ r4 = (u8 *)&gUnknown_02024DBC;
+ for (i = 0; i < (u32)0x2C; i++)
+ r4[i] = 0;
+
+ gUnknown_02024C6C = 0;
+ if ((gBattleTypeFlags & 2) == 0 && gSaveBlock2.optionsBattleSceneOff == TRUE)
+ gUnknown_02024C6C = 0x80;
+ ewram16084 = gSaveBlock2.optionsBattleStyle;
+ gUnknown_02024C0E = 0;
+ gUnknown_02024D26 = 0;
+ gUnknown_02024A64 = 0;
+ gUnknown_02024D1A = 0;
+ ewram17130 = 0;
+ ewram17160 = 0;
+ for (i = 0; i < 8; i++)
+ gUnknown_02024D1E[i] = 0;
+ gUnknown_02024D18 = 0;
+ gBattleMoveDamage = 0;
+ gUnknown_02024DE8 = 0;
+ ewram16002 = 0;
+ ewram160A1 = 0;
+ gUnknown_03004324 = 0;
+ gUnknown_02024C0C = 0;
+ ewram16078 = 0;
+ ewram16086 = 0;
+ ewram16087 = 0;
+ ewram16089 = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275;
+ ewram16088 = 3;
+ ewram1601B = 0;
+ ewram16056 = 1;
+
+ for (i = 0; i < 8; i++)
+ {
+ ewram[i + 0x160AC] = 0;
+ ewram[i + 0x160CC] = 0;
+ ewram[i + 0x160E8] = 0;
+ ewram[i + 0x160F0] = 0;
+ ewram[i + 0x16100] = 0;
+ ewram[i + 0x16108] = 0;
+ }
+
+ ewram160C8 = 6;
+ ewram160C9 = 6;
+ ewram16113 = 0;
+ for (i = 0; i < 11; i++)
+ gUnknown_030042E0.unk36[i] = 0;
+ gUnknown_030042E0.unk13 = 0;
+ gUnknown_030042E0.unk0 = 0;
+ gUnknown_030042E0.unk1 = 0;
+ gUnknown_030042E0.unk2 = 0;
+ gUnknown_030042E0.unk3 = 0;
+ gUnknown_030042E0.unk4 = 0;
+ gUnknown_030042E0.unk5_0 = 0;
+ gUnknown_030042E0.unk5_1 = 0;
+ gUnknown_030042E0.unk20 = 0;
+ gUnknown_030042E0.unk22 = 0;
+ gUnknown_030042E0.unk24 = 0;
+ gUnknown_030042E0.unk6 = 0;
+ gUnknown_030042E0.unk26 = 0;
+ gUnknown_030042E0.unk28 = 0;
+ for (i = 0; i < 10; i++)
+ {
+ gUnknown_030042E0.unk8[i] = 0;
+ gUnknown_030042E0.unk14[i] = 0;
+ gUnknown_030042E0.unk2A[i] = 0;
+ }
+}
+
+void sub_8010B88(void)
+{
+ struct UnknownStruct4 sp0 = gUnknown_02024CA8[gUnknown_02024A60];
+ s32 i;
+ u8 *ptr;
+ u32 *ptr2;
+
+ if (gBattleMoves[gUnknown_02024BE6].effect != 0x7F)
+ {
+ for (i = 0; i < 8; i++)
+ gBattleMons[gUnknown_02024A60].statStages[i] = 6;
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ struct UnknownStruct12 *sp20 = &gUnknown_02024AD0[i];
+
+ if ((sp20->unk0 & 0x04000000) && gUnknown_02024CA8[i].unk14 == gUnknown_02024A60)
+ sp20->unk0 &= ~0x04000000;
+ if ((gUnknown_02024C98[i] & 0x18) && gUnknown_02024CA8[i].unk15 == gUnknown_02024A60)
+ {
+ gUnknown_02024C98[i] &= ~0x18;
+ gUnknown_02024CA8[i].unk15 = 0;
+ }
+ }
+ }
+ if (gBattleMoves[gUnknown_02024BE6].effect == 0x7F)
+ {
+ gBattleMons[gUnknown_02024A60].status2 &= 0x15100007;
+ gUnknown_02024C98[gUnknown_02024A60] &= 0x3043F;
+
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ if (battle_side_get_owner(gUnknown_02024A60) != battle_side_get_owner(i)
+ && (gUnknown_02024C98[i] & 0x18) != 0
+ && (gUnknown_02024CA8[i].unk15 == gUnknown_02024A60))
+ {
+ gUnknown_02024C98[i] &= ~0x18;
+ gUnknown_02024C98[i] |= 0x10;
+ }
+ }
+ }
+ else
+ {
+ gBattleMons[gUnknown_02024A60].status2 = 0;
+ gUnknown_02024C98[gUnknown_02024A60] = 0;
+ }
+
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ if (gUnknown_02024AD0[i].unk0 & (gBitTable[gUnknown_02024A60] << 16))
+ gUnknown_02024AD0[i].unk0 &= ~(gBitTable[gUnknown_02024A60] << 16);
+ if ((gUnknown_02024AD0[i].unk0 & 0xE000) && ewram[0x16020 + i] == gUnknown_02024A60)
+ gUnknown_02024AD0[i].unk0 &= ~0xE000;
+ }
+
+ gUnknown_02024E60[gUnknown_02024A60] = 0;
+ gUnknown_02024E64[gUnknown_02024A60] = 0;
+
+ ptr = (u8 *)&gUnknown_02024CA8[gUnknown_02024A60];
+ for (i = 0; i < (u32)0x1C; i++)
+ ptr[i] = 0;
+
+ if (gBattleMoves[gUnknown_02024BE6].effect == 0x7F)
+ {
+ gUnknown_02024CA8[gUnknown_02024A60].unkA = sp0.unkA;
+ gUnknown_02024CA8[gUnknown_02024A60].unk15 = sp0.unk15;
+ gUnknown_02024CA8[gUnknown_02024A60].unkF_0 = sp0.unkF_0;
+ gUnknown_02024CA8[gUnknown_02024A60].unkF_4 = sp0.unkF_4;
+ }
+
+ gUnknown_02024CA8[gUnknown_02024A60].unk16 = 2;
+ gUnknown_02024C34[gUnknown_02024A60] = 0;
+ gUnknown_02024C3C[gUnknown_02024A60] = 0;
+ gUnknown_02024C44[gUnknown_02024A60] = 0;
+ gUnknown_02024C4C[gUnknown_02024A60] = 0;
+ gUnknown_02024C2C[gUnknown_02024A60] = 0;
+ gUnknown_02024C5C[gUnknown_02024A60] = 0xFF;
+
+ ewram[0x160AC + gUnknown_02024A60 * 2 + 0] = 0;
+ ewram[0x160AC + gUnknown_02024A60 * 2 + 1] = 0;
+ ewram[0x16100 + gUnknown_02024A60 * 4 + 0] = 0;
+ ewram[0x16100 + gUnknown_02024A60 * 4 + 1] = 0;
+ ewram[0x16100 + gUnknown_02024A60 * 4 + 2] = 0;
+ ewram[0x16100 + gUnknown_02024A60 * 4 + 3] = 0;
+ ewram[0x160E8 + gUnknown_02024A60 * 2 + 0] = 0;
+ ewram[0x160E8 + gUnknown_02024A60 * 2 + 1] = 0;
+
+ ptr2 = (u32 *)(ewram + 0x17100);
+ ptr2[gUnknown_02024A60] = 0;
+
+ gUnknown_02024BE6 = 0;
+}
+
+void sub_8010F48(void)
+{
+ s32 i;
+ u8 *ptr;
+ u32 *ptr2;
+
+ for (i = 0; i < 8; i++)
+ gBattleMons[gUnknown_02024A60].statStages[i] = 6;
+ gBattleMons[gUnknown_02024A60].status2 = 0;
+ gUnknown_02024C98[gUnknown_02024A60] = 0;
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ if ((gBattleMons[i].status2 & 0x4000000) && gUnknown_02024CA8[i].unk14 == gUnknown_02024A60)
+ gBattleMons[i].status2 &= ~0x4000000;
+ if (gBattleMons[i].status2 & (gBitTable[gUnknown_02024A60] << 16))
+ gBattleMons[i].status2 &= ~(gBitTable[gUnknown_02024A60] << 16);
+ if ((gBattleMons[i].status2 & 0xE000) && ewram[0x16020 + i] == gUnknown_02024A60)
+ gBattleMons[i].status2 &= ~0xE000;
+ }
+ gUnknown_02024E60[gUnknown_02024A60] = 0;
+ gUnknown_02024E64[gUnknown_02024A60] = 0;
+
+ ptr = (u8 *)&gUnknown_02024CA8[gUnknown_02024A60];
+ for (i = 0; i < (u32)0x1C; i++)
+ ptr[i] = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk0_0 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk0_1 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk0_2 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk0_3 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk0_4 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk0_5 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk0_6 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk0_7 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk1_0 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk1_1 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk1_2 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk1_3 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk1_5 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk1_6 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk1_7 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk2_0 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk2_1 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk2_2 = 0;
+ gUnknown_02024D28[gUnknown_02024A60].unk2_3 = 0;
+
+ gUnknown_02024CA8[gUnknown_02024A60].unk16 = 2;
+ gUnknown_02024C34[gUnknown_02024A60] = 0;
+ gUnknown_02024C3C[gUnknown_02024A60] = 0;
+ gUnknown_02024C44[gUnknown_02024A60] = 0;
+ gUnknown_02024C4C[gUnknown_02024A60] = 0;
+ gUnknown_02024C2C[gUnknown_02024A60] = 0;
+ gUnknown_02024C5C[gUnknown_02024A60] = 0xFF;
+
+ ewram[0x160E8 + gUnknown_02024A60 * 2 + 0] = 0;
+ ewram[0x160E8 + gUnknown_02024A60 * 2 + 1] = 0;
+ ewram[0x160AC + gUnknown_02024A60 * 2 + 0] = 0;
+ ewram[0x160AC + gUnknown_02024A60 * 2 + 1] = 0;
+ ewram[0x16100 + gUnknown_02024A60 * 4 + 0] = 0;
+ ewram[0x16100 + gUnknown_02024A60 * 4 + 1] = 0;
+ ewram[0x16100 + gUnknown_02024A60 * 4 + 2] = 0;
+ ewram[0x16100 + gUnknown_02024A60 * 4 + 3] = 0;
+
+ ptr2 = (u32 *)(ewram + 0x17100);
+ ptr2[gUnknown_02024A60] = 0;
+
+ gBattleMons[gUnknown_02024A60].type1 = gBaseStats[gBattleMons[gUnknown_02024A60].species].type1;
+ gBattleMons[gUnknown_02024A60].type2 = gBaseStats[gBattleMons[gUnknown_02024A60].species].type2;
+}
+
+void bc_8012FAC(void)
+{
+ switch (gUnknown_02024D1E[0])
+ {
+ case 0:
+ gUnknown_02024A60 = gUnknown_02024D1E[1];
+ dp01_build_cmdbuf_x00_a_b_0(0, 0, 0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ gUnknown_02024D1E[0]++;
+ break;
+ case 1:
+ if (gUnknown_02024A64 == 0)
+ {
+ gUnknown_02024D1E[1]++;
+ if (gUnknown_02024D1E[1] == gUnknown_02024A68)
+ gUnknown_030042D4 = bc_load_battlefield;
+ else
+ gUnknown_02024D1E[0] = 0;
+ }
+ break;
+ }
+}
+
+void bc_load_battlefield(void)
+{
+ if (gUnknown_02024A64 == 0)
+ {
+ gUnknown_02024A60 = battle_get_side_with_given_state(0);
+ dp01_build_cmdbuf_x2E_a(0, gBattleTerrain);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ gUnknown_030042D4 = sub_8011384;
+ gUnknown_02024D1E[0] = 0;
+ gUnknown_02024D1E[1] = 0;
+ }
+}
+
+void sub_8011384(void)
+{
+ u8 *ptr;
+ s32 i;
+
+ if (gUnknown_02024A64 == 0)
+ {
+ for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++)
+ {
+ if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ && battle_side_get_owner(gUnknown_02024A60) == 0)
+ {
+ ptr = (u8 *)&gBattleMons[gUnknown_02024A60];
+ for (i = 0; i < (u32)0x58; i++)
+ ptr[i] = 0;
+ }
+ else
+ {
+ u8 r0;
+
+ ptr = (u8 *)&gBattleMons[gUnknown_02024A60];
+ for (i = 0; i < (u32)0x58; i++)
+ ptr[i] = gUnknown_02024260[gUnknown_02024A60][4 + i];
+
+ gBattleMons[gUnknown_02024A60].type1 = gBaseStats[gBattleMons[gUnknown_02024A60].species].type1;
+ gBattleMons[gUnknown_02024A60].type2 = gBaseStats[gBattleMons[gUnknown_02024A60].species].type2;
+ gBattleMons[gUnknown_02024A60].ability = GetAbilityBySpecies(gBattleMons[gUnknown_02024A60].species, gBattleMons[gUnknown_02024A60].altAbility);
+ r0 = battle_side_get_owner(gUnknown_02024A60);
+ ewram160BC[r0] = gBattleMons[gUnknown_02024A60].hp;
+ for (i = 0; i < 8; i++)
+ gBattleMons[gUnknown_02024A60].statStages[i] = 6;
+ gBattleMons[gUnknown_02024A60].status2 = 0;
+ }
+
+ if (battle_get_per_side_status(gUnknown_02024A60) == 0)
+ {
+ dp01_build_cmdbuf_x07_7_7_7(0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ }
+
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ if (battle_get_per_side_status(gUnknown_02024A60) == 1)
{
- struct TrainerPartyMember1 *partyData = gTrainers[trainerNum].party;
+ dp01_build_cmdbuf_x07_7_7_7(0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ }
+ if (battle_side_get_owner(gUnknown_02024A60) == 1
+ && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)))
+ GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gUnknown_02024A60].species), 2);
+ }
+ else
+ {
+ if (battle_side_get_owner(gUnknown_02024A60) == 1
+ && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)))
+ {
+ GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gUnknown_02024A60].species), 2);
+ dp01_build_cmdbuf_x04_4_4_4(0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ }
+ }
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
- nameHash += gSpeciesNames[partyData[i].species][j];
- personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
+ if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ {
+ if (battle_get_per_side_status(gUnknown_02024A60) == 2
+ || battle_get_per_side_status(gUnknown_02024A60) == 3)
+ {
+ dp01_build_cmdbuf_x07_7_7_7(0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ }
+ }
+ }
+ gUnknown_030042D4 = bc_801333C;
+ }
+}
- for (j = 0; j < 4; j++)
- {
- SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]);
- SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
- }
- break;
+void bc_801333C(void)
+{
+ s32 i;
+
+ if (gUnknown_02024A64 == 0)
+ {
+ struct
+ {
+ u16 hp;
+ u32 status;
+ } sp0[6];
+
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ {
+ for (i = 0; i < 6; i++)
+ {
+ if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == 0
+ || GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ {
+ sp0[i].hp = 0xFFFF;
+ sp0[i].status = 0;
}
- case 2:
+ else
{
- struct TrainerPartyMember2 *partyData = gTrainers[trainerNum].party;
+ sp0[i].hp = GetMonData(&gEnemyParty[i], MON_DATA_HP);
+ sp0[i].status = GetMonData(&gEnemyParty[i], MON_DATA_STATUS);
+ }
+ }
+ gUnknown_02024A60 = battle_get_side_with_given_state(1);
+ dp01_build_cmdbuf_x30_TODO(0, (u8 *)sp0, 0x80);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
- nameHash += gSpeciesNames[partyData[i].species][j];
- personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
+ for (i = 0; i < 6; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0
+ || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ {
+ sp0[i].hp = 0xFFFF;
+ sp0[i].status = 0;
+ }
+ else
+ {
+ sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
+ }
+ }
+ gUnknown_02024A60 = battle_get_side_with_given_state(0);
+ dp01_build_cmdbuf_x30_TODO(0, (u8 *)sp0, 0x80);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
- SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem);
- break;
+ gUnknown_030042D4 = bc_battle_begin_message;
+ }
+ else
+ {
+ // The array gets set here, but nothing is ever done with it.
+ // Likely unfinished code.
+
+ for (i = 0; i < 6; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == 0
+ || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
+ {
+ sp0[i].hp = 0xFFFF;
+ sp0[i].status = 0;
}
- case 3:
+ else
{
- struct TrainerPartyMember3 *partyData = gTrainers[trainerNum].party;
+ sp0[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ sp0[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
+ }
+ }
- for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
- nameHash += gSpeciesNames[partyData[i].species][j];
- personalityValue += nameHash << 8;
- fixedIV = partyData[i].iv * 31 / 255;
- CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
+ gUnknown_030042D4 = bc_8013568;
+ }
+ }
+}
- SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem);
- for (j = 0; j < 4; j++)
- {
- SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]);
- SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
- }
- break;
+void bc_battle_begin_message(void)
+{
+ if (gUnknown_02024A64 == 0)
+ {
+ gUnknown_02024A60 = battle_get_side_with_given_state(1);
+ b_std_message(0, gUnknown_02024A60);
+ gUnknown_030042D4 = sub_8011800;
+ }
+}
+
+void bc_8013568(void)
+{
+ if (gUnknown_02024A64 == 0)
+ {
+ gUnknown_030042D4 = sub_8011970;
+ b_std_message(0, 0);
+ }
+}
+
+void sub_8011800(void)
+{
+ if (gUnknown_02024A64 == 0)
+ {
+ b_std_message(1, battle_get_side_with_given_state(1));
+ gUnknown_030042D4 = sub_8011834;
+ }
+}
+
+void sub_8011834(void)
+{
+ if (gUnknown_02024A64 == 0)
+ {
+ for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++)
+ {
+ if (battle_get_per_side_status(gUnknown_02024A60) == 1)
+ {
+ dp01_build_cmdbuf_x2F_2F_2F_2F(0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ }
+ if ((gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ && battle_get_per_side_status(gUnknown_02024A60) == 3)
+ {
+ dp01_build_cmdbuf_x2F_2F_2F_2F(0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ }
+ }
+ gUnknown_030042D4 = bc_801362C;
+ }
+}
+
+void bc_801362C(void)
+{
+ if (gUnknown_02024A64 == 0)
+ {
+ for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++)
+ {
+ if (battle_side_get_owner(gUnknown_02024A60) == 1
+ && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)))
+ GetNationalPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gUnknown_02024A60].species), 2);
+ }
+ gUnknown_030042D4 = sub_8011970;
+ }
+}
+
+void unref_sub_8011950(void)
+{
+ if (gUnknown_02024A64 == 0)
+ gUnknown_030042D4 = sub_8011970;
+}
+
+void sub_8011970(void)
+{
+ if (gUnknown_02024A64 == 0)
+ {
+ if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
+ b_std_message(1, battle_get_side_with_given_state(0));
+ gUnknown_030042D4 = sub_80119B4;
+ }
+}
+
+void sub_80119B4(void)
+{
+ if (gUnknown_02024A64 == 0)
+ {
+ for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++)
+ {
+ if (battle_get_per_side_status(gUnknown_02024A60) == 0)
+ {
+ dp01_build_cmdbuf_x2F_2F_2F_2F(0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ }
+ if ((gBattleTypeFlags & BATTLE_TYPE_MULTI)
+ && battle_get_per_side_status(gUnknown_02024A60) == 2)
+ {
+ dp01_build_cmdbuf_x2F_2F_2F_2F(0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ }
+ }
+ ewram16058 = 0;
+ ewram160F9 = 0;
+ ewram160E6 = 0;
+ gUnknown_030042D4 = sub_8011B00;
+ }
+}
+
+void unref_sub_8011A68(void)
+{
+ if (gUnknown_02024A64 == 0)
+ {
+ for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++)
+ {
+ if (battle_side_get_owner(gUnknown_02024A60) == 0)
+ {
+ sub_800C704(0, gUnknown_02024A6A[gUnknown_02024A60], 0);
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ }
+ }
+ ewram16058 = 0;
+ ewram160F9 = 0;
+ ewram160E6 = 0;
+ gUnknown_030042D4 = sub_8011B00;
+ }
+}
+
+void sub_8011B00(void)
+{
+ s32 i;
+ s32 j;
+ u8 r9 = 0;
+
+ if (gUnknown_02024A64 == 0)
+ {
+ if (ewram16058 == 0)
+ {
+ for (i = 0; i < gUnknown_02024A68; i++)
+ gUnknown_02024A7A[i] = i;
+ for (i = 0; i < gUnknown_02024A68 - 1; i++)
+ {
+ for (j = i + 1; j < gUnknown_02024A68; j++)
+ {
+ if (b_first_side(gUnknown_02024A7A[i], gUnknown_02024A7A[j], 1) != 0)
+ sub_8012FBC(i, j);
}
}
}
- gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle;
+ if (ewram160E6 == 0 && sub_8018324(0, 0, 0, 0xFF, 0) != 0)
+ {
+ ewram160E6 = 1;
+ return;
+ }
+ while (ewram16058 < gUnknown_02024A68)
+ {
+ if (sub_8018324(0, gUnknown_02024A7A[ewram16058], 0, 0, 0) != 0)
+ r9++;
+ ewram16058++;
+ if (r9 != 0)
+ return;
+ }
+ if (sub_8018324(9, 0, 0, 0, 0) != 0)
+ return;
+ if (sub_8018324(11, 0, 0, 0, 0) != 0)
+ return;
+ while (ewram160F9 < gUnknown_02024A68)
+ {
+ if (sub_801A02C(0, gUnknown_02024A7A[ewram160F9], 0) != 0)
+ r9++;
+ ewram160F9++;
+ if (r9 != 0)
+ return;
+ }
+ // Absolutely pointless for-loop that somehow doesn't get optimized out
+ for (i = 0; i < gUnknown_02024A68; i++)
+ ;
+ for (i = 0; i < 4; i++)
+ {
+ ewram[0x16068 + i] = 6;
+ gUnknown_02024C18[i] = 0xFF;
+ gUnknown_02024C60[i] = 0;
+ }
+ sub_801365C(0);
+ sub_801377C();
+ ewram160A6 = gUnknown_02024C0C;
+ gUnknown_030042D4 = sub_8012324;
+ sub_80156DC();
+ for (i = 0; i < 8; i++)
+ gUnknown_02024D1E[i] = 0;
+ for (i = 0; i < gUnknown_02024A68; i++)
+ gBattleMons[i].status2 &= ~8;
+ ewram16000 = 0;
+ ewram16001 = 0;
+ ewram16110 = 0;
+ ewram16111 = 0;
+ ewram1600C = 0;
+ ewram16059 = 0;
+ ewram1600E = 0;
+ gBattleMoveFlags = 0;
+ gUnknown_02024D1C = Random();
}
- return gTrainers[trainerNum].partySize;
-} \ No newline at end of file
+}
+
+void bc_8013B1C(void)
+{
+ s32 i;
+
+ if (gUnknown_02024A64 == 0)
+ {
+ gUnknown_030042D4 = sub_8011E8C;
+ for (i = 0; i < 8; i++)
+ gUnknown_02024D1E[i] = 0;
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ gBattleMons[i].status2 &= ~8;
+ if ((gBattleMons[i].status1 & 7) && (gBattleMons[i].status2 & 0x1000))
+ b_cancel_multi_turn_move_maybe(i);
+ }
+ ewram16000 = 0;
+ ewram16001 = 0;
+ ewram16110 = 0;
+ ewram16111 = 0;
+ ewram1600E = 0;
+ gBattleMoveFlags = 0;
+ }
+}
+
+void sub_8011E8C(void)
+{
+ s32 i;
+
+ sub_801365C(1);
+ if (gUnknown_02024D26 == 0)
+ {
+ if (sub_8015DFC() != 0)
+ return;
+ if (sub_8016558() != 0)
+ return;
+ }
+ if (sub_80173A4() != 0)
+ return;
+ ewram16059 = 0;
+ if (sub_80170DC() != 0)
+ return;
+ sub_801365C(0);
+ gUnknown_02024C6C &= ~0x200;
+ gUnknown_02024C6C &= ~0x80000;
+ gUnknown_02024C6C &= ~0x400000;
+ gUnknown_02024C6C &= ~0x100000;
+ ewram16002 = 0;
+ ewram160A1 = 0;
+ ewram1600C = 0;
+ gBattleMoveDamage = 0;
+ gBattleMoveFlags = 0;
+ for (i = 0; i < 5; i++)
+ gUnknown_02024D1E[i] = 0;
+ if (gUnknown_02024D26 != 0)
+ {
+ gUnknown_02024A7F = 12;
+ gUnknown_030042D4 = sub_80138F0;
+ return;
+ }
+ if (gUnknown_030042E0.unk13 < 0xFF)
+ gUnknown_030042E0.unk13++;
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ gUnknown_02024C18[i] = 0xFF;
+ gUnknown_02024C60[i] = 0;
+ }
+ for (i = 0; i < 4; i++)
+ ewram[0x16068 + i] = 6;
+ ewram160A6 = gUnknown_02024C0C;
+ gUnknown_030042D4 = sub_8012324;
+ gUnknown_02024D1C = Random();
+}
+
+u8 sub_8012028(void)
+{
+ u8 r2;
+ u8 r6;
+ s32 i;
+
+ if (gBattleMons[gUnknown_02024A60].item == 0xAF)
+ r2 = gEnigmaBerries[gUnknown_02024A60].holdEffect;
+ else
+ r2 = ItemId_GetHoldEffect(gBattleMons[gUnknown_02024A60].item);
+ gUnknown_02024C0B = gUnknown_02024A60;
+ if (r2 == 0x25)
+ return 0;
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ return 0;
+ if (gBattleMons[gUnknown_02024A60].ability == ABILITY_RUN_AWAY)
+ return 0;
+ r6 = battle_side_get_owner(gUnknown_02024A60);
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ if (r6 != battle_side_get_owner(i)
+ && gBattleMons[i].ability == 0x17)
+ {
+ ewram16003 = i;
+ byte_2024C06 = gBattleMons[i].ability;
+ gUnknown_02024D1E[5] = 2;
+ return 2;
+ }
+ if (r6 != battle_side_get_owner(i)
+ && gBattleMons[gUnknown_02024A60].ability != ABILITY_LEVITATE
+ && gBattleMons[gUnknown_02024A60].type1 != 2
+ && gBattleMons[gUnknown_02024A60].type2 != 2
+ && gBattleMons[i].ability == 0x47)
+ {
+ ewram16003 = i;
+ byte_2024C06 = gBattleMons[i].ability;
+ gUnknown_02024D1E[5] = 2;
+ return 2;
+ }
+ }
+ i = sub_8018324(15, gUnknown_02024A60, 0x2A, 0, 0);
+ if (i != 0 && (gBattleMons[gUnknown_02024A60].type1 == 8 || gBattleMons[gUnknown_02024A60].type2 == 8))
+ {
+ ewram16003 = i - 1;
+ byte_2024C06 = gBattleMons[i - 1].ability;
+ gUnknown_02024D1E[5] = 2;
+ return 2;
+ }
+ if ((gBattleMons[gUnknown_02024A60].status2 & 0x0400E000) || (gUnknown_02024C98[gUnknown_02024A60] & 0x400))
+ {
+ gUnknown_02024D1E[5] = 0;
+ return 1;
+ }
+ if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
+ {
+ gUnknown_02024D1E[5] = 1;
+ return 1;
+ }
+ return 0;
+}
+
+void sub_8012258(u8 a)
+{
+ s32 i;
+ u8 r4;
+ u8 r1;
+
+ for (i = 0; i < 3; i++)
+ gUnknown_02038470[i] = ewram[0x1606C + i + a * 3];
+ r4 = pokemon_order_func(gUnknown_02024A6A[a]);
+ r1 = pokemon_order_func(ewram[0x16068 + a]);
+ sub_8094C98(r4, r1);
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ ewram[0x1606C + i + a * 3] = gUnknown_02038470[i];
+ ewram[0x1606C + i + (a ^ 2) * 3] = gUnknown_02038470[i];
+ }
+ }
+ else
+ {
+ for (i = 0; i < 3; i++)
+ {
+ ewram[0x1606C + i + a * 3] = gUnknown_02038470[i];
+ }
+ }
+}
+
+/*
+void sub_8012324(void)
+{
+ u8 r5;
+
+ gUnknown_02024D1E[4] = 0;
+ // inverted loop
+ //_0801234C
+ for (gUnknown_02024A60 = 0; gUnknown_02024A60 < gUnknown_02024A68; gUnknown_02024A60++)
+ {
+ r5 = battle_get_per_side_status(gUnknown_02024A60);
+ switch (gUnknown_02024D1E[gUnknown_02024A60])
+ {
+ case 0:
+ ewram[0x016068 + gUnknown_02024A60] = 6;
+ if (!(gBattleTypeFlags & 0x40)
+ && (r5 & 2)
+ && !(ewram160A6 & gBitTable[battle_get_side_with_given_state(r5 ^ 2)])
+ && gUnknown_02024D1E[battle_get_side_with_given_state(r5)] != 4)
+ break;
+ //_080123F8
+ if (ewram160A6 & gBitTable[gUnknown_02024A60])
+ {
+ gUnknown_02024C18[gUnknown_02024A60] = 13;
+ if (!(gBattleTypeFlags & 0x40))
+ gUnknown_02024D1E[gUnknown_02024A60] = 4;
+ //_08012454
+ else
+ gUnknown_02024D1E[gUnknown_02024A60] = 3;
+ break;
+ }
+ //_08012468
+ if ((gBattleMons[gUnknown_02024A60].status2 & 0x1000)
+ || (gBattleMons[gUnknown_02024A60].status2 & 0x10000000))
+ {
+ gUnknown_02024C18[gUnknown_02024A60] = 0;
+ gUnknown_02024D1E[gUnknown_02024A60] = 3;
+ }
+ else
+ {
+ dp01_build_cmdbuf_x12_a_bb(0, gUnknown_02024C18[0], gUnknown_02024260[0][1] | (gUnknown_02024260[0][2] << 8));
+ dp01_battle_side_mark_buffer_for_execution(gUnknown_02024A60);
+ gUnknown_02024D1E[gUnknown_02024A60]++;
+ }
+ break;
+ case 1:
+ }
+ }
+}
+*/
diff --git a/src/battle_ai.c b/src/battle_ai.c
index 9bbaf908e..f10c6a013 100644
--- a/src/battle_ai.c
+++ b/src/battle_ai.c
@@ -4,6 +4,7 @@
#include "asm.h"
#include "battle.h"
#include "battle_move_effects.h"
+#include "data2.h"
#include "item.h"
#include "moves.h"
#include "pokemon.h"
@@ -36,8 +37,6 @@ extern u8 gCritMultiplier;
extern u16 gTrainerBattleOpponent;
extern u32 gBitTable[];
extern u8 *BattleAIs[];
-extern struct Trainer gTrainers[];
-extern struct BattleMove gBattleMoves[];
extern struct BaseStats gBaseStats[];
/*
diff --git a/src/battle_interface.c b/src/battle_interface.c
index a9175ac10..3c7279b80 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -9,6 +9,7 @@
#include "battle.h"
#include "palette.h"
#include "pokedex.h"
+#include "battle_interface.h"
struct UnknownStruct5
{
@@ -36,15 +37,6 @@ struct UnknownStruct7
u8 filler0[0x180];
};
-struct UnknownStruct9
-{
- s32 unk0;
- u32 unk4;
- u32 unk8;
- u32 unkC_0:5;
- u32 unk10;
-};
-
extern u8 ewram[];
#define ewram520 ((struct UnknownStruct7 *)(ewram + 0x00520))
#define ewram16088 (*(u8 *) (ewram + 0x16088))
@@ -109,9 +101,8 @@ extern void load_gfxc_health_bar();
static void sub_8043D5C(struct Sprite *);
static const void *sub_8043CDC(u8);
-void sub_8044210(u8, s16, u8);
+static void sub_8044210(u8, s16, u8);
static void draw_status_ailment_maybe(u8);
-void sub_8045A5C(u8 a, struct Pokemon *pkmn, u8 c);
extern void sub_8045180(struct Sprite *);
static void sub_8045110(struct Sprite *);
static void sub_8045048(struct Sprite *);
@@ -119,12 +110,11 @@ static void sub_8044F70(u8 taskId);
static void sub_8044E74(u8 taskId);
static void sub_8044ECC(u8 taskId);
static u8 sub_80457E8(u8, u8);
-s32 sub_8045C78(u8, u8, u8, u8);
static int sub_8045F58(s32, s32, int, int *, u8, u16);
static u8 GetScaledExpFraction(int, int, int, u8);
static void sub_8045D58(u8, u8);
static u8 sub_804602C(int, int, int, int *, u8 *, u8);
-static void sub_8046128(struct UnknownStruct9 *a, int *b, void *c);
+static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, void *c);
static int do_nothing(s16 unused1, s16 unused2, int unused3)
{
@@ -937,7 +927,7 @@ _0804420C: .4byte 0x04000008\n\
}
#endif
-void sub_8044210(u8 a, s16 b, u8 c)
+static void sub_8044210(u8 a, s16 b, u8 c)
{
u8 str[0x14];
u8 *ptr;
@@ -1377,15 +1367,9 @@ void sub_804454C(void)
}
}
-struct UnknownStruct8
-{
- u16 unk0;
- u32 unk4;
-};
-
// This function almost matches except for just two instructions around 0x08044B52 that are swapped.
#ifdef NONMATCHING
-u8 sub_8044804(u8 a, const struct UnknownStruct8 *b, u8 c, u8 d)
+u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d)
{
u8 r7;
s16 x;
@@ -1594,7 +1578,7 @@ u8 sub_8044804(u8 a, const struct UnknownStruct8 *b, u8 c, u8 d)
}
#else
__attribute__((naked))
-u8 sub_8044804(u8 a, const struct UnknownStruct8 *b, u8 c, u8 d)
+u8 sub_8044804(u8 a, const struct BattleInterfaceStruct2 *b, u8 c, u8 d)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -2425,23 +2409,23 @@ static void sub_80451A0(u8 a, struct Pokemon *pkmn)
gender = 100;
switch (gender)
{
- default:
- ptr[0] = 0xB;
- ptr[1] = EOS;
- ptr += 1;
- break;
- case MON_MALE:
- ptr[0] = 0xB;
- ptr[1] = CHAR_MALE;
- ptr[2] = EOS;
- ptr += 2;
- break;
- case MON_FEMALE:
- ptr[0] = 0xA;
- ptr[1] = CHAR_FEMALE;
- ptr[2] = EOS;
- ptr += 2;
- break;
+ default:
+ ptr[0] = 0xB;
+ ptr[1] = EOS;
+ ptr += 1;
+ break;
+ case MON_MALE:
+ ptr[0] = 0xB;
+ ptr[1] = CHAR_MALE;
+ ptr[2] = EOS;
+ ptr += 2;
+ break;
+ case MON_FEMALE:
+ ptr[0] = 0xA;
+ ptr[1] = CHAR_FEMALE;
+ ptr[2] = EOS;
+ ptr += 2;
+ break;
}
ptr[0] = EXT_CTRL_CODE_BEGIN;
ptr[1] = 0x13;
@@ -3005,7 +2989,7 @@ static u8 sub_804602C(int a, int b, int c, int *d, u8 *e, u8 f)
return r3;
}
-s16 sub_80460C8(struct UnknownStruct9 *a, int *b, void *c, int d)
+s16 sub_80460C8(struct BattleInterfaceStruct1 *a, int *b, void *c, int d)
{
u16 r7;
s16 r1;
@@ -3020,7 +3004,7 @@ s16 sub_80460C8(struct UnknownStruct9 *a, int *b, void *c, int d)
return r7;
}
-static void sub_8046128(struct UnknownStruct9 *a, int *b, void *c)
+static void sub_8046128(struct BattleInterfaceStruct1 *a, int *b, void *c)
{
u8 sp8[6];
u16 sp10[6];
diff --git a/src/battle_party_menu.c b/src/battle_party_menu.c
index e5f78b6c4..514ef9ca7 100644
--- a/src/battle_party_menu.c
+++ b/src/battle_party_menu.c
@@ -8,6 +8,7 @@
#include "songs.h"
#include "sound.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
#include "text.h"
@@ -40,7 +41,6 @@ extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, con
extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(u8), int);
extern void sub_806E7D0(u8, const struct PartyPopupMenu *);
extern u8 *sub_8040D08();
-extern void sub_806E834();
extern u8 sub_8094C20();
extern void sub_8040B8C(void);
extern u8 pokemon_order_func(u8);
@@ -59,16 +59,6 @@ extern u8 gUnknown_0202E8F6;
extern u8 gUnknown_02038473;
extern u8 gUnknown_020384F0;
extern void (*gUnknown_03004AE4)(); //don't know types yet
-extern const u8 gOtherText_CantSwitchPokeWithYours[];
-extern const u8 gOtherText_NoEnergyLeft[];
-extern const u8 gOtherText_EGGCantBattle[];
-extern const u8 gOtherText_AlreadySelected[];
-extern const u8 gOtherText_CantBeSwitched[];
-extern const u8 gOtherText_AlreadyBattle[];
-extern const u8 OtherText_Summary[];
-extern const u8 gOtherText_CancelNoTerminator[];
-extern const u8 OtherText_Shift[];
-extern const u8 OtherText_SendOut[];
static void Task_809527C(u8);
static void Task_80952B4(u8);
diff --git a/src/battle_records.c b/src/battle_records.c
index 3290bbebe..35fd3284b 100644
--- a/src/battle_records.c
+++ b/src/battle_records.c
@@ -1,8 +1,6 @@
#include "global.h"
#include "menu.h"
-
-extern const u8 gOtherText_BattleResults[];
-extern const u8 gOtherText_WinLoseDraw[];
+#include "strings2.h"
void PrintLinkBattleWinsLossesDraws(void *);
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 0753fba70..a70157a43 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -2,6 +2,7 @@
#include "battle_setup.h"
#include "asm.h"
#include "battle.h"
+#include "data2.h"
#include "event_data.h"
#include "field_control_avatar.h"
#include "field_map_obj_helpers.h"
@@ -23,6 +24,7 @@
#include "species.h"
#include "starter_choose.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
#include "text.h"
#include "trainer.h"
@@ -33,7 +35,6 @@ extern void (*gUnknown_0300485C)(void);
extern struct Pokemon gEnemyParty[];
extern struct Pokemon gPlayerParty[];
-extern struct Trainer gTrainers[];
EWRAM_DATA u16 gTrainerBattleMode = 0;
EWRAM_DATA u16 gTrainerBattleOpponent = 0;
@@ -45,8 +46,6 @@ EWRAM_DATA u8 *gTrainerCannotBattleSpeech = NULL;
EWRAM_DATA u8 *gTrainerBattleScriptReturnAddress = NULL;
EWRAM_DATA u8 *gTrainerBattleEndScript = NULL;
-extern u8 gOtherText_CancelWithTerminator[];
-
extern u16 gBattleTypeFlags;
extern u16 gScriptLastTalked;
extern u8 gUnknown_02024D26;
@@ -753,7 +752,7 @@ u8 GetWildBattleTransition(void)
u8 GetTrainerBattleTransition(void)
{
- struct Trainer *trainer;
+ const struct Trainer *trainer;
u8 minPartyCount;
u8 flashVar;
u8 level;
@@ -1169,12 +1168,12 @@ void PlayTrainerEncounterMusic(void)
}
//Returns an empty string if a null pointer was passed, otherwise returns str
-u8 *SanitizeString(u8 *str)
+u8 *SanitizeString(const u8 *str)
{
if (str)
- return str;
+ return (u8 *) str;
else
- return gOtherText_CancelWithTerminator;
+ return (u8 *) gOtherText_CancelWithTerminator;
}
u8 *sub_808281C(void)
diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c
index 511b88c5a..394a3691b 100644
--- a/src/berry_tag_screen.c
+++ b/src/berry_tag_screen.c
@@ -12,6 +12,7 @@
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
#include "text.h"
@@ -38,10 +39,6 @@ extern u16 gUnknown_030041B4;
extern const struct SpriteSheet gUnknown_083C1F74;
extern const struct SpritePalette gUnknown_083C1F7C;
-extern u8 gOtherText_ThreeQuestions2[];
-extern u8 gOtherText_Size[];
-extern u8 gOtherText_Firm[];
-extern u8 gContestStatsText_Unknown1[];
extern u8 *gUnknown_0841192C[];
extern u8 gBerryCheck_Gfx[];
@@ -266,30 +263,49 @@ static void sub_8146480(u8 taskid)
static void sub_81464E4(void)
{
const struct Berry *berryInfo;
+#ifdef UNITS_IMPERIAL
u32 size;
s32 sizeMajor;
s32 sizeMinor;
+#endif
+#if GERMAN
+ u8 buffer[16];
+#endif
berryInfo = GetBerryInfo(gScriptItemId + OFFSET_7B + 1);
ConvertIntToDecimalStringN(gStringVar1, gScriptItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2);
MenuPrint(gStringVar1, 12, 4);
+#if ENGLISH
MenuPrint(berryInfo->name, 14, 4);
+#elif GERMAN
+ StringCopy(buffer, berryInfo->name);
+ StringAppend(buffer, gOtherText_Berry2);
+ MenuPrint(buffer, 14, 4);
+#endif
+
MenuPrint(berryInfo->description1, 4, 14);
MenuPrint(berryInfo->description2, 4, 16);
+#ifdef UNITS_IMPERIAL
size = (berryInfo->size * 1000) / 254;
if (size % 10 >= 5)
size += 10;
sizeMinor = (size % 100) / 10;
sizeMajor = size / 100;
+#endif
MenuPrint(gOtherText_Size, 11, 7);
if (berryInfo->size != 0)
{
+#ifdef UNITS_IMPERIAL
ConvertIntToDecimalStringN(gStringVar1, sizeMajor, STR_CONV_MODE_LEFT_ALIGN, 2);
ConvertIntToDecimalStringN(gStringVar2, sizeMinor, STR_CONV_MODE_LEFT_ALIGN, 2);
+#else
+ ConvertIntToDecimalStringN(gStringVar1, berryInfo->size / 10, STR_CONV_MODE_LEFT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar2, berryInfo->size % 10, STR_CONV_MODE_LEFT_ALIGN, 2);
+#endif
MenuPrint(gContestStatsText_Unknown1, 16, 7);
}
else
diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c
index 220e8420c..2ee4f91bb 100644
--- a/src/braille_puzzles.c
+++ b/src/braille_puzzles.c
@@ -151,50 +151,50 @@ void Task_BrailleWait(u8 taskId)
switch (data[0])
{
- case 0:
- data[1] = 7200;
- data[0] = 1;
- break;
- case 1:
- if (BrailleWait_CheckButtonPress() != FALSE)
+ case 0:
+ data[1] = 7200;
+ data[0] = 1;
+ break;
+ case 1:
+ if (BrailleWait_CheckButtonPress() != FALSE)
+ {
+ MenuZeroFillScreen();
+ PlaySE(5);
+ data[0] = 2;
+ }
+ else
+ {
+ data[1] = data[1] - 1;
+ if (data[1] == 0)
{
MenuZeroFillScreen();
- PlaySE(5);
- data[0] = 2;
- }
- else
- {
- data[1] = data[1] - 1;
- if (data[1] == 0)
- {
- MenuZeroFillScreen();
- data[0] = 3;
- data[1] = 30;
- }
- }
- break;
- case 2:
- if (BrailleWait_CheckButtonPress() == FALSE)
- {
- data[1] = data[1] - 1;
- if (data[1] == 0)
- data[0] = 4;
- break;
+ data[0] = 3;
+ data[1] = 30;
}
- sub_8064E2C();
- DestroyTask(taskId);
- ScriptContext2_Disable();
- break;
- case 3:
+ }
+ break;
+ case 2:
+ if (BrailleWait_CheckButtonPress() == FALSE)
+ {
data[1] = data[1] - 1;
if (data[1] == 0)
data[0] = 4;
break;
- case 4:
- sub_8064E2C();
- ScriptContext1_SetupScript(gIslandCave_EventScript_OpenRegiiceChamber);
- DestroyTask(taskId);
- break;
+ }
+ sub_8064E2C();
+ DestroyTask(taskId);
+ ScriptContext2_Disable();
+ break;
+ case 3:
+ data[1] = data[1] - 1;
+ if (data[1] == 0)
+ data[0] = 4;
+ break;
+ case 4:
+ sub_8064E2C();
+ ScriptContext1_SetupScript(gIslandCave_EventScript_OpenRegiiceChamber);
+ DestroyTask(taskId);
+ break;
}
}
diff --git a/src/calculate_base_damage.c b/src/calculate_base_damage.c
index 293e2f24d..7868a2c67 100644
--- a/src/calculate_base_damage.c
+++ b/src/calculate_base_damage.c
@@ -2,6 +2,7 @@
#include "abilities.h"
#include "battle.h"
#include "berry.h"
+#include "data2.h"
#include "event_data.h"
#include "hold_effects.h"
#include "item.h"
@@ -11,6 +12,7 @@
#include "species.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings2.h"
#include "text.h"
extern u8 gPlayerPartyCount;
@@ -34,15 +36,9 @@ extern u16 gTrainerBattleOpponent;
extern struct PokemonStorage gPokemonStorage;
extern u8 gBadEggNickname[];
-extern u8 gEggNickname[];
extern u32 gBitTable[];
extern struct BaseStats gBaseStats[];
-extern u8 gSpeciesNames[][11];
-extern struct BattleMove gBattleMoves[];
extern struct SpriteTemplate gSpriteTemplate_8208288[];
-extern union AmimCmd *gSpriteAnimTable_81E7C64[];
-extern union AnimCmd **gUnknown_081EC2A4[];
-extern union AnimCmd **gUnknown_081ECACC[];
extern u8 gTrainerClassToPicIndex[];
extern u8 gTrainerClassToNameIndex[];
extern u8 gSecretBaseTrainerClasses[];
diff --git a/src/clear_save_data_menu.c b/src/clear_save_data_menu.c
index 21cd643ef..690ce3f55 100644
--- a/src/clear_save_data_menu.c
+++ b/src/clear_save_data_menu.c
@@ -7,10 +7,9 @@
#include "songs.h"
#include "sound.h"
#include "sprite.h"
+#include "strings2.h"
#include "task.h"
-extern u8 gSystemText_ClearAllSaveDataPrompt[];
-extern u8 gSystemText_ClearingData[];
extern const struct MenuAction gMenuYesNoItems[];
static void VBlankCB_ClearSaveDataScreen(void);
@@ -99,65 +98,65 @@ static u8 InitClearSaveDataScreen(void)
switch (gMain.state)
{
- case 0:
- default:
- SetVBlankCallback(NULL);
-
- REG_DISPCNT = 0;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG3HOFS = 0;
- REG_BG3VOFS = 0;
- REG_WIN0H = 0;
- REG_WIN0V = 0;
- REG_WININ = 0;
- REG_WINOUT = 0;
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BLDY = 0;
-
- DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
- DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
- DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
-
- ResetPaletteFade();
-
- gPlttBufferUnfaded[0] = 0x7fff;
- gPlttBufferFaded[0] = 0x7fff;
- gPlttBufferUnfaded[1] = 0x3945;
- gPlttBufferFaded[1] = 0x3945;
-
- for (i = 0; i < 0x10; i++)
- ((u16 *)(VRAM + 0x20))[i] = 0x1111;
-
- for (i = 0; i < 0x500; i++)
- ((u16 *)(VRAM + 0x3800))[i] = 0x0001;
-
- ResetTasks();
- ResetSpriteData();
-
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitMenuWindow(&gWindowConfig_81E6CE4);
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xffff);
-
- ime = REG_IME;
- REG_IME = 0;
- REG_IE |= INTR_FLAG_VBLANK;
- REG_IME = ime;
- REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
-
- SetVBlankCallback(VBlankCB_InitClearSaveDataScreen);
-
- REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG3_ON;
- gMain.state = 1;
+ case 0:
+ default:
+ SetVBlankCallback(NULL);
+
+ REG_DISPCNT = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WININ = 0;
+ REG_WINOUT = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
+
+ ResetPaletteFade();
+
+ gPlttBufferUnfaded[0] = 0x7fff;
+ gPlttBufferFaded[0] = 0x7fff;
+ gPlttBufferUnfaded[1] = 0x3945;
+ gPlttBufferFaded[1] = 0x3945;
+
+ for (i = 0; i < 0x10; i++)
+ ((u16 *)(VRAM + 0x20))[i] = 0x1111;
+
+ for (i = 0; i < 0x500; i++)
+ ((u16 *)(VRAM + 0x3800))[i] = 0x0001;
+
+ ResetTasks();
+ ResetSpriteData();
+
+ SetUpWindowConfig(&gWindowConfig_81E6C3C);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xffff);
+
+ ime = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = ime;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+
+ SetVBlankCallback(VBlankCB_InitClearSaveDataScreen);
+
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON | DISPCNT_BG3_ON;
+ gMain.state = 1;
+ return 0;
+ case 1:
+ UpdatePaletteFade();
+ if (gPaletteFade.active)
return 0;
- case 1:
- UpdatePaletteFade();
- if (gPaletteFade.active)
- return 0;
- SetMainCallback2(CB2_ClearSaveDataScreen);
- return 1;
+ SetMainCallback2(CB2_ClearSaveDataScreen);
+ return 1;
}
}
@@ -165,16 +164,16 @@ static void CB2_SoftReset(void)
{
switch (gMain.state)
{
- case 0:
- default:
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xffff);
- gMain.state = 1;
- break;
- case 1:
- UpdatePaletteFade();
- if (gPaletteFade.active)
- return;
- DoSoftReset();
- break;
+ case 0:
+ default:
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xffff);
+ gMain.state = 1;
+ break;
+ case 1:
+ UpdatePaletteFade();
+ if (gPaletteFade.active)
+ return;
+ DoSoftReset();
+ break;
}
}
diff --git a/src/coins.c b/src/coins.c
index 193ea249e..3c6356612 100644
--- a/src/coins.c
+++ b/src/coins.c
@@ -2,11 +2,10 @@
#include "coins.h"
#include "menu.h"
#include "string_util.h"
+#include "strings.h"
#define MAX_COINS 9999
-extern u8 gOtherText_Coins2[];
-
void UpdateCoinsWindow(s32 a, u8 b, u8 c)
{
PrintCoins(a, 4, b + 2, c + 1);
diff --git a/src/contest_painting.c b/src/contest_painting.c
index 2ef50ee17..d7bacb905 100644
--- a/src/contest_painting.c
+++ b/src/contest_painting.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "contest_painting.h"
#include "asm.h"
+#include "data2.h"
#include "decompress.h"
#include "main.h"
#include "menu.h"
@@ -8,6 +9,7 @@
#include "rng.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings.h"
#include "text.h"
extern u8 unk_2000000[];
@@ -23,48 +25,6 @@ extern struct Unk2015E00 unk_2015e00;
extern struct Unk3000756 gUnknown_03000756;
extern struct Unk03005E20 gUnknown_03005E20;
extern struct ContestEntry *gUnknown_03005E8C;
-extern const struct SpriteSheet gMonFrontPicTable[];
-extern const struct MonCoords gMonFrontPicCoords[];
-extern const struct SpriteSheet gMonBackPicTable[];
-extern const struct MonCoords gMonBackPicCoords[];
-extern void *gUnknown_081FAF4C[];
-extern const u8 OtherText_Cool[];
-extern const u8 OtherText_Beauty2[];
-extern const u8 OtherText_Cute[];
-extern const u8 OtherText_Smart[];
-extern const u8 OtherText_Tough[];
-extern const u8 OtherText_NonstopSuperCool[];
-extern const u8 OtherText_Terminator6[];
-extern const u8 OtherText_GoodLookingPoke[];
-extern const u8 OtherText_Terminator7[];
-extern const u8 OtherText_MarvelousGreat[];
-extern const u8 OtherText_Terminator8[];
-extern const u8 OtherText_CenturyLastVenus[];
-extern const u8 OtherText_Terminator9[];
-extern const u8 OtherText_Terminator10[];
-extern const u8 OtherText_DazzlingSmile[];
-extern const u8 OtherText_PokeCenterIdol[];
-extern const u8 OtherText_Terminator11[];
-extern const u8 OtherText_LovelyAndSweet[];
-extern const u8 OtherText_Terminator12[];
-extern const u8 OtherText_ThePretty[];
-extern const u8 OtherText_WinningPortrait[];
-extern const u8 OtherText_GiveUsWink[];
-extern const u8 OtherText_Terminator13[];
-extern const u8 OtherText_SmartnessMaestro[];
-extern const u8 OtherText_Terminator14[];
-extern const u8 OtherText_ChosenPokeAmong[];
-extern const u8 OtherText_Terminator15[];
-extern const u8 OtherText_TheExcellent[];
-extern const u8 OtherText_ItsMomentOfElegance[];
-extern const u8 OtherText_PowerfullyMuscular[];
-extern const u8 OtherText_Terminator16[];
-extern const u8 OtherText_StrongErEst[];
-extern const u8 OtherText_Terminator17[];
-extern const u8 OtherText_MightyTough[];
-extern const u8 OtherText_Exclamation[];
-extern const u8 gContestText_ContestWinner[];
-extern const u8 gOtherText_Unknown1[];
static const u16 gPictureFramePalettes[][16] =
{
@@ -381,13 +341,6 @@ static void VBlankCB_ContestPainting(void)
TransferPlttBuffer();
}
-
-struct MonCoords
-{
- u8 x;
- u8 y;
-};
-
#ifdef NONMATCHING
static void sub_8106AC4(u16 species, u8 arg1)
{
diff --git a/src/credits.c b/src/credits.c
index ffb7554ba..c8de577fc 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -1,12 +1,18 @@
#include "global.h"
#include "asm.h"
+#include "data2.h"
#include "decompress.h"
+#include "event_data.h"
#include "m4a.h"
#include "main.h"
#include "menu.h"
#include "palette.h"
+#include "pokedex.h"
+#include "rng.h"
#include "songs.h"
#include "sound.h"
+#include "species.h"
+#include "starter_choose.h"
#include "trig.h"
asm(".set REG_BASE, 0x4000000");
@@ -15,13 +21,6 @@ asm(".set OFFSET_REG_BLDALPHA, 0x52");
asm(".set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT");
asm(".set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA");
-u32 NationalPokedexNumToSpecies(u16 nationalNum);
-
-struct MonCoords
-{
- u8 x, y;
-};
-
extern void *species_and_otid_get_pal(u32, u16, u16);
enum
@@ -71,18 +70,37 @@ enum
PAGE_PROGRAMMERS,
PAGE_GRAPHIC_DESIGNERS,
PAGE_PRODUCT_SUPPORT,
+
+#if ENGLISH
PAGE_ARTWORK,
PAGE_TEXT_EDITOR,
PAGE_NOA_TESTING,
PAGE_BRAILLE_CODE_CHECK_1,
PAGE_BRAILLE_CODE_CHECK_2,
+#elif GERMAN
+ PAGE_NOE_TESTING,
+ PAGE_BRAILLE_CODE_CHECK_1,
+#endif
+
PAGE_SPECIAL_THANKS_4,
PAGE_SPECIAL_THANKS_5,
PAGE_COUNT
};
+#if ENGLISH
+#define POKEMON_TILE_COUNT 68
+#define LAST_PAGE (PAGE_TEXT_EDITOR)
+#define UNK_DEFINE_45 (0x45)
#define UNK_DEFINE_82 (0x82)
+#define UNK_DEF_1F3 (499)
+#elif GERMAN
+#define POKEMON_TILE_COUNT 65
+#define LAST_PAGE (PAGE_NOE_TESTING)
+#define UNK_DEFINE_45 (8)
+#define UNK_DEFINE_82 (0x8D)
+#define UNK_DEF_1F3 (554)
+#endif
#define COLOR_DARK_GREEN 0x1967
#define COLOR_LIGHT_GREEN 0x328D
@@ -126,14 +144,16 @@ enum
TDE_TASK_A_ID = 2,
};
+
struct Unk201C000
{
- u16 unk0[8];
- u8 pad_10[0x78];
+ u16 unk0[POKEMON_TILE_COUNT];
u16 unk88;
u16 unk8A;
u16 unk8C;
u16 unk8E;
+ u16 unk90[386];
+ u16 unk394;
};
struct CreditsEntry
@@ -167,10 +187,6 @@ extern s16 gUnknown_0203935C;
extern u8 gReservedSpritePaletteCount;
-// data/data2
-extern struct MonCoords gMonFrontPicCoords[];
-extern struct SpriteSheet gMonFrontPicTable[];
-
// data/starter_choose
extern u16 gBirchBagGrassPal[32];
extern u8 gBirchGrassTilemap[];
@@ -226,12 +242,12 @@ static u8 sub_8144454(u8 page, u8 taskIdA);
static void task_d_8144514(u8 taskIdD);
static bool8 sub_8144ECC(u8 data, u8 taskIdA);
static void sub_81450AC(u8 taskIdA);
-void sub_8145128(u16, u16, u16);
-static void sub_81452D0(u16 arg0, u16 arg1);
+static void sub_8145128(u16, u16, u16);
+static void sub_81452D0(u16 arg0, u16 palette);
static void spritecb_player_8145378(struct Sprite *sprite);
static void spritecb_rival_8145420(struct Sprite *sprite);
-u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3);
-void sub_81458DC(void);
+static u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 position);
+static void sub_81458DC(void);
static void vblank_8143948(void)
{
@@ -666,8 +682,7 @@ static void task_b_81441B8(u8 taskIdB)
for (i = 0; i < 5; i++)
{
- sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0,
- 9 + i * 2, 240);
+ sub_8072BD8(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 0, 9 + i * 2, 240);
}
gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1;
@@ -749,8 +764,6 @@ static void task_b_81441B8(u8 taskIdB)
}
}
-#define LAST_PAGE (PAGE_TEXT_EDITOR)
-
static u8 sub_8144454(u8 page, u8 taskIdA)
{
// Starts with bike + ocean + morning
@@ -816,8 +829,6 @@ static u8 sub_8144454(u8 page, u8 taskIdA)
return FALSE;
}
-#define UNK_DEFINE_44 (0x44)
-
static void task_d_8144514(u8 taskIdD)
{
struct Unk201C000 *r6 = &ewram1c000;
@@ -834,7 +845,7 @@ static void task_d_8144514(u8 taskIdD)
gTasks[taskIdD].data[TDD_STATE]++;
break;
case 2:
- if (r6->unk88 == UNK_DEFINE_44 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != task_a_8143B68)
+ if (r6->unk88 == POKEMON_TILE_COUNT || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != task_a_8143B68)
break;
r2 = sub_81456B4(r6->unk0[r6->unk8C], gUnknown_0840CA00[r6->unk8A][0], gUnknown_0840CA00[r6->unk8A][1], r6->unk8A);
if (r6->unk8C < r6->unk8E - 1)
@@ -866,89 +877,87 @@ static void task_d_8144514(u8 taskIdD)
void task_c_8144664(u8 taskIdC)
{
- switch (gTasks[taskIdC].data[0])
+ switch (gTasks[taskIdC].data[TDC_0])
{
case 0:
- gUnknown_0203935A = Sin((gTasks[taskIdC].data[5] >> 1) & 0x7F, 12);
- gTasks[taskIdC].data[5]++;
+ gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12);
+ gTasks[taskIdC].data[TDC_5]++;
break;
case 1:
if (gUnknown_0203935A != 0)
{
- gUnknown_0203935A = Sin((gTasks[taskIdC].data[5] >> 1) & 0x7F, 12);
- gTasks[taskIdC].data[5]++;
+ gUnknown_0203935A = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12);
+ gTasks[taskIdC].data[TDC_5]++;
}
else
{
- gSprites[gTasks[taskIdC].data[2]].data0 = 2;
- gTasks[taskIdC].data[5] = 0;
- gTasks[taskIdC].data[0]++;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 2;
+ gTasks[taskIdC].data[TDC_5] = 0;
+ gTasks[taskIdC].data[TDC_0]++;
}
break;
case 2:
- if (gTasks[taskIdC].data[5] < 64)
+ if (gTasks[taskIdC].data[TDC_5] < 64)
{
- gTasks[taskIdC].data[5]++;
- gUnknown_0203935A = Sin(gTasks[taskIdC].data[5] & 0x7F, 20);
+ gTasks[taskIdC].data[TDC_5]++;
+ gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20);
}
else
{
- gTasks[taskIdC].data[0]++;
+ gTasks[taskIdC].data[TDC_0]++;
}
break;
case 3:
- gSprites[gTasks[taskIdC].data[2]].data0 = 3;
- gSprites[gTasks[taskIdC].data[3]].data0 = 1;
- gTasks[taskIdC].data[4] = 120;
- gTasks[taskIdC].data[0]++;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 3;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 1;
+ gTasks[taskIdC].data[TDC_4] = 120;
+ gTasks[taskIdC].data[TDC_0]++;
break;
case 4:
- if (gTasks[taskIdC].data[4] != 0)
+ if (gTasks[taskIdC].data[TDC_4] != 0)
{
- gTasks[taskIdC].data[4]--;
+ gTasks[taskIdC].data[TDC_4]--;
}
else
{
- gTasks[taskIdC].data[5] = 64;
- gTasks[taskIdC].data[0]++;
+ gTasks[taskIdC].data[TDC_5] = 64;
+ gTasks[taskIdC].data[TDC_0]++;
}
break;
case 5:
- if (gTasks[taskIdC].data[5] > 0)
+ if (gTasks[taskIdC].data[TDC_5] > 0)
{
- gTasks[taskIdC].data[5]--;
- gUnknown_0203935A = Sin(gTasks[taskIdC].data[5] & 0x7F, 20);
+ gTasks[taskIdC].data[TDC_5]--;
+ gUnknown_0203935A = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20);
}
else
{
- gSprites[gTasks[taskIdC].data[2]].data0 = 1;
- gTasks[taskIdC].data[0]++;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 1;
+ gTasks[taskIdC].data[TDC_0]++;
}
break;
case 6:
- gTasks[taskIdC].data[0] = 50;
+ gTasks[taskIdC].data[TDC_0] = 50;
break;
case 10:
- gSprites[gTasks[taskIdC].data[3]].data0 = 2;
- gTasks[taskIdC].data[0] = 50;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 2;
+ gTasks[taskIdC].data[TDC_0] = 50;
break;
case 20:
- gSprites[gTasks[taskIdC].data[2]].data0 = 4;
- gTasks[taskIdC].data[0] = 50;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 4;
+ gTasks[taskIdC].data[TDC_0] = 50;
break;
case 30:
- gSprites[gTasks[taskIdC].data[2]].data0 = 5;
- gSprites[gTasks[taskIdC].data[3]].data0 = 3;
- gTasks[taskIdC].data[0] = 50;
+ gSprites[gTasks[taskIdC].data[TDC_2]].data0 = 5;
+ gSprites[gTasks[taskIdC].data[TDC_3]].data0 = 3;
+ gTasks[taskIdC].data[TDC_0] = 50;
break;
case 50:
- gTasks[taskIdC].data[0] = 0;
+ gTasks[taskIdC].data[TDC_0] = 0;
break;
}
}
-#define UNK_DEF_1F3 (499)
-
void task_e_8144934(u8 taskIdE)
{
s16 taskIdC;
@@ -1013,8 +1022,6 @@ void task_e_8144934(u8 taskIdE)
}
}
-#define UNK_DEFINE_45 (0x45)
-
static void sub_8144A68(u8 data, u8 taskIdA)
{
switch (data)
@@ -1205,119 +1212,39 @@ static void sub_81450AC(u8 taskIdA)
gUnknown_0203935C = 1;
}
-__attribute__((naked))
-void sub_8145128(u16 arg0, u16 arg1, u16 arg2)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- adds r3, r0, 0\n\
- adds r4, r2, 0\n\
- lsls r3, 16\n\
- lsrs r3, 16\n\
- lsls r1, 16\n\
- lsrs r7, r1, 16\n\
- lsls r4, 16\n\
- lsrs r5, r4, 16\n\
- ldr r0, _081451EC @ =gCreditsCopyrightEnd_Gfx\n\
- movs r6, 0xC0\n\
- lsls r6, 19\n\
- adds r3, r6\n\
- adds r1, r3, 0\n\
- bl LZ77UnCompVram\n\
- ldr r0, _081451F0 @ =gIntroCopyright_Pal\n\
- adds r1, r5, 0\n\
- movs r2, 0x20\n\
- bl LoadPalette\n\
- lsrs r4, 20\n\
- lsls r4, 28\n\
- lsrs r4, 16\n\
- movs r2, 0\n\
- adds r1, r4, 0x1\n\
- ldr r3, _081451F4 @ =0x000003ff\n\
-_0814515E:\n\
- lsls r0, r2, 1\n\
- adds r0, r7\n\
- adds r0, r6\n\
- strh r1, [r0]\n\
- adds r0, r2, 0x1\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- cmp r2, r3\n\
- bls _0814515E\n\
- movs r2, 0\n\
- adds r0, r4, 0x2\n\
- adds r6, r4, 0\n\
- adds r6, 0x17\n\
- movs r1, 0x2B\n\
- adds r1, r4\n\
- mov r12, r1\n\
- adds r4, 0x42\n\
- ldr r5, _081451F8 @ =0x060001c8\n\
- adds r3, r0, 0\n\
-_08145184:\n\
- lsls r0, r2, 1\n\
- adds r0, r7\n\
- adds r0, r5\n\
- adds r1, r2, r3\n\
- strh r1, [r0]\n\
- adds r0, r2, 0x1\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- cmp r2, 0x14\n\
- bls _08145184\n\
- movs r2, 0\n\
- ldr r5, _081451FC @ =0x06000248\n\
- adds r3, r6, 0\n\
-_0814519E:\n\
- lsls r0, r2, 1\n\
- adds r0, r7\n\
- adds r0, r5\n\
- adds r1, r2, r3\n\
- strh r1, [r0]\n\
- adds r0, r2, 0x1\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- cmp r2, 0x13\n\
- bls _0814519E\n\
- movs r2, 0\n\
- ldr r5, _08145200 @ =0x060002c8\n\
- mov r3, r12\n\
-_081451B8:\n\
- lsls r0, r2, 1\n\
- adds r0, r7\n\
- adds r0, r5\n\
- adds r1, r2, r3\n\
- strh r1, [r0]\n\
- adds r0, r2, 0x1\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- cmp r2, 0x16\n\
- bls _081451B8\n\
- movs r2, 0\n\
- ldr r3, _08145204 @ =0x06000348\n\
-_081451D0:\n\
- lsls r0, r2, 1\n\
- adds r0, r7\n\
- adds r0, r3\n\
- adds r1, r2, r4\n\
- strh r1, [r0]\n\
- adds r0, r2, 0x1\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- cmp r2, 0xB\n\
- bls _081451D0\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_081451EC: .4byte gCreditsCopyrightEnd_Gfx\n\
-_081451F0: .4byte gIntroCopyright_Pal\n\
-_081451F4: .4byte 0x000003ff\n\
-_081451F8: .4byte 0x060001c8\n\
-_081451FC: .4byte 0x06000248\n\
-_08145200: .4byte 0x060002c8\n\
-_08145204: .4byte 0x06000348\n\
- .syntax divided\n");
+static void sub_8145128(u16 arg0, u16 arg1, u16 arg2) {
+ u16 baseTile;
+ u16 i;
+
+ LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *) (VRAM + arg0));
+ LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal));
+
+ baseTile = (arg2 / 16) << 12;
+
+ for (i = 0; i < 32 * 32; i++)
+ {
+ ((u16 *) (VRAM + arg1))[i] = baseTile + 1;
+ }
+
+ for (i = 0; i < 21; i++)
+ {
+ ((u16 *) (VRAM + arg1))[7 * 32 + 4 + i] = i + 2 + baseTile;
+ }
+
+ for (i = 0; i < 20; i++)
+ {
+ ((u16 *) (VRAM + arg1))[9 * 32 + 4 + i] = i + 23 + baseTile;
+ }
+
+ for (i = 0; i < 23; i++)
+ {
+ ((u16 *) (VRAM + arg1))[11 * 32 + 4 + i] = i + 43 + baseTile;
+ }
+
+ for (i = 0; i < 12; i++)
+ {
+ ((u16 *) (VRAM + arg1))[13 * 32 + 4 + i] = i + 66 + baseTile;
+ }
}
u16 sub_8145208(u8 arg0)
@@ -1332,106 +1259,52 @@ u16 sub_8145208(u8 arg0)
if (arg0 & (1 << 7))
{
- out |= 0x800;
+ out |= 1 << 11;
}
if (arg0 & (1 << 6))
{
- out |= 0x400;
+ out |= 1 << 10;
}
return out;
}
-__attribute__((naked))
-void sub_814524C(void *arg0, u8 arg1, u8 arg2, u16 arg3, int arg4)
-{
- 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\
- sub sp, 0xC\n\
- str r0, [sp]\n\
- ldr r0, [sp, 0x2C]\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- mov r10, r1\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- str r2, [sp, 0x4]\n\
- lsls r3, 16\n\
- lsrs r3, 16\n\
- str r3, [sp, 0x8]\n\
- lsls r0, 16\n\
- lsrs r0, 20\n\
- lsls r0, 28\n\
- lsrs r0, 16\n\
- mov r9, r0\n\
- movs r5, 0\n\
-_0814527A:\n\
- movs r4, 0\n\
- lsls r7, r5, 1\n\
- ldr r1, [sp, 0x4]\n\
- adds r0, r1, r5\n\
- adds r2, r5, 0x1\n\
- mov r8, r2\n\
- lsls r0, 6\n\
- ldr r1, [sp, 0x8]\n\
- adds r6, r0, r1\n\
-_0814528C:\n\
- adds r0, r7, r5\n\
- adds r0, r4\n\
- ldr r2, [sp]\n\
- adds r0, r2, r0\n\
- ldrb r0, [r0]\n\
- bl sub_8145208\n\
- mov r2, r10\n\
- adds r1, r2, r4\n\
- lsls r1, 1\n\
- adds r1, r6\n\
- movs r2, 0xC0\n\
- lsls r2, 19\n\
- adds r1, r2\n\
- add r0, r9\n\
- strh r0, [r1]\n\
- adds r0, r4, 0x1\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- cmp r4, 0x2\n\
- bls _0814528C\n\
- mov r1, r8\n\
- lsls r0, r1, 24\n\
- lsrs r5, r0, 24\n\
- cmp r5, 0x4\n\
- bls _0814527A\n\
- add sp, 0xC\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");
+void sub_814524C(u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette) {
+ u8 y, x;
+
+ const u16 tileOffset = (palette / 16) << 12;
+
+ for (y = 0; y < 5; y++)
+ {
+ for (x = 0; x < 3; x++)
+ {
+ ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8145208(arg0[y * 3 + x]);
+ }
+ }
}
-static void sub_81452D0(u16 arg0, u16 arg1)
+static void sub_81452D0(u16 arg0, u16 palette)
{
- u16 i;
- u16 foo = arg1 / 16;
- u16 bar = foo * 4096;
-
- for (i = 0; i < 0x400; i++)
- ((u16 *)(VRAM + arg0))[i] = bar + 1;
-
- sub_814524C(&gUnknown_0840B83C, 3, 7, arg0, arg1);
- sub_814524C(&gUnknown_0840B84B, 7, 7, arg0, arg1);
- sub_814524C(&gUnknown_0840B85A, 11, 7, arg0, arg1);
- sub_814524C(&gUnknown_0840B85A, 16, 7, arg0, arg1);
- sub_814524C(&gUnknown_0840B869, 20, 7, arg0, arg1);
- sub_814524C(&gUnknown_0840B878, 24, 7, arg0, arg1);
+ u16 pos;
+ u16 baseTile = (palette / 16) << 12;
+
+ for (pos = 0; pos < 32 * 32; pos++)
+ ((u16 *) (VRAM + arg0))[pos] = baseTile + 1;
+
+#if ENGLISH
+ sub_814524C(gUnknown_0840B83C, 3, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B84B, 7, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B85A, 11, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B85A, 16, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B869, 20, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B878, 24, 7, arg0, palette);
+#elif GERMAN
+ sub_814524C(gUnknown_0840B85A, 7, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B869, 11, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B878, 15, 7, arg0, palette);
+ sub_814524C(gUnknown_0840B85A, 19, 7, arg0, palette);
+#endif
}
static void spritecb_player_8145378(struct Sprite *sprite)
@@ -1538,466 +1411,153 @@ static void spritecb_rival_8145420(struct Sprite *sprite)
}
}
-__attribute__((naked))
-void spritecb_81454E0(struct Sprite *sprite)
-{
- asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- sub sp, 0x4\n\
- adds r5, r0, 0\n\
- ldr r0, _081454F8 @ =gUnknown_0203935C\n\
- movs r1, 0\n\
- ldrsh r0, [r0, r1]\n\
- cmp r0, 0\n\
- beq _081454FC\n\
- adds r0, r5, 0\n\
- bl DestroySprite\n\
- b _081456A6\n\
- .align 2, 0\n\
-_081454F8: .4byte gUnknown_0203935C\n\
-_081454FC:\n\
- ldrh r0, [r5, 0x3C]\n\
- adds r0, 0x1\n\
- strh r0, [r5, 0x3C]\n\
- movs r2, 0x2E\n\
- ldrsh r0, [r5, r2]\n\
- cmp r0, 0xA\n\
- bhi _08145544\n\
- lsls r0, 2\n\
- ldr r1, _08145514 @ =_08145518\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- mov pc, r0\n\
- .align 2, 0\n\
-_08145514: .4byte _08145518\n\
- .align 2, 0\n\
-_08145518:\n\
- .4byte _08145544\n\
- .4byte _0814559E\n\
- .4byte _08145620\n\
- .4byte _08145660\n\
- .4byte _08145544\n\
- .4byte _08145544\n\
- .4byte _08145544\n\
- .4byte _08145544\n\
- .4byte _08145544\n\
- .4byte _08145544\n\
- .4byte _08145696\n\
-_08145544:\n\
- ldrb r1, [r5, 0x1]\n\
- movs r0, 0x4\n\
- negs r0, r0\n\
- ands r0, r1\n\
- movs r1, 0x1\n\
- orrs r0, r1\n\
- strb r0, [r5, 0x1]\n\
- movs r0, 0x30\n\
- ldrsh r1, [r5, r0]\n\
- movs r0, 0x1F\n\
- ands r1, r0\n\
- lsls r1, 1\n\
- ldrb r2, [r5, 0x3]\n\
- movs r0, 0x3F\n\
- negs r0, r0\n\
- ands r0, r2\n\
- orrs r0, r1\n\
- strb r0, [r5, 0x3]\n\
- movs r0, 0x10\n\
- strh r0, [r5, 0x32]\n\
- ldrh r4, [r5, 0x30]\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- movs r0, 0x80\n\
- lsls r0, 9\n\
- movs r1, 0x10\n\
- bl __divsi3\n\
- adds r1, r0, 0\n\
- str r1, [sp]\n\
- adds r0, r4, 0\n\
- movs r2, 0\n\
- movs r3, 0\n\
- bl SetOamMatrix\n\
- adds r2, r5, 0\n\
- adds r2, 0x3E\n\
- ldrb r1, [r2]\n\
- movs r0, 0x5\n\
- negs r0, r0\n\
- ands r0, r1\n\
- strb r0, [r2]\n\
- movs r0, 0x1\n\
- strh r0, [r5, 0x2E]\n\
- b _081456A6\n\
-_0814559E:\n\
- ldrh r1, [r5, 0x32]\n\
- movs r2, 0x32\n\
- ldrsh r0, [r5, r2]\n\
- cmp r0, 0xFF\n\
- bgt _081455D4\n\
- adds r0, r1, 0\n\
- adds r0, 0x8\n\
- strh r0, [r5, 0x32]\n\
- ldrh r4, [r5, 0x30]\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- movs r0, 0x32\n\
- ldrsh r1, [r5, r0]\n\
- movs r0, 0x80\n\
- lsls r0, 9\n\
- bl __divsi3\n\
- adds r1, r0, 0\n\
- lsls r1, 16\n\
- lsrs r1, 16\n\
- str r1, [sp]\n\
- adds r0, r4, 0\n\
- movs r2, 0\n\
- movs r3, 0\n\
- bl SetOamMatrix\n\
- b _081455DA\n\
-_081455D4:\n\
- ldrh r0, [r5, 0x2E]\n\
- adds r0, 0x1\n\
- strh r0, [r5, 0x2E]\n\
-_081455DA:\n\
- movs r2, 0x30\n\
- ldrsh r1, [r5, r2]\n\
- cmp r1, 0x2\n\
- beq _081456A6\n\
- cmp r1, 0x2\n\
- bgt _081455EC\n\
- cmp r1, 0x1\n\
- beq _081455F2\n\
- b _081456A6\n\
-_081455EC:\n\
- cmp r1, 0x3\n\
- beq _0814560A\n\
- b _081456A6\n\
-_081455F2:\n\
- ldrh r1, [r5, 0x3C]\n\
- movs r0, 0x3\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _08145602\n\
- ldrh r0, [r5, 0x22]\n\
- adds r0, 0x1\n\
- strh r0, [r5, 0x22]\n\
-_08145602:\n\
- ldrh r0, [r5, 0x20]\n\
- subs r0, 0x2\n\
- strh r0, [r5, 0x20]\n\
- b _081456A6\n\
-_0814560A:\n\
- ldrh r0, [r5, 0x3C]\n\
- ands r1, r0\n\
- cmp r1, 0\n\
- bne _08145618\n\
- ldrh r0, [r5, 0x22]\n\
- adds r0, 0x1\n\
- strh r0, [r5, 0x22]\n\
-_08145618:\n\
- ldrh r0, [r5, 0x20]\n\
- adds r0, 0x2\n\
- strh r0, [r5, 0x20]\n\
- b _081456A6\n\
-_08145620:\n\
- ldrh r1, [r5, 0x34]\n\
- movs r2, 0x34\n\
- ldrsh r0, [r5, r2]\n\
- cmp r0, 0\n\
- beq _08145630\n\
- subs r0, r1, 0x1\n\
- strh r0, [r5, 0x34]\n\
- b _081456A6\n\
-_08145630:\n\
- ldr r1, _0814565C @ =REG_BLDCNT\n\
- movs r2, 0xF4\n\
- lsls r2, 4\n\
- adds r0, r2, 0\n\
- strh r0, [r1]\n\
- adds r1, 0x2\n\
- movs r0, 0x10\n\
- strh r0, [r1]\n\
- ldrb r1, [r5, 0x1]\n\
- movs r0, 0xD\n\
- negs r0, r0\n\
- ands r0, r1\n\
- movs r1, 0x4\n\
- orrs r0, r1\n\
- strb r0, [r5, 0x1]\n\
- movs r0, 0x10\n\
- strh r0, [r5, 0x34]\n\
- ldrh r0, [r5, 0x2E]\n\
- adds r0, 0x1\n\
- strh r0, [r5, 0x2E]\n\
- b _081456A6\n\
- .align 2, 0\n\
-_0814565C: .4byte REG_BLDCNT\n\
-_08145660:\n\
- ldrh r1, [r5, 0x34]\n\
- movs r2, 0x34\n\
- ldrsh r0, [r5, r2]\n\
- cmp r0, 0\n\
- beq _08145684\n\
- subs r1, 0x1\n\
- strh r1, [r5, 0x34]\n\
- ldr r3, _08145680 @ =REG_BLDALPHA\n\
- movs r0, 0x34\n\
- ldrsh r2, [r5, r0]\n\
- movs r0, 0x10\n\
- subs r0, r2\n\
- lsls r0, 8\n\
- adds r1, r0\n\
- strh r1, [r3]\n\
- b _081456A6\n\
- .align 2, 0\n\
-_08145680: .4byte REG_BLDALPHA\n\
-_08145684:\n\
- adds r2, r5, 0\n\
- adds r2, 0x3E\n\
- ldrb r0, [r2]\n\
- movs r1, 0x4\n\
- orrs r0, r1\n\
- strb r0, [r2]\n\
- movs r0, 0xA\n\
- strh r0, [r5, 0x2E]\n\
- b _081456A6\n\
-_08145696:\n\
- ldr r0, _081456B0 @ =REG_BLDCNT\n\
- movs r1, 0\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- adds r0, r5, 0\n\
- bl DestroySprite\n\
-_081456A6:\n\
- add sp, 0x4\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_081456B0: .4byte REG_BLDCNT\n\
- .syntax divided\n");
+void spritecb_81454E0(struct Sprite *sprite) {
+ if (gUnknown_0203935C)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ sprite->data7 += 1;
+ switch (sprite->data0)
+ {
+ case 0:
+ default:
+ sprite->oam.affineMode = 1;
+ sprite->oam.matrixNum = sprite->data1;
+ sprite->data2 = 16;
+ SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2);
+ sprite->invisible = FALSE;
+ sprite->data0 = 1;
+ break;
+
+ case 1:
+ if (sprite->data2 < 256)
+ {
+ sprite->data2 += 8;
+ SetOamMatrix(sprite->data1, 0x10000 / sprite->data2, 0, 0, 0x10000 / sprite->data2);
+ }
+ else
+ {
+ sprite->data0 += 1;
+ }
+ switch (sprite->data1)
+ {
+ case 1:
+ if ((sprite->data7 & 3) == 0)
+ {
+ sprite->pos1.y += 1;
+ }
+ sprite->pos1.x -= 2;
+ break;
+ case 2:
+ break;
+ case 3:
+ if ((sprite->data7 & 3) == 0)
+ {
+ sprite->pos1.y += 1;
+ }
+ sprite->pos1.x += 2;
+ break;
+ }
+ break;
+
+ case 2:
+ if (sprite->data3 != 0)
+ {
+ sprite->data3 -= 1;
+ }
+ else
+ {
+ REG_BLDCNT = 0xF40;
+ REG_BLDALPHA = 0x10;
+ sprite->oam.objMode = 1;
+ sprite->data3 = 16;
+ sprite->data0 += 1;
+ }
+ break;
+
+ case 3:
+ if (sprite->data3 != 0)
+ {
+ int data3;
+ vu16 *reg;
+
+ sprite->data3 -= 1;
+
+ reg = &REG_BLDALPHA;
+ data3 = 16 - sprite->data3;
+ *reg = (data3 << 8) + sprite->data3;
+ }
+ else
+ {
+ sprite->invisible = TRUE;
+ sprite->data0 = 10;
+ }
+ break;
+
+ case 10:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ DestroySprite(sprite);
+ break;
+
+ }
}
-#ifdef NONMATCHING
-u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3)
+static u8 sub_81456B4(u16 species, u16 x, u16 y, u16 position)
{
- u32 species;
u32 personality;
void *palette;
u8 spriteId;
u8 spriteId2;
- species = NationalPokedexNumToSpecies(nationalNum);
+ species = NationalPokedexNumToSpecies(species);
+
switch (species)
{
- case SPECIES_UNOWN:
- personality = gSaveBlock2.pokedex.unownPersonality;
+ default:
+ personality = 0;
break;
case SPECIES_SPINDA:
personality = gSaveBlock2.pokedex.spindaPersonality;
break;
- default:
- personality = 0;
+ case SPECIES_UNOWN:
+ personality = gSaveBlock2.pokedex.unownPersonality;
break;
}
LoadSpecialPokePic(
&gMonFrontPicTable[species],
- gMonFrontPicCoords[species].x,
- gMonFrontPicCoords[species].y,
+ gMonFrontPicCoords[species].coords,
+ gMonFrontPicCoords[species].y_offset,
0x2000000,
- gUnknown_0840B5A0[arg3],
+ gUnknown_0840B5A0[position],
species,
personality,
1
);
palette = species_and_otid_get_pal(species, 0, 0xFFFF);
- LoadCompressedPalette(palette, 0x100 + (arg3 * 16), 0x20);
- sub_8143648(arg3, arg3);
+ LoadCompressedPalette(palette, 0x100 + (position * 16), 0x20);
+ sub_8143648(position, position);
spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0);
- gSprites[spriteId].oam.paletteNum = arg3;
+ gSprites[spriteId].oam.paletteNum = position;
gSprites[spriteId].oam.priority = 1;
- gSprites[spriteId].data1 = arg3 + 1;
+ gSprites[spriteId].data1 = position + 1;
gSprites[spriteId].invisible = TRUE;
gSprites[spriteId].callback = spritecb_81454E0;
spriteId2 = CreateSprite(&gSpriteTemplate_840CAEC, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1);
gSprites[spriteId2].data0 = spriteId;
- StartSpriteAnimIfDifferent(&gSprites[spriteId2], arg3);
+ StartSpriteAnimIfDifferent(&gSprites[spriteId2], position);
return spriteId;
}
-#else
-__attribute__((naked))
-u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3)
-{
- 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\
- sub sp, 0x14\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- lsls r1, 16\n\
- lsrs r1, 16\n\
- mov r10, r1\n\
- lsls r2, 16\n\
- lsrs r2, 16\n\
- str r2, [sp, 0x10]\n\
- lsls r3, 16\n\
- lsrs r3, 16\n\
- mov r9, r3\n\
- adds r0, r6, 0\n\
- bl NationalPokedexNumToSpecies\n\
- adds r6, r0, 0\n\
- cmp r6, 0xC9\n\
- beq _081456F8\n\
- movs r0, 0x9A\n\
- lsls r0, 1\n\
- cmp r6, r0\n\
- beq _081456EE\n\
- movs r7, 0\n\
- b _081456FC\n\
-_081456EE:\n\
- ldr r0, _081456F4 @ =gSaveBlock2\n\
- ldr r7, [r0, 0x20]\n\
- b _081456FC\n\
- .align 2, 0\n\
-_081456F4: .4byte gSaveBlock2\n\
-_081456F8:\n\
- ldr r0, _081457E8 @ =gSaveBlock2\n\
- ldr r7, [r0, 0x1C]\n\
-_081456FC:\n\
- lsls r0, r6, 3\n\
- ldr r1, _081457EC @ =gMonFrontPicTable\n\
- adds r0, r1\n\
- ldr r1, _081457F0 @ =gMonFrontPicCoords\n\
- lsls r2, r6, 2\n\
- adds r2, r1\n\
- ldrb r1, [r2]\n\
- ldrb r2, [r2, 0x1]\n\
- movs r3, 0x80\n\
- lsls r3, 18\n\
- ldr r4, _081457F4 @ =gUnknown_0840B5A0\n\
- mov r8, r4\n\
- mov r5, r9\n\
- lsls r4, r5, 2\n\
- add r4, r8\n\
- ldr r4, [r4]\n\
- str r4, [sp]\n\
- str r6, [sp, 0x4]\n\
- str r7, [sp, 0x8]\n\
- movs r4, 0x1\n\
- str r4, [sp, 0xC]\n\
- bl LoadSpecialPokePic\n\
- ldr r2, _081457F8 @ =0x0000ffff\n\
- adds r0, r6, 0\n\
- movs r1, 0\n\
- bl species_and_otid_get_pal\n\
- lsls r5, 4\n\
- mov r8, r5\n\
- movs r1, 0x80\n\
- lsls r1, 1\n\
- add r1, r8\n\
- lsls r1, 16\n\
- lsrs r1, 16\n\
- movs r2, 0x20\n\
- bl LoadCompressedPalette\n\
- mov r7, r9\n\
- lsls r6, r7, 24\n\
- lsrs r6, 24\n\
- mov r0, r9\n\
- adds r1, r6, 0\n\
- bl sub_8143648\n\
- ldr r0, _081457FC @ =gUnknown_02024E8C\n\
- mov r2, r10\n\
- lsls r1, r2, 16\n\
- asrs r1, 16\n\
- ldr r3, [sp, 0x10]\n\
- lsls r2, r3, 16\n\
- asrs r2, 16\n\
- movs r3, 0\n\
- bl CreateSprite\n\
- adds r4, r0, 0\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- ldr r5, _08145800 @ =gSprites\n\
- lsls r2, r4, 4\n\
- adds r2, r4\n\
- lsls r2, 2\n\
- adds r3, r2, r5\n\
- ldrb r1, [r3, 0x5]\n\
- movs r0, 0xF\n\
- ands r0, r1\n\
- mov r7, r8\n\
- orrs r0, r7\n\
- movs r1, 0xD\n\
- negs r1, r1\n\
- ands r0, r1\n\
- movs r1, 0x4\n\
- orrs r0, r1\n\
- strb r0, [r3, 0x5]\n\
- mov r0, r9\n\
- adds r0, 0x1\n\
- strh r0, [r3, 0x30]\n\
- movs r0, 0x3E\n\
- adds r0, r3\n\
- mov r8, r0\n\
- ldrb r0, [r0]\n\
- orrs r0, r1\n\
- mov r1, r8\n\
- strb r0, [r1]\n\
- adds r0, r5, 0\n\
- adds r0, 0x1C\n\
- adds r2, r0\n\
- ldr r0, _08145804 @ =spritecb_81454E0\n\
- str r0, [r2]\n\
- ldr r0, _08145808 @ =gSpriteTemplate_840CAEC\n\
- movs r2, 0x20\n\
- ldrsh r1, [r3, r2]\n\
- movs r7, 0x22\n\
- ldrsh r2, [r3, r7]\n\
- movs r3, 0x1\n\
- bl CreateSprite\n\
- adds r1, r0, 0\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- lsls r0, r1, 4\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r5\n\
- strh r4, [r0, 0x2E]\n\
- adds r1, r6, 0\n\
- bl StartSpriteAnimIfDifferent\n\
- adds r0, r4, 0\n\
- add sp, 0x14\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .align 2, 0\n\
-_081457E8: .4byte gSaveBlock2\n\
-_081457EC: .4byte gMonFrontPicTable\n\
-_081457F0: .4byte gMonFrontPicCoords\n\
-_081457F4: .4byte gUnknown_0840B5A0\n\
-_081457F8: .4byte 0x0000ffff\n\
-_081457FC: .4byte gUnknown_02024E8C\n\
-_08145800: .4byte gSprites\n\
-_08145804: .4byte spritecb_81454E0\n\
-_08145808: .4byte gSpriteTemplate_840CAEC\n\
- .syntax divided\n");
-}
-#endif
void spritecb_814580C(struct Sprite *sprite)
{
@@ -2015,223 +1575,79 @@ void spritecb_814580C(struct Sprite *sprite)
sprite->pos1.y = gSprites[sprite->data0].pos1.y;
}
-__attribute__((naked))
-void sub_81458DC(void)
-{
- 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\
- sub sp, 0x4\n\
- ldr r7, _0814597C @ =0x0201c000\n\
- ldr r0, _08145980 @ =0x00004023\n\
- bl VarGet\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- bl GetStarterPokemon\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- bl SpeciesToNationalPokedexNum\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r10, r0\n\
- movs r4, 0x1\n\
- movs r5, 0\n\
- ldr r0, _08145984 @ =0x00000181\n\
- mov r8, r0\n\
-_0814590E:\n\
- adds r0, r4, 0\n\
- movs r1, 0x1\n\
- bl GetNationalPokedexFlag\n\
- lsls r0, 24\n\
- adds r6, r7, 0\n\
- adds r6, 0x90\n\
- cmp r0, 0\n\
- beq _0814592C\n\
- lsls r0, r5, 1\n\
- adds r0, r6, r0\n\
- strh r4, [r0]\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
-_0814592C:\n\
- adds r0, r4, 0x1\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- cmp r4, r8\n\
- bls _0814590E\n\
- adds r4, r5, 0\n\
- ldr r0, _08145984 @ =0x00000181\n\
- lsls r1, r4, 16\n\
- mov r9, r1\n\
- movs r2, 0x8E\n\
- adds r2, r7\n\
- mov r8, r2\n\
- adds r1, r7, 0\n\
- adds r1, 0x86\n\
- str r1, [sp]\n\
- cmp r4, r0\n\
- bhi _08145964\n\
- adds r1, r6, 0\n\
- movs r3, 0\n\
- adds r2, r0, 0\n\
-_08145954:\n\
- lsls r0, r4, 1\n\
- adds r0, r1, r0\n\
- strh r3, [r0]\n\
- adds r0, r4, 0x1\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- cmp r4, r2\n\
- bls _08145954\n\
-_08145964:\n\
- movs r2, 0xE5\n\
- lsls r2, 2\n\
- adds r0, r7, r2\n\
- strh r5, [r0]\n\
- mov r1, r9\n\
- lsrs r0, r1, 16\n\
- cmp r0, 0x43\n\
- bhi _08145988\n\
- mov r2, r8\n\
- strh r5, [r2]\n\
- b _0814598E\n\
- .align 2, 0\n\
-_0814597C: .4byte 0x0201c000\n\
-_08145980: .4byte 0x00004023\n\
-_08145984: .4byte 0x00000181\n\
-_08145988:\n\
- movs r0, 0x44\n\
- mov r1, r8\n\
- strh r0, [r1]\n\
-_0814598E:\n\
- movs r5, 0\n\
- movs r2, 0xE5\n\
- lsls r2, 2\n\
- adds r4, r7, r2\n\
- mov r9, r5\n\
- b _0814599E\n\
-_0814599A:\n\
- cmp r5, 0x43\n\
- bhi _081459EE\n\
-_0814599E:\n\
- bl Random\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- ldrh r1, [r4]\n\
- bl __umodsi3\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- lsls r1, r5, 1\n\
- adds r1, r7, r1\n\
- lsls r0, r2, 1\n\
- adds r3, r6, r0\n\
- ldrh r0, [r3]\n\
- strh r0, [r1]\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- mov r0, r9\n\
- strh r0, [r3]\n\
- ldrh r0, [r4]\n\
- subs r0, 0x1\n\
- strh r0, [r4]\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r2, r0\n\
- beq _081459E8\n\
- ldrh r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6, r0\n\
- ldrh r0, [r0]\n\
- strh r0, [r3]\n\
- ldrh r0, [r4]\n\
- lsls r0, 1\n\
- adds r0, r6, r0\n\
- mov r1, r9\n\
- strh r1, [r0]\n\
-_081459E8:\n\
- ldrh r0, [r4]\n\
- cmp r0, 0\n\
- bne _0814599A\n\
-_081459EE:\n\
- mov r2, r8\n\
- ldrh r0, [r2]\n\
- cmp r0, 0x43\n\
- bhi _08145A26\n\
- adds r5, r0, 0\n\
- movs r2, 0\n\
- cmp r5, 0x43\n\
- bhi _08145A5C\n\
- mov r3, r8\n\
-_08145A00:\n\
- lsls r1, r5, 1\n\
- adds r1, r7, r1\n\
- lsls r0, r2, 1\n\
- adds r0, r7, r0\n\
- ldrh r0, [r0]\n\
- strh r0, [r1]\n\
- adds r0, r2, 0x1\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- ldrh r0, [r3]\n\
- cmp r2, r0\n\
- bne _08145A1A\n\
- movs r2, 0\n\
-_08145A1A:\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- cmp r5, 0x43\n\
- bls _08145A00\n\
- b _08145A5C\n\
-_08145A26:\n\
- movs r4, 0\n\
- ldrh r0, [r7]\n\
- cmp r0, r10\n\
- beq _08145A42\n\
-_08145A2E:\n\
- adds r0, r4, 0x1\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- lsls r0, r4, 1\n\
- adds r0, r7, r0\n\
- ldrh r0, [r0]\n\
- cmp r0, r10\n\
- beq _08145A42\n\
- cmp r4, 0x43\n\
- bls _08145A2E\n\
-_08145A42:\n\
- mov r1, r8\n\
- ldrh r0, [r1]\n\
- subs r0, 0x1\n\
- cmp r4, r0\n\
- bge _08145A5C\n\
- lsls r0, r4, 1\n\
- adds r0, r7, r0\n\
- ldr r2, [sp]\n\
- ldrh r1, [r2]\n\
- strh r1, [r0]\n\
- mov r0, r10\n\
- strh r0, [r2]\n\
- b _08145A62\n\
-_08145A5C:\n\
- mov r2, r10\n\
- ldr r1, [sp]\n\
- strh r2, [r1]\n\
-_08145A62:\n\
- movs r0, 0x44\n\
- mov r1, r8\n\
- strh r0, [r1]\n\
- add sp, 0x4\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");
+static void sub_81458DC(void) {
+ struct Unk201C000 *unk201C000 = &ewram1c000;
+ u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_FIRST_POKE)));
+ u16 seenTypesCount;
+ u16 page;
+ u16 dexNum;
+ u16 j;
+
+ for (dexNum = 1, seenTypesCount = 0; dexNum < 386; dexNum++)
+ {
+ if (GetNationalPokedexFlag(dexNum, 1))
+ {
+ unk201C000->unk90[seenTypesCount] = dexNum;
+ seenTypesCount++;
+ }
+ }
+
+ for (dexNum = seenTypesCount; dexNum < 386; dexNum++)
+ {
+ unk201C000->unk90[dexNum] = 0;
+ }
+
+ unk201C000->unk394 = seenTypesCount;
+ if (unk201C000->unk394 < POKEMON_TILE_COUNT)
+ {
+ unk201C000->unk8E = seenTypesCount;
+ }
+ else
+ {
+ unk201C000->unk8E = POKEMON_TILE_COUNT;
+ }
+
+ j = 0;
+ do
+ {
+ page = Random() % unk201C000->unk394;
+ unk201C000->unk0[j] = unk201C000->unk90[page];
+
+ j++;
+ unk201C000->unk90[page] = 0;
+ unk201C000->unk394--;
+ if (page != unk201C000->unk394)
+ {
+ unk201C000->unk90[page] = unk201C000->unk90[unk201C000->unk394];
+ unk201C000->unk90[unk201C000->unk394] = 0;
+ }
+ }
+ while (unk201C000->unk394 != 0 && j < POKEMON_TILE_COUNT);
+
+ if (unk201C000->unk8E < POKEMON_TILE_COUNT)
+ {
+ for (j = unk201C000->unk8E, page = 0; j < POKEMON_TILE_COUNT; j++)
+ {
+ unk201C000->unk0[j] = unk201C000->unk0[page];
+
+ page++;
+ if (page == unk201C000->unk8E)
+ page = 0;
+ }
+ unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter;
+ }
+ else
+ {
+
+ for (dexNum = 0; unk201C000->unk0[dexNum] != starter && dexNum < POKEMON_TILE_COUNT; dexNum++);
+
+ if (dexNum < unk201C000->unk8E - 1)
+ {
+ unk201C000->unk0[dexNum] = unk201C000->unk0[POKEMON_TILE_COUNT - 1];
+ unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter;
+ }
+ else
+ unk201C000->unk0[POKEMON_TILE_COUNT - 1] = starter;
+ }
+ unk201C000->unk8E = POKEMON_TILE_COUNT;
}
diff --git a/src/daycare.c b/src/daycare.c
index 1729efb2a..92be45cfa 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -1,8 +1,11 @@
#include "global.h"
#include "pokemon.h"
#include "string_util.h"
+#include "asm.h"
-u8 *pokemon_get_nick(struct Pokemon *mon, u8 *dest)
+extern u8 gLastFieldPokeMenuOpened;
+
+u8 *GetMonNick(struct Pokemon *mon, u8 *dest)
{
s8 nickname[POKEMON_NAME_LENGTH * 2];
@@ -10,7 +13,7 @@ u8 *pokemon_get_nick(struct Pokemon *mon, u8 *dest)
return StringCopy10(dest, nickname);
}
-u8 *pokemon_get_nick_(struct BoxPokemon *mon, u8 *dest)
+u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest)
{
s8 nickname[POKEMON_NAME_LENGTH * 2];
@@ -18,14 +21,368 @@ u8 *pokemon_get_nick_(struct BoxPokemon *mon, u8 *dest)
return StringCopy10(dest, nickname);
}
-u8 daycare_count_pokemon(struct BoxPokemon *daycare_data)
+u8 Daycare_CountPokemon(struct BoxPokemon *daycare_data)
{
u8 i, count;
count = 0;
- for (i = 0; i <= 1; i++)
- if (GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0)
+ for(i = 0;i <= 1;i++)
+ if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0)
count++;
return count;
}
+
+#ifndef ASDF
+__attribute__((naked))
+void sub_8041324(struct BoxPokemon * box_pokemon, void * 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");
+}
+#endif
+
+s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data)
+{
+ u8 i;
+
+ for(i = 0;i <= 1;i++)
+ if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) == 0)
+ return i;
+
+ return -1;
+}
+
+/*void Daycare_SendPokemon(struct Pokemon * mon, struct BoxPokemon * daycare_data){ // unfinished
+ s8 empty_slot;
+
+ empty_slot = Daycare_FindEmptySpot(daycare_data);
+ if(MonHasMail(mon) != 0){ // if the mon holds a mail?
+ u8 empty_slot_times_56 = empty_slot * 56;
+ u8 * something2 = ((u8 *) (daycare_data + 2)) + empty_slot_times_56 + 36;
+ StringCopy(something2, gSaveBlock2.playerName);
+ PadNameString(something2, 0xFC);
+ something2 += 8;
+ GetMonNick(mon, something2);
+ u8 pokerus = GetMonData(mon, MON_DATA_64);
+ something1 += (u8 * daycare_data)
+}*/
+
+__attribute__((naked))
+void Daycare_SendPokemon()
+{
+ // strange stack usage - happens because THUMB ARM only allows R0-R7 to be pushed/popped:
+ // all registers in reglist must be Lo registers, except that PUSH can include the LR, and POP can include the PC
+ // the ldm/stm section probably copies some struct, but I'm not sure how the code would look
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ adds r7, r0, 0\n\
+ mov r8, r1\n\
+ mov r0, r8\n\
+ bl Daycare_FindEmptySpot\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ mov r9, r4\n\
+ adds r0, r7, 0\n\
+ bl MonHasMail\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0804144A\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ lsls r4, r0, 3\n\
+ subs r4, r0\n\
+ lsls r4, 3\n\
+ adds r5, r4, 0\n\
+ adds r5, 0xA0\n\
+ add r5, r8\n\
+ adds r6, r5, 0\n\
+ adds r6, 0x24\n\
+ ldr r1, _08041490 @ =gSaveBlock2\n\
+ adds r0, r6, 0\n\
+ bl StringCopy\n\
+ adds r0, r6, 0\n\
+ movs r1, 0xFC\n\
+ bl PadNameString\n\
+ adds r6, 0x8\n\
+ adds r0, r7, 0\n\
+ adds r1, r6, 0\n\
+ bl GetMonNick\n\
+ adds r0, r7, 0\n\
+ movs r1, 0x40\n\
+ bl GetMonData\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ add r4, r8\n\
+ ldr r2, _08041494 @ =gSaveBlock1\n\
+ lsls r1, r0, 3\n\
+ adds r1, r0\n\
+ lsls r1, 2\n\
+ adds r1, r2\n\
+ adds r4, 0xA0\n\
+ ldr r0, _08041498 @ =0x00002b4c\n\
+ adds r1, r0\n\
+ ldm r1!, {r0,r2,r3}\n\
+ stm r4!, {r0,r2,r3}\n\
+ ldm r1!, {r0,r2,r3}\n\
+ stm r4!, {r0,r2,r3}\n\
+ ldm r1!, {r0,r2,r3}\n\
+ stm r4!, {r0,r2,r3}\n\
+ adds r0, r7, 0\n\
+ bl TakeMailFromMon\n\
+_0804144A:\n\
+ mov r2, r9\n\
+ lsls r4, r2, 24\n\
+ asrs r4, 24\n\
+ lsls r5, r4, 2\n\
+ adds r4, r5, r4\n\
+ lsls r4, 4\n\
+ add r4, r8\n\
+ adds r0, r4, 0\n\
+ adds r1, r7, 0\n\
+ movs r2, 0x50\n\
+ bl memcpy\n\
+ adds r0, r4, 0\n\
+ bl BoxMonRestorePP\n\
+ movs r0, 0x88\n\
+ lsls r0, 1\n\
+ add r0, r8\n\
+ adds r0, r5\n\
+ movs r1, 0\n\
+ str r1, [r0]\n\
+ adds r0, r7, 0\n\
+ bl ZeroMonData\n\
+ bl party_compaction\n\
+ bl CalculatePlayerPartyCount\n\
+ pop {r3,r4}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08041490: .4byte gSaveBlock2\n\
+_08041494: .4byte gSaveBlock1\n\
+_08041498: .4byte 0x00002b4c\n\
+ .syntax divided\n");
+}
+
+void Daycare_SendPokemon_Special()
+{
+ Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, gSaveBlock1.daycareData);
+}
+
+void sub_80417F4(u8 *);
+
+void sub_80414C0(struct BoxPokemon * daycare_data)
+{
+ u32 second_species;
+ if((GetBoxMonData(&daycare_data[1], MON_DATA_SPECIES) != 0) && ((second_species = GetBoxMonData(&daycare_data[0], MON_DATA_SPECIES)) == 0)){
+ daycare_data[0] = daycare_data[1];
+ ZeroBoxMonData(&daycare_data[1]);
+ memcpy(daycare_data + 2, (u8 *) (daycare_data + 1) + 0x88, 0x38);
+ *((u32 *)(daycare_data) + 68) = *((u32 *)(daycare_data) + 69);
+ *((u32 *)(daycare_data) + 69) = second_species;
+ sub_80417F4((u8 *) (daycare_data + 1) + 0x88);
+ }
+}
+
+u8 TryIncrementMonLevel(struct Pokemon *);
+extern u16 word_2024E82;
+
+void sub_804151C(struct Pokemon * mon)
+{
+ s32 i;
+ u8 r6;
+ u16 temp;
+
+ for(i = 0; i < 100; i++){
+ if(TryIncrementMonLevel(mon) == FALSE) goto end;
+
+ r6 = 1;
+ while((temp = sub_803B7C8(mon, r6)) != 0){
+ r6 = 0;
+ if(temp == 0xffff){
+ DeleteFirstMoveAndGiveMoveToMon(mon, word_2024E82);
+ }
+ }
+ }
+
+ end:
+
+ CalculateMonStats(mon);
+}
+
+__attribute__((naked))
+u16 sub_8041570(struct BoxPokemon * daycare_data, u8 a2){
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ sub sp, 0x68\n\
+ adds r5, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r4, r1, 24\n\
+ lsls r7, r4, 2\n\
+ adds r0, r7, r4\n\
+ lsls r0, 4\n\
+ adds r6, r5, r0\n\
+ ldr r1, _08041640 @ =gStringVar1\n\
+ adds r0, r6, 0\n\
+ bl GetBoxMonNick\n\
+ adds r0, r6, 0\n\
+ movs r1, 0xB\n\
+ bl GetBoxMonData\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r9, r0\n\
+ adds r0, r6, 0\n\
+ mov r1, sp\n\
+ bl sub_803B4B4\n\
+ mov r0, sp\n\
+ movs r1, 0x38\n\
+ bl GetMonData\n\
+ cmp r0, 0x64\n\
+ beq _080415D8\n\
+ mov r0, sp\n\
+ movs r1, 0x19\n\
+ bl GetMonData\n\
+ movs r2, 0x88\n\
+ lsls r2, 1\n\
+ adds r1, r5, r2\n\
+ adds r1, r7\n\
+ ldr r1, [r1]\n\
+ adds r0, r1\n\
+ str r0, [sp, 0x64]\n\
+ add r2, sp, 0x64\n\
+ mov r0, sp\n\
+ movs r1, 0x19\n\
+ bl SetMonData\n\
+ mov r0, sp\n\
+ bl sub_804151C\n\
+_080415D8:\n\
+ ldr r0, _08041644 @ =gPlayerParty\n\
+ movs r1, 0xFA\n\
+ lsls r1, 1\n\
+ adds r1, r0\n\
+ mov r8, r1\n\
+ mov r0, r8\n\
+ mov r1, sp\n\
+ movs r2, 0x64\n\
+ bl memcpy\n\
+ lsls r0, r4, 3\n\
+ subs r0, r4\n\
+ lsls r1, r0, 3\n\
+ adds r0, r5, r1\n\
+ adds r0, 0xC0\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _08041610\n\
+ adds r4, r1, 0\n\
+ adds r4, 0xA0\n\
+ adds r4, r5, r4\n\
+ mov r0, r8\n\
+ adds r1, r4, 0\n\
+ bl GiveMailToMon2\n\
+ adds r0, r4, 0\n\
+ bl sub_80417F4\n\
+_08041610:\n\
+ bl party_compaction\n\
+ adds r0, r6, 0\n\
+ bl ZeroBoxMonData\n\
+ movs r2, 0x88\n\
+ lsls r2, 1\n\
+ adds r0, r5, r2\n\
+ adds r0, r7\n\
+ movs r1, 0\n\
+ str r1, [r0]\n\
+ adds r0, r5, 0\n\
+ bl sub_80414C0\n\
+ bl CalculatePlayerPartyCount\n\
+ mov r0, r9\n\
+ add sp, 0x68\n\
+ pop {r3,r4}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_08041640: .4byte gStringVar1\n\
+_08041644: .4byte gPlayerParty\n\
+ .syntax divided");
+}
+
+extern u8 gSpecialVar_0x8004;
+
+u16 sub_8041648()
+{
+ return sub_8041570(gSaveBlock1.daycareData, gSpecialVar_0x8004);
+}
+
+u8 Daycare_GetLevelAfterSteps(struct BoxPokemon * mon, u32 steps){
+ struct BoxPokemon temp = *mon;
+ u32 new_exp = GetBoxMonData(mon, MON_DATA_EXP) + steps;
+ SetBoxMonData(&temp, MON_DATA_EXP, (u8 *) &new_exp);
+ return GetLevelFromBoxMonExp(&temp);
+}
diff --git a/src/decompress.c b/src/decompress.c
index 12be8a055..37aa1e8d5 100644
--- a/src/decompress.c
+++ b/src/decompress.c
@@ -1,15 +1,12 @@
#include "global.h"
#include "decompress.h"
#include "asm.h"
+#include "data2.h"
#include "species.h"
#include "text.h"
#define WRAM 0x02000000
-extern struct SpriteSheet gMonFrontPicTable[];
-extern struct SpriteSheet gMonBackPicTable[];
-extern void *gUnknown_081FAF4C[];
-
void sub_800D238(const void *src, void *dest)
{
LZ77UnCompWram(src, dest);
diff --git a/src/diploma.c b/src/diploma.c
index c32b72a70..80adac8f7 100644
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -7,13 +7,10 @@
#include "rom4.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings2.h"
#include "task.h"
#include "text.h"
-extern u8 gOtherText_NationalDex[];
-extern u8 gOtherText_HoennDex[];
-extern u8 gOtherText_DiplomaCertificationGameFreak[];
-
static void VBlankCB(void);
static void MainCB2(void);
static void Task_DiplomaFadeIn(u8);
diff --git a/src/easy_chat.c b/src/easy_chat.c
index 33d7678bb..720adad79 100644
--- a/src/easy_chat.c
+++ b/src/easy_chat.c
@@ -1,19 +1,24 @@
#include "global.h"
#include "easy_chat.h"
#include "asm.h"
+#include "data2.h"
#include "event_data.h"
#include "field_message_box.h"
#include "pokedex.h"
#include "rng.h"
+#include "string_util.h"
+#include "strings.h"
+#include "strings2.h"
#include "text.h"
+u8 sub_80EB37C(u16);
u8 sub_80EB8C0(void);
u8 sub_80EB868(u8);
u16 sub_80EAE88(u8);
void sub_80EB890(u8);
u16 sub_80EB784(u16 group);
u8 sub_80EAD7C(u8 group);
-u8 sub_80EB680(u16 *, u16, u16, u16);
+static bool8 sub_80EB680(u16 *, u16, u16, u16);
static u16 sub_80EB9D8(void);
static u16 sub_80EB960(void);
u16 sub_80EB72C(u16);
@@ -23,6 +28,229 @@ extern const u8 gEasyChatGroupSizes[];
extern u16 gSpecialVar_0x8004;
+#ifdef NONMATCHING
+u8 *sub_80EB3FC(u8 *dst, u16 word) {
+ int group, wordIndex;
+ u8 *src;
+ u16 i;
+
+
+ if (sub_80EB37C(word))
+ {
+ return StringCopy(dst, gOtherText_ThreeQuestions);
+ }
+
+ if (word != 0xFFFF)
+ {
+ group = word >> 9;
+ wordIndex = word & 0x1FF;
+ switch (group)
+ {
+ case EC_GROUP_POKEMON: // 0
+ case EC_GROUP_POKEMON_2: // 21
+ dst = StringCopy(dst, gSpeciesNames[wordIndex]);
+ break;
+
+ case EC_GROUP_MOVE_1: // 18
+ case EC_GROUP_MOVE_2: // 19
+ dst = StringCopy(dst, gMoveNames[wordIndex]);
+ break;
+
+ default:
+ src = gEasyChatGroupWords[group];
+
+ i = wordIndex - 1;
+ while (i != 0xFFFF)
+ {
+ while (*src++ != EOS)
+ {
+ }
+ i--;
+ }
+ dst = StringCopy(dst, src);
+ break;
+ }
+ }
+
+ dst[0] = EOS;
+ return dst;
+}
+#endif
+
+u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3) {
+ u16 i;
+ u16 n;
+
+ const u16 i1 = arg2 - 1;
+
+ for (i = 0; i < arg3; i++)
+ {
+ u16 word;
+
+ for (n = 0; n < i1; n++)
+ {
+ dst = sub_80EB3FC(dst, words[0]);
+
+ if (words[0] != 0xFFFF)
+ {
+ dst[0] = CHAR_SPACE;
+ dst++;
+ }
+
+ words++;
+ }
+
+ word = words[0];
+ words++;
+ dst = sub_80EB3FC(dst, word);
+
+ dst[0] = 0xFE;
+ dst++;
+ }
+
+ dst--;
+ dst[0] = EOS;
+
+ return dst;
+}
+
+u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3) {
+ u16 i;
+ u16 n;
+
+ const u16 i1 = arg2 - 1;
+
+ for (i = 0; i < arg3; i++)
+ {
+ u16 word;
+
+ for (n = 0; n < i1; n++)
+ {
+ dst = sub_80EB3FC(dst, words[0]);
+
+ if (words[0] != 0xFFFF)
+ {
+ dst[0] = CHAR_SPACE;
+ dst++;
+ }
+
+ words++;
+ }
+
+ word = words[0];
+ words++;
+ dst = sub_80EB3FC(dst, word);
+
+ // Only difference with ConvertEasyChatWordsToString
+ dst[0] = (i == 0) ? 0xFE : 0xFA;
+ dst++;
+ }
+
+ dst--;
+ dst[0] = EOS;
+
+ return dst;
+}
+
+
+u16 unref_sub_80EB5E0(u16 arg0) {
+ u8 *chars;
+ u16 i;
+ u16 strlen;
+ int group, word;
+
+
+ if (arg0 == 0xFFFF)
+ {
+ return 0;
+ }
+
+ group = arg0 >> 9;
+ word = arg0 & 0x1FF;
+ switch (group)
+ {
+ case EC_GROUP_POKEMON: // 0
+ case EC_GROUP_POKEMON_2: // 21
+ chars = (u8 *) gSpeciesNames[word];
+ break;
+
+ case EC_GROUP_MOVE_1: // 18
+ case EC_GROUP_MOVE_2: // 19
+ chars = gMoveNames[word];
+ break;
+
+ default:
+ chars = gEasyChatGroupWords[group];
+
+ i = word - 1;
+ while (i != 0xFFFF)
+ {
+ while (*chars++ != EOS)
+ {
+ }
+ i--;
+ }
+ break;
+ }
+
+ strlen = 0;
+ while (*chars != EOS)
+ {
+ chars++;
+ strlen += 1;
+ }
+
+ return strlen;
+}
+
+static bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3) {
+ return FALSE;
+}
+
+void unref_sub_80EB684(u8 arg0, u16 arg1) {
+ u16 *ptr;
+ u16 c;
+
+ // FIXME: find actual tv shows used
+ switch (arg0)
+ {
+ case 5:
+ c = 6;
+ ptr = (u16*)((void *)&gSaveBlock1.tvShows.shows[arg1] + 0x04);
+ break;
+ case 7:
+ c = 2;
+ ptr = (u16*)((void *)&gSaveBlock1.tvShows.shows[arg1] + 0x1C);
+ break;
+ case 8:
+ c = 1;
+ ptr = (u16*)((void *)&gSaveBlock1.tvShows.shows[arg1] + 0x02);
+ break;
+
+ default:
+ return;
+ }
+
+ c -= 1;
+ while (c != 0xFFFF)
+ {
+ *ptr = -1;
+ ptr++;
+ c -= 1;
+ }
+}
+
+void sub_80EB6FC(u16 *arg0, u16 arg1) {
+ u16 i;
+
+ for (i = arg1 - 1; i != 0xFFFF; i--)
+ {
+ *arg0 = 0xFFFF;
+ arg0++;
+ }
+
+}
+
u16 sub_80EB72C(u16 group) {
u16 local1;
@@ -260,3 +488,4 @@ static u16 sub_80EB9D8(void) {
return -1;
}
+
diff --git a/src/field_camera.c b/src/field_camera.c
index 442bc095b..df5ccc301 100644
--- a/src/field_camera.c
+++ b/src/field_camera.c
@@ -25,16 +25,6 @@ extern s16 gUnknown_0300059A;
extern u8 gUnknown_0300059C;
extern void (*gUnknown_030005A0)(void);
-struct CameraSomething
-{
- void (*callback)(struct CameraSomething *);
- u32 unk4;
- s32 unk8;
- s32 unkC;
- s32 unk10;
- s32 unk14;
-};
-
extern struct CameraSomething gUnknown_03004880;
extern u16 gUnknown_03004898;
extern u16 gUnknown_0300489C;
@@ -258,54 +248,54 @@ static void DrawMetatile(s32 a, u16 *b, u16 c)
{
switch (a)
{
- case 2:
- gBGTilemapBuffers[3][c] = b[0];
- gBGTilemapBuffers[3][c + 1] = b[1];
- gBGTilemapBuffers[3][c + 0x20] = b[2];
- gBGTilemapBuffers[3][c + 0x21] = b[3];
-
- gBGTilemapBuffers[2][c] = 0;
- gBGTilemapBuffers[2][c + 1] = 0;
- gBGTilemapBuffers[2][c + 0x20] = 0;
- gBGTilemapBuffers[2][c + 0x21] = 0;
-
- gBGTilemapBuffers[1][c] = b[4];
- gBGTilemapBuffers[1][c + 1] = b[5];
- gBGTilemapBuffers[1][c + 0x20] = b[6];
- gBGTilemapBuffers[1][c + 0x21] = b[7];
- break;
- case 1:
- gBGTilemapBuffers[3][c] = b[0];
- gBGTilemapBuffers[3][c + 1] = b[1];
- gBGTilemapBuffers[3][c + 0x20] = b[2];
- gBGTilemapBuffers[3][c + 0x21] = b[3];
-
- gBGTilemapBuffers[2][c] = b[4];
- gBGTilemapBuffers[2][c + 1] = b[5];
- gBGTilemapBuffers[2][c + 0x20] = b[6];
- gBGTilemapBuffers[2][c + 0x21] = b[7];
-
- gBGTilemapBuffers[1][c] = 0;
- gBGTilemapBuffers[1][c + 1] = 0;
- gBGTilemapBuffers[1][c + 0x20] = 0;
- gBGTilemapBuffers[1][c + 0x21] = 0;
- break;
- case 0:
- gBGTilemapBuffers[3][c] = 0x3014;
- gBGTilemapBuffers[3][c + 1] = 0x3014;
- gBGTilemapBuffers[3][c + 0x20] = 0x3014;
- gBGTilemapBuffers[3][c + 0x21] = 0x3014;
-
- gBGTilemapBuffers[2][c] = b[0];
- gBGTilemapBuffers[2][c + 1] = b[1];
- gBGTilemapBuffers[2][c + 0x20] = b[2];
- gBGTilemapBuffers[2][c + 0x21] = b[3];
-
- gBGTilemapBuffers[1][c] = b[4];
- gBGTilemapBuffers[1][c + 1] = b[5];
- gBGTilemapBuffers[1][c + 0x20] = b[6];
- gBGTilemapBuffers[1][c + 0x21] = b[7];
- break;
+ case 2:
+ gBGTilemapBuffers[3][c] = b[0];
+ gBGTilemapBuffers[3][c + 1] = b[1];
+ gBGTilemapBuffers[3][c + 0x20] = b[2];
+ gBGTilemapBuffers[3][c + 0x21] = b[3];
+
+ gBGTilemapBuffers[2][c] = 0;
+ gBGTilemapBuffers[2][c + 1] = 0;
+ gBGTilemapBuffers[2][c + 0x20] = 0;
+ gBGTilemapBuffers[2][c + 0x21] = 0;
+
+ gBGTilemapBuffers[1][c] = b[4];
+ gBGTilemapBuffers[1][c + 1] = b[5];
+ gBGTilemapBuffers[1][c + 0x20] = b[6];
+ gBGTilemapBuffers[1][c + 0x21] = b[7];
+ break;
+ case 1:
+ gBGTilemapBuffers[3][c] = b[0];
+ gBGTilemapBuffers[3][c + 1] = b[1];
+ gBGTilemapBuffers[3][c + 0x20] = b[2];
+ gBGTilemapBuffers[3][c + 0x21] = b[3];
+
+ gBGTilemapBuffers[2][c] = b[4];
+ gBGTilemapBuffers[2][c + 1] = b[5];
+ gBGTilemapBuffers[2][c + 0x20] = b[6];
+ gBGTilemapBuffers[2][c + 0x21] = b[7];
+
+ gBGTilemapBuffers[1][c] = 0;
+ gBGTilemapBuffers[1][c + 1] = 0;
+ gBGTilemapBuffers[1][c + 0x20] = 0;
+ gBGTilemapBuffers[1][c + 0x21] = 0;
+ break;
+ case 0:
+ gBGTilemapBuffers[3][c] = 0x3014;
+ gBGTilemapBuffers[3][c + 1] = 0x3014;
+ gBGTilemapBuffers[3][c + 0x20] = 0x3014;
+ gBGTilemapBuffers[3][c + 0x21] = 0x3014;
+
+ gBGTilemapBuffers[2][c] = b[0];
+ gBGTilemapBuffers[2][c + 1] = b[1];
+ gBGTilemapBuffers[2][c + 0x20] = b[2];
+ gBGTilemapBuffers[2][c + 0x21] = b[3];
+
+ gBGTilemapBuffers[1][c] = b[4];
+ gBGTilemapBuffers[1][c + 1] = b[5];
+ gBGTilemapBuffers[1][c + 0x20] = b[6];
+ gBGTilemapBuffers[1][c + 0x21] = b[7];
+ break;
}
}
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c
index c5f2c08e7..8220a144b 100644
--- a/src/field_control_avatar.c
+++ b/src/field_control_avatar.c
@@ -342,41 +342,41 @@ static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *position, u8 unuse
return gUnknown_081C6C02;
switch (bgEvent->kind)
{
- case 0:
- default:
- return bgEvent->bgUnion.script;
- case 1:
- if (c != 2)
- return NULL;
- break;
- case 2:
- if (c != 1)
- return NULL;
- break;
- case 3:
- if (c != 4)
- return NULL;
- break;
- case 4:
- if (c != 3)
- return NULL;
- break;
- case 5:
- case 6:
- case 7:
- gSpecialVar_0x8004 = ((u32)bgEvent->bgUnion.script >> 16) + 0x258;
- gSpecialVar_0x8005 = (u32)bgEvent->bgUnion.script;
- if (FlagGet(gSpecialVar_0x8004) == TRUE)
- return NULL;
- return HiddenItemScript;
- case 8:
- if (c == 2)
- {
- gSpecialVar_0x8004 = (u32)bgEvent->bgUnion.script;
- if (sub_80BC050())
- return gUnknown_081A2C51;
- }
+ case 0:
+ default:
+ return bgEvent->bgUnion.script;
+ case 1:
+ if (c != 2)
+ return NULL;
+ break;
+ case 2:
+ if (c != 1)
+ return NULL;
+ break;
+ case 3:
+ if (c != 4)
return NULL;
+ break;
+ case 4:
+ if (c != 3)
+ return NULL;
+ break;
+ case 5:
+ case 6:
+ case 7:
+ gSpecialVar_0x8004 = ((u32)bgEvent->bgUnion.script >> 16) + 0x258;
+ gSpecialVar_0x8005 = (u32)bgEvent->bgUnion.script;
+ if (FlagGet(gSpecialVar_0x8004) == TRUE)
+ return NULL;
+ return HiddenItemScript;
+ case 8:
+ if (c == 2)
+ {
+ gSpecialVar_0x8004 = (u32)bgEvent->bgUnion.script;
+ if (sub_80BC050())
+ return gUnknown_081A2C51;
+ }
+ return NULL;
}
return bgEvent->bgUnion.script;
}
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index f7e09aacf..eaad98cb0 100644
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -1,30 +1,40 @@
#include "global.h"
#include "field_map_obj.h"
+#include "field_map_obj_helpers.h"
+#include "fieldmap.h"
#include "asm.h"
#include "berry.h"
#include "event_data.h"
#include "field_player_avatar.h"
+#include "field_effect.h"
+#include "field_ground_effect.h"
#include "palette.h"
#include "rom4.h"
+#include "rng.h"
#include "sprite.h"
+#include "field_camera.h"
+#include "metatile_behavior.h"
+#include "map_constants.h"
+#include "trainer_see.h"
+#include "field_effect_helpers.h"
extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36];
+
extern void strange_npc_table_clear(void);
extern void ClearPlayerAvatarInfo(void);
extern void npc_load_two_palettes__no_record(u16, u8);
extern void npc_load_two_palettes__and_record(u16, u8);
extern void sub_8060388(s16, s16, s16 *, s16 *);
-extern void sub_80634D0();
+void sub_80634D0(struct MapObject *, struct Sprite *);
extern void pal_patch_for_npc(u16, u16);
-extern void sub_80603CC();
extern void CameraObjectReset1(void);
void sub_805AAB0(void);
u8 GetFieldObjectIdByLocalId(u8);
u8 GetFieldObjectIdByLocalIdAndMapInternal(u8, u8, u8);
u8 GetAvailableFieldObjectSlot(u16, u8, u8, u8 *);
-void FieldObjectHandleDynamicGraphicsId();
+void FieldObjectHandleDynamicGraphicsId(struct MapObject *);
void RemoveFieldObjectInternal(struct MapObject *);
u16 GetFieldObjectFlagIdByFieldObjectId(u8);
void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables);
@@ -609,7 +619,7 @@ u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c
}
extern void sub_8064970(struct Sprite *);
-extern void sub_8060470();
+extern void sub_8060470(s16 *, s16 *, s16, s16);
extern void InitObjectPriorityByZCoord();
u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f)
@@ -1503,47 +1513,5226 @@ u16 npc_paltag_by_palslot(u8 a)
return 0x11FF;
}
-u32 sub_805C8A8(void);
+fieldmap_object_null_cb(sub_805C884, sub_805C8A8);
+fieldmap_object_cb(sub_805C8AC, sub_805C8D0, gUnknown_08375224);
-void sub_805C884(struct Sprite *sprite)
+u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite)
{
- meta_step(&gMapObjects[sprite->data0], sprite, sub_805C8A8);
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
}
-u32 sub_805C8A8(void)
+extern void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8);
+
+u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite)
{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+extern u8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *);
+extern const s16 gUnknown_0837520C[];
+extern const s16 gUnknown_0837521C[];
+extern void sub_8064820(struct Sprite *, s16);
+
+u8 sub_805C930(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite) == 0)
+ {
+ return 0;
+ }
+ sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
+ sprite->data1 = 3;
+ return 1;
+}
+
+extern u8 sub_8064824(struct Sprite *);
+
+u8 sub_805C96C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) != 0)
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
return 0;
}
-u32 sub_805C8D0(struct MapObject *, struct Sprite *);
+extern u8 sub_805FF20(struct MapObject *, u8);
-void sub_805C8AC(struct Sprite *sprite)
+u8 sub_805C98C(struct MapObject *mapObject, struct Sprite *sprite)
{
- meta_step(&gMapObjects[sprite->data0], sprite, sub_805C8D0);
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375240, 4);
+ direction = directions[Random() & 3];
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 5;
+ if (sub_805FF20(mapObject, direction) != 0)
+ {
+ sprite->data1 = 1;
+ }
+ return 1;
}
-extern u8 (*const gUnknown_08375224[])();
+u8 sub_805C9D8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18));
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 6;
+ return 1;
+}
-u32 sub_805C8D0(struct MapObject *mapObject, struct Sprite *sprite)
+u8 sub_805CA08(struct MapObject *mapObject, struct Sprite *sprite)
{
- return gUnknown_08375224[sprite->data1](mapObject, sprite);
+ if (FieldObjectExecRegularAnim(mapObject, sprite) != 0)
+ {
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 1;
+ }
+ return 0;
}
-void npc_reset();
+u8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject)
+{
+ s16 x;
+ s16 y;
+ s16 objx;
+ s16 objy;
+ s16 minx;
+ s16 maxx;
+ s16 miny;
+ s16 maxy;
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH) == 0)
+ {
+ return 0;
+ }
+ if (mapObject->trainerType != 1 && mapObject->trainerType != 3)
+ {
+ return 0;
+ }
+ PlayerGetDestCoords(&x, &y);
+ objx = mapObject->coords2.x;
+ objy = mapObject->coords2.y;
+ minx = objx - mapObject->trainerRange_berryTreeId;
+ miny = objy - mapObject->trainerRange_berryTreeId;
+ maxx = objx + mapObject->trainerRange_berryTreeId;
+ maxy = objy + mapObject->trainerRange_berryTreeId;
+ if (minx > x || maxx < x || miny > y || maxy < y)
+ {
+ return 0;
+ }
+ return 1;
+}
-u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite)
+u8 sub_805CAAC(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ u8 dirn;
+ if (a2 > a3)
+ {
+ dirn = DIR_EAST;
+ if (a0 < 0)
+ {
+ dirn = DIR_WEST;
+ }
+ }
+ else
+ {
+ dirn = DIR_SOUTH;
+ if (a1 < 0)
+ {
+ dirn = DIR_NORTH;
+ }
+ }
+ return dirn;
+}
+
+u8 sub_805CADC(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ u8 dirn;
+ dirn = DIR_SOUTH;
+ if (a1 < 0)
+ {
+ dirn = DIR_NORTH;
+ }
+ return dirn;
+}
+
+u8 sub_805CAEC(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ u8 dirn;
+ dirn = DIR_EAST;
+ if (a0 < 0)
+ {
+ dirn = DIR_WEST;
+ }
+ return dirn;
+}
+
+u8 sub_805CB00(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ u8 dirn;
+ dirn = sub_805CAAC(a0, a1, a2, a3);
+ if (dirn == DIR_SOUTH)
+ {
+ dirn = sub_805CAEC(a0, a1, a2, a3);
+ if (dirn == DIR_EAST)
+ {
+ dirn = DIR_NORTH;
+ }
+ }
+ else if (dirn == DIR_EAST)
+ {
+ dirn = sub_805CADC(a0, a1, a2, a3);
+ if (dirn == DIR_SOUTH)
+ {
+ dirn = DIR_NORTH;
+ }
+ }
+ return dirn;
+}
+
+u8 sub_805CB5C(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ u8 dirn;
+ dirn = sub_805CAAC(a0, a1, a2, a3);
+ if (dirn == DIR_SOUTH)
+ {
+ dirn = sub_805CAEC(a0, a1, a2, a3);
+ if (dirn == DIR_WEST)
+ {
+ dirn = DIR_NORTH;
+ }
+ }
+ else if (dirn == DIR_WEST)
+ {
+ dirn = sub_805CADC(a0, a1, a2, a3);
+ if (dirn == DIR_SOUTH)
+ {
+ dirn = DIR_NORTH;
+ }
+ }
+ return dirn;
+}
+
+u8 sub_805CBB8(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ u8 dirn;
+ dirn = sub_805CAAC(a0, a1, a2, a3);
+ if (dirn == DIR_NORTH)
+ {
+ dirn = sub_805CAEC(a0, a1, a2, a3);
+ if (dirn == DIR_EAST)
+ {
+ dirn = DIR_SOUTH;
+ }
+ }
+ else if (dirn == DIR_EAST)
+ {
+ dirn = sub_805CADC(a0, a1, a2, a3);
+ if (dirn == DIR_NORTH)
+ {
+ dirn = DIR_SOUTH;
+ }
+ }
+ return dirn;
+}
+
+u8 sub_805CC14(s16 a0, s16 a1, s16 a2, s16 a3) {
+ u8 dirn;
+ dirn = sub_805CAAC(a0, a1, a2, a3);
+ if (dirn == DIR_NORTH)
+ {
+ dirn = sub_805CAEC(a0, a1, a2, a3);
+ if (dirn == DIR_WEST)
+ {
+ dirn = DIR_SOUTH;
+ }
+ }
+ else if (dirn == DIR_WEST)
+ {
+ dirn = sub_805CADC(a0, a1, a2, a3);
+ if (dirn == DIR_NORTH)
+ {
+ dirn = DIR_SOUTH;
+ }
+ }
+ return dirn;
+}
+
+u8 sub_805CC70(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ u8 dirn;
+ dirn = sub_805CAAC(a0, a1, a2, a3);
+ if (dirn == DIR_EAST)
+ {
+ dirn = sub_805CADC(a0, a1, a2, a3);
+ }
+ return dirn;
+}
+
+u8 sub_805CCAC(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ u8 dirn;
+ dirn = sub_805CAAC(a0, a1, a2, a3);
+ if (dirn == DIR_WEST)
+ {
+ dirn = sub_805CADC(a0, a1, a2, a3);
+ }
+ return dirn;
+}
+
+u8 sub_805CCE8(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ u8 dirn;
+ dirn = sub_805CAAC(a0, a1, a2, a3);
+ if (dirn == DIR_SOUTH)
+ {
+ dirn = sub_805CAEC(a0, a1, a2, a3);
+ }
+ return dirn;
+}
+
+u8 sub_805CD24(s16 a0, s16 a1, s16 a2, s16 a3)
{
- npc_reset(mapObject);
+ u8 dirn;
+ dirn = sub_805CAAC(a0, a1, a2, a3);
+ if (dirn == DIR_NORTH)
+ {
+ dirn = sub_805CAEC(a0, a1, a2, a3);
+ }
+ return dirn;
+}
+
+u8 sub_805CD60(struct MapObject *mapObject, u8 a1)
+{
+ s16 x;
+ s16 y;
+ s16 x2;
+ s16 y2;
+ if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ return 0;
+ }
+ PlayerGetDestCoords(&x, &y);
+ x -= mapObject->coords2.x;
+ y -= mapObject->coords2.y;
+ x2 = x;
+ y2 = y;
+ if (x2 < 0)
+ {
+ x2 = -x2;
+ }
+ if (y2 < 0)
+ {
+ y2 = -y2;
+ }
+ return gUnknown_08375244[a1](x, y, x2, y2);
+}
+
+fieldmap_object_cb(sub_805CDE8, sub_805CE0c, gUnknown_08375270);
+
+u8 sub_805CE2C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
sprite->data1 = 1;
return 1;
}
-extern void FieldObjectSetRegularAnim();
+u8 sub_805CE40(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
-u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite)
+u8 sub_805CE6C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite) != 0)
+ {
+ sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805CEB0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805CEE0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375240, 4);
+ direction = sub_805CD60(mapObject, 0);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 3];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805CF28, sub_805CF4C, gUnknown_08375284);
+
+u8 sub_805CF6C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805CF80(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805CFAC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite) == 0)
+ {
+ return 0;
+ }
+ sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
+ sprite->data1 = 3;
+ return 1;
+}
+
+u8 sub_805CFE8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) != 0)
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805D008(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUnknown_083752A0, 2);
+ direction = directions[Random() & 1];
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 5;
+ if (sub_805FF20(mapObject, direction) != 0)
+ {
+ sprite->data1 = 1;
+ }
+ return 1;
+}
+
+u8 sub_805D054(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18));
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 6;
+ return 1;
+}
+
+u8 sub_805D084(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite) != 0)
+ {
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 1;
+ }
+ return 0;
+}
+
+fieldmap_object_cb(sub_805D0AC, sub_805D0D0, gUnknown_083752A4);
+
+u8 sub_805D0F0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805D104(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805D130(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite) == 0)
+ {
+ return 0;
+ }
+ sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
+ sprite->data1 = 3;
+ return 1;
+}
+
+u8 sub_805D16C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) != 0)
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805D18C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUnknown_083752C0, 2);
+ direction = directions[Random() & 1];
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 5;
+ if (sub_805FF20(mapObject, direction) != 0)
+ {
+ sprite->data1 = 1;
+ }
+ return 1;
+}
+
+u8 sub_805D1D8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18));
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 6;
+ return 1;
+}
+
+u8 sub_805D208(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite) != 0)
+ {
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 1;
+ }
+ return 0;
+}
+
+fieldmap_object_cb(sub_805D230, sub_805D254, gUnknown_083752C4);
+
+u8 sub_805D274(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805D2A0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite) != 0)
+ {
+ sprite->data1 = 2;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805D2C0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_1 = 0;
+ return 0;
+}
+
+u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite);
+extern u8 (*const gUnknown_083752D0[])(struct MapObject *mapObject, struct Sprite *sprite);
+
+void FieldObjectCB_BerryTree(struct Sprite *sprite)
+{
+ struct MapObject *mapObject;
+ mapObject = &gMapObjects[sprite->data0];
+ if (!(sprite->data7 & 1))
+ {
+ get_berry_tree_graphics(mapObject, sprite);
+ sprite->data7 |= 1;
+ }
+ meta_step(mapObject, sprite, sub_805D314);
+}
+
+u8 sub_805D314(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return gUnknown_083752D0[sprite->data1](mapObject, sprite);
+}
+
+extern u32 gUnknown_0202FF84[];
+
+u8 do_berry_tree_growth_sparkle_1(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 berryTreeStage;
+ npc_reset(mapObject, sprite);
+ mapObject->mapobj_bit_13 = 1;
+ sprite->invisible = 1;
+ berryTreeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId);
+ if (!berryTreeStage)
+ {
+ if (!(sprite->data7 & 4) && sprite->animNum == 4)
+ {
+ 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(0x17);
+ sprite->animNum = 0;
+ }
+ return 0;
+ }
+ mapObject->mapobj_bit_13 = 0;
+ sprite->invisible = 0;
+ berryTreeStage--;
+ if (sprite->animNum != berryTreeStage)
+ {
+ sprite->data1 = 2;
+ return 1;
+ }
+ get_berry_tree_graphics(mapObject, sprite);
+ FieldObjectSetRegularAnim(mapObject, sprite, 0x39);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805D3EC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sprite->data1 = 0;
+ return 1;
+ }
+ return 0;
+}
+
+u8 do_berry_tree_growth_sparkle_2(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 3;
+ sprite->data2 = 0;
+ sprite->data7 |= 2;
+ 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(0x17);
+ return 1;
+}
+
+u8 sub_805D458(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->data2++;
+ mapObject->mapobj_bit_13 = ((sprite->data2 & 0x2) >> 1);
+ sprite->animPaused = 1;
+ if (sprite->data2 > 64)
+ {
+ get_berry_tree_graphics(mapObject, sprite);
+ sprite->data1 = 4;
+ sprite->data2 = 0;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805D4A8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->data2++;
+ mapObject->mapobj_bit_13 = ((sprite->data2 & 0x2) >> 1);
+ sprite->animPaused = 1;
+ if (sprite->data2 > 64)
+ {
+ sprite->data1 = 0;
+ sprite->data7 &= (-3);
+ return 1;
+ }
+ return 0;
+}
+
+fieldmap_object_cb(sub_805D4F4, sub_805D518, gUnknown_083752E4);
+
+u8 sub_805D538(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805D54C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805D578(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805D5BC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805D5EC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUnknown_083752A0, 2);
+ direction = sub_805CD60(mapObject, 1);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805D634, sub_805D658, gUnknown_083752F8);
+
+u8 sub_805D678(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805D68C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805D6B8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837520C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805D6FC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805D72C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUnknown_083752C0, 2);
+ direction = sub_805CD60(mapObject, 2);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805D774, sub_805D798, gUnknown_0837530C);
+
+u8 sub_805D7B8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805D7CC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805D7F8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805D83C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805D86C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUnknown_08375320, 2);
+ direction = sub_805CD60(mapObject, 3);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805D8B4, sub_805D8D8, gUnknown_08375324);
+
+u8 sub_805D8F8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805D90C(struct MapObject *mapObject, struct Sprite *sprite)
{
FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
sprite->data1 = 2;
return 1;
}
+u8 sub_805D938(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805D97C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805D9AC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUnknown_08375338, 2);
+ direction = sub_805CD60(mapObject, 4);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805D9F4, sub_805DA18, gUnknown_0837533C);
+
+u8 sub_805DA38(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805DA4C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805DA78(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805DABC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805DAEC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUnknown_08375350, 2);
+ direction = sub_805CD60(mapObject, 5);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805DB34, sub_805DB58, gUnknown_08375354);
+
+u8 sub_805DB78(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805DB8C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805DBB8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805DBFC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805DC2C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[2];
+ memcpy(directions, gUnknown_08375368, 2);
+ direction = sub_805CD60(mapObject, 6);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 1];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805DC74, sub_805DC98, gUnknown_0837536C);
+
+u8 sub_805DCB8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805DCCC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805DCF8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805DD3C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805DD6C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375380, 4);
+ direction = sub_805CD60(mapObject, 7);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 3];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805DDB4, sub_805DDD8, gUnknown_08375384);
+
+u8 sub_805DDF8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805DE0C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805DE38(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805DE7C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805DEAC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375398, 4);
+ direction = sub_805CD60(mapObject, 8);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 3];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805DEF4, sub_805DF18, gUnknown_0837539C);
+
+u8 sub_805DF38(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805DF4C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805DF78(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805DFBC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805DFEC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gUnknown_083753B0, 4);
+ direction = sub_805CD60(mapObject, 9);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 3];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805E034, sub_805E058, gUnknown_083753B4);
+
+u8 sub_805E078(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805E08C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805E0B8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, gUnknown_0837521C[Random() & 3]);
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805E0FC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 4;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805E12C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[4];
+ memcpy(directions, gUnknown_083753C8, 4);
+ direction = sub_805CD60(mapObject, 10);
+ if (direction == 0)
+ {
+ direction = directions[Random() & 3];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805E174, sub_805E198, gUnknown_083753CC);
+
+u8 sub_805E1B8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805E1E4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, 0x30);
+ sprite->data1 = 2;
+ }
+ return 0;
+}
+
+u8 sub_805E208(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805E234(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[5];
+ memcpy(directions, gUnknown_083753DC, 5);
+ direction = sub_805CD60(mapObject, 0);
+ if (direction == 0)
+ {
+ direction = directions[mapObject->mapobj_unk_18];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 0;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805E278, sub_803E29C, gUnknown_083753E4);
+
+u8 sub_805E2BC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805E2E8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sub_8064820(sprite, 0x30);
+ sprite->data1 = 2;
+ }
+ return 0;
+}
+
+u8 sub_805E30C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064824(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject))
+ {
+ sprite->data1 = 3;
+ }
+ return 0;
+}
+
+u8 sub_805E338(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ u8 directions[5];
+ memcpy(directions, gUnknown_083753F4, 5);
+ direction = sub_805CD60(mapObject, 0);
+ if (direction == 0)
+ {
+ direction = directions[mapObject->mapobj_unk_18];
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 0;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805E37C, sub_805E3A0, gUnknown_083753FC);
+
+u8 sub_805E3C0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805E3D4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 direction;
+ direction = gUnknown_0836DC09[mapObject->animPattern];
+ if (mapObject->mapobj_unk_21 != 0)
+ {
+ direction = GetOppositeDirection(direction);
+ }
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805E40C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 v0;
+ u8 goSpeed0AnimId;
+ if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 0;
+ FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18));
+ }
+ v0 = sub_805FF20(mapObject, mapObject->placeholder18);
+ goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18);
+ if (v0 == 1)
+ {
+ mapObject->mapobj_unk_21 ++;
+ FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18));
+ goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18);
+ v0 = sub_805FF20(mapObject, mapObject->placeholder18);
+ }
+ if (v0 != 0)
+ {
+ goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18);
+ }
+ FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId);
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 3;
+ return 1;
+}
+
+u8 sub_805E4C4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 1;
+ }
+ return 0;
+}
+
+u8 sub_805E4EC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *directionSequence)
+{
+ u8 v0;
+ u8 goSpeed0AnimId;
+ if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 0;
+ }
+ FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]);
+ goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18);
+ v0 = sub_805FF20(mapObject, mapObject->placeholder18);
+ if (v0 == 1)
+ {
+ mapObject->mapobj_unk_21 ++;
+ FieldObjectSetDirection(mapObject, directionSequence[mapObject->mapobj_unk_21]);
+ goSpeed0AnimId = GetGoSpeed0AnimId(mapObject->placeholder18);
+ v0 = sub_805FF20(mapObject, mapObject->placeholder18);
+ }
+ if (v0 != 0)
+ {
+ goSpeed0AnimId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18);
+ }
+ FieldObjectSetRegularAnim(mapObject, sprite, goSpeed0AnimId);
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805E5B4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 1;
+ }
+ return 0;
+}
+
+fieldmap_object_cb(sub_805E5DC, sub_805E600, gUnknown_0837540C);
+
+u8 sub_805E620(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375418, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805E668, sub_805E68C, gUnknown_0837541C);
+
+u8 sub_805E6AC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375428, 4);
+ if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 2;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805E6F4, sub_805E718, gUnknown_0837542C);
+
+u8 sub_805E738(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375438, 4);
+ if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 2;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805E780, sub_805E7A4, gUnknown_0837543C);
+
+u8 sub_805E7C4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375448, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+
+
+fieldmap_object_cb(sub_805E80C, sub_805E830, gUnknown_0837544C);
+
+u8 sub_805E850(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375458, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805E898, sub_805E8BC, gUnknown_0837545C);
+
+u8 sub_805E8DC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375468, 4);
+ if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 2;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805E924, sub_805E948, gUnknown_0837546C);
+
+u8 sub_805E968(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375240, 4);
+ if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 2;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805E9B0, sub_805E9D4, gUnknown_08375478);
+
+u8 sub_805E9F4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375484, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805EA3C, sub_805EA60, gUnknown_08375488);
+
+u8 sub_805EA80(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375494, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805EAC8, sub_805EAEC, gUnknown_08375498);
+
+u8 sub_805EB0C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_083754A4, 4);
+ if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 2;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805EB54, sub_805EB78, gUnknown_083754A8);
+
+u8 sub_805EB98(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_083754B4, 4);
+ if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 2;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805EBE0, sub_805EC04, gUnknown_083754B8);
+
+u8 sub_805EC24(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_083754C4, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805EC6C, sub_805EC90, gUnknown_083754C8);
+
+u8 sub_805ECB0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_083754D4, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805ECF8, sub_805ED1C, gUnknown_083754D8);
+
+u8 sub_805ED3C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_083754E4, 4);
+ if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 2;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805ED84, sub_805EDA8, gUnknown_083754E8);
+
+u8 sub_805EDC8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_083754F4, 4);
+ if (mapObject->mapobj_unk_21 == 1 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 2;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805EE10, sub_805EE34, gUnknown_083754F8);
+
+u8 sub_805EE54(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375504, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805EE9C, sub_805EEC0, gUnknown_08375508);
+
+u8 sub_805EEE0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375514, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805EF28, sub_805EF4C, gUnknown_08375518);
+
+u8 sub_805EF6C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375524, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805EFB4, sub_805EFD8, gUnknown_08375528);
+
+u8 sub_805EFF8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375534, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805F040, sub_805F064, gUnknown_08375538);
+
+u8 sub_805F084(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375544, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805F0CC, sub_805F0F0, gUnknown_08375548);
+
+u8 sub_805F110(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375554, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805F158, sub_805F17C, gUnknown_08375558);
+
+u8 sub_805F19C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375564, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.y == mapObject->coords2.y)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805F1E4, sub_805F208, gUnknown_08375568);
+
+u8 sub_805F228(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375574, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+}
+
+fieldmap_object_cb(sub_805F270, sub_805F294, gUnknown_08375578);
+
+u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 directions[4];
+ memcpy(directions, gUnknown_08375584, 4);
+ if (mapObject->mapobj_unk_21 == 2 && mapObject->coords1.x == mapObject->coords2.x)
+ {
+ mapObject->mapobj_unk_21 = 3;
+ }
+ return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
+};
+
+fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588);
+
+u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ if (mapObject->mapobj_unk_21 == 0)
+ {
+ mapObject->mapobj_unk_21 = player_get_direction_lower_nybble();
+ }
+ sprite->data1 = 1;
+ return 1;
+}
+
+extern u8 (*const gUnknown_08375594[])(struct MapObject *, struct Sprite *, u8, bool8 (*const)(u8));
+
+u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2)
+ {
+ return 0;
+ }
+ return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL);
+}
+
+u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 1;
+ }
+ return 0;
+}
+
+#ifdef NONMATCHING
+
+u8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8))
+{
+ return 0;
+}
+
+u8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8))
+{
+ int direction;
+ direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8))
+{
+ s16 x;
+ s16 y;
+ int direction;
+ direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2);
+ FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction));
+ if (!npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y))))
+ {
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
+ }
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 2;
+ return 1;
+}
+#endif
+
+asm(".section .text_fmocb2_c\n");
+
+fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0);
+
+u8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2)
+ {
+ return 0;
+ }
+ return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass);
+}
+
+u8 sub_805F9F8(struct MapObject *, struct Sprite *);
+
+void FieldObjectCB_TreeDisguise(struct Sprite *sprite)
+{
+ struct MapObject *mapObject;
+ mapObject = &gMapObjects[sprite->data0];
+ if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0))
+ {
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
+ mapObject->mapobj_unk_1A = FieldEffectStart(0x1c);
+ mapObject->mapobj_unk_21 = 1;
+ sprite->data7 ++;
+ }
+ meta_step(&gMapObjects[sprite->data0], sprite, sub_805F9F8);
+}
+
+u8 sub_805F9F8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ return 0;
+}
+
+void FieldObjectCB_MountainDisguise(struct Sprite *sprite)
+{
+ struct MapObject *mapObject;
+ mapObject = &gMapObjects[sprite->data0];
+ if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && sprite->data7 == 0))
+ {
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
+ mapObject->mapobj_unk_1A = FieldEffectStart(0x1d);
+ mapObject->mapobj_unk_21 = 1;
+ sprite->data7 ++;
+ }
+ meta_step(&gMapObjects[sprite->data0], sprite, sub_805F9F8);
+}
+
+u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite);
+extern u8 (*const gUnknown_083755CC[])(struct MapObject *, struct Sprite *);
+
+void FieldObjectCB_Hidden1(struct Sprite *sprite)
+{
+ if (sprite->data7 == 0)
+ {
+ gMapObjects[sprite->data0].mapobj_bit_26 = 1;
+ sprite->subspriteMode = 2;
+ sprite->oam.priority = 3;
+ sprite->data7 ++;
+ }
+ meta_step(&gMapObjects[sprite->data0], sprite, sub_805FAD8);
+}
+
+u8 sub_805FAD8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return gUnknown_083755CC[sprite->data1](mapObject, sprite);
+}
+
+u8 sub_805FAF8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ return 0;
+}
+
+u8 sub_805FB04(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sprite->data1 = 0;
+ }
+ return 0;
+}
+
+fieldmap_object_cb(sub_805FB20, sub_805FB44, gUnknown_083755D0);
+
+u8 sub_805FB64(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805FB90, sub_805FBB4, gUnknown_083755D8);
+
+u8 sub_805FBD4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805FC00, sub_805FC24, gUnknown_083755E0);
+
+u8 sub_805FC44(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 1;
+ return 1;
+}
+
+fieldmap_object_cb(sub_805FC70, sub_805FC94, gUnknown_083755E8);
+
+u8 sub_805FCB4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ mapObject->mapobj_bit_13 = 1;
+ sprite->data1 = 1;
+ return 1;
+}
+
+u8 sub_805FCE8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ sprite->data1 = 2;
+ return 1;
+ }
+ return 0;
+}
+
+u8 sub_805FD08(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_1 = 0;
+ return 0;
+}
+
+void sub_805FC70(struct Sprite *sprite);
+
+void npc_reset(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_1 = 0;
+ mapObject->mapobj_bit_6 = 0;
+ mapObject->mapobj_bit_7 = 0;
+ mapObject->mapobj_unk_1C = 0xff;
+ sprite->data1 = 0;
+}
+
+extern const u8 gUnknown_083755F4[9];
+extern const u8 gUnknown_083755FD[9];
+extern const u8 gUnknown_08375606[9];
+extern const u8 gUnknown_0837560F[9];
+extern const u8 gUnknown_08375618[9];
+extern const u8 gUnknown_08375621[9];
+extern const u8 gUnknown_0837562A[9];
+extern const u8 gUnknown_08375633[9];
+extern const u8 gUnknown_0837563C[9];
+extern const u8 gUnknown_08375645[9];
+extern const u8 gUnknown_0837564E[9];
+extern const u8 gUnknown_08375657[9];
+extern const u8 gUnknown_08375660[9];
+extern const u8 gUnknown_08375669[9];
+extern const u8 gUnknown_08375672[9];
+
+u8 FieldObjectDirectionToImageAnimId(u8 direction)
+{
+ return gUnknown_083755F4[direction];
+}
+
+u8 get_go_image_anim_num(u8 direction)
+{
+ return gUnknown_083755FD[direction];
+}
+
+u8 get_go_fast_image_anim_num(u8 direction)
+{
+ return gUnknown_08375606[direction];
+}
+
+u8 get_go_faster_image_anim_num(u8 direction)
+{
+ return gUnknown_0837560F[direction];
+}
+
+u8 sub_805FD78(u8 direction)
+{
+ return gUnknown_08375618[direction];
+}
+
+u8 sub_805FD88(u8 direction)
+{
+ return gUnknown_08375621[direction];
+}
+
+u8 sub_805FD98(u8 direction)
+{
+ return gUnknown_0837562A[direction];
+}
+
+u8 unref_sub_805FDA8(u8 direction)
+{
+ return gUnknown_08375633[direction];
+}
+
+u8 sub_805FDB8(u8 direction)
+{
+ return gUnknown_0837563C[direction];
+}
+
+u8 sub_805FDC8(u8 direction)
+{
+ return gUnknown_08375645[direction];
+}
+
+u8 sub_805FDD8(u8 direction)
+{
+ return gUnknown_0837564E[direction];
+}
+
+u8 sub_805FDE8(u8 direction)
+{
+ return gUnknown_08375657[direction];
+}
+
+u8 sub_805FDF8(u8 direction)
+{
+ return gUnknown_08375660[direction];
+}
+
+u8 sub_805FE08(u8 direction)
+{
+ return gUnknown_08375669[direction];
+}
+
+u8 get_run_image_anim_num(u8 direction)
+{
+ return gUnknown_08375672[direction];
+}
+
+void sub_805FE28(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum)
+{
+ if (!mapObject->mapobj_bit_12)
+ {
+ sprite->animNum = animNum;
+ if (sprite->animCmdIndex == 1)
+ {
+ sprite->animCmdIndex = 2;
+ } else if (sprite->animCmdIndex == 3)
+ {
+ sprite->animCmdIndex = 0;
+ }
+ SeekSpriteAnim(sprite, sprite->animCmdIndex);
+ }
+}
+
+void sub_805FE64(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum)
+{
+ u8 animCmdIndex;
+ if (!mapObject->mapobj_bit_12)
+ {
+ sprite->animNum = animNum;
+ animCmdIndex = 3;
+ if (sprite->animCmdIndex < 2)
+ {
+ animCmdIndex = 1;
+ }
+ SeekSpriteAnim(sprite, animCmdIndex);
+ }
+}
+
+u8 sub_805FE90(s16 a0, s16 a1, s16 a2, s16 a3)
+{
+ if (a0 > a2)
+ {
+ return DIR_WEST;
+ } else if (a0 < a2)
+ {
+ return DIR_EAST;
+ } else if (a1 > a3)
+ {
+ return DIR_NORTH;
+ } else
+ {
+ return DIR_SOUTH;
+ }
+}
+
+void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern)
+{
+ mapObject->animPattern = animPattern;
+ mapObject->mapobj_unk_21 = 0;
+ mapObject->animId = 0;
+ gSprites[mapObject->spriteId].callback = gUnknown_0836DA88[animPattern];
+ gSprites[mapObject->spriteId].data1 = 0;
+}
+
+u8 npc_running_behaviour_by_direction(u8 direction)
+{
+ return gUnknown_0837567B[direction];
+}
+
+u8 sub_805FF20(struct MapObject *mapObject, u8 direction)
+{
+ s16 x;
+ s16 y;
+ x = mapObject->coords2.x;
+ y = mapObject->coords2.y;
+ MoveCoords(direction, &x, &y);
+ return npc_block_way(mapObject, x, y, direction);
+}
+
+bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y);
+bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y);
+bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction);
+
+u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
+{
+ if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y))
+ {
+ return 1;
+ }
+ if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction))
+ {
+ return 2;
+ } else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))
+ {
+ return 2;
+ }
+ if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y))
+ {
+ return 3;
+ }
+ if (CheckForCollisionBetweenFieldObjects(mapObject, x, y))
+ {
+ return 4;
+ }
+ return 0;
+}
+
+u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
+{
+ u8 flags;
+ flags = 0;
+ if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y))
+ {
+ flags |= 1;
+ }
+ if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)))
+ {
+ flags |= 2;
+ }
+ if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y))
+ {
+ flags |= 4;
+ }
+ if (CheckForCollisionBetweenFieldObjects(mapObject, x, y))
+ {
+ flags |= 8;
+ }
+ return flags;
+}
+
+bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y)
+{
+ s16 minv;
+ s16 maxv;
+ if (mapObject->mapobj_unk_19 != 0)
+ {
+ minv = mapObject->coords1.x - (mapObject->mapobj_unk_19);
+ maxv = mapObject->coords1.x + (mapObject->mapobj_unk_19);
+ if (minv > x || maxv < x)
+ {
+ return 1;
+ }
+ }
+ if (mapObject->mapobj_unk_19b != 0)
+ {
+ minv = mapObject->coords1.y - (mapObject->mapobj_unk_19b);
+ maxv = mapObject->coords1.y + (mapObject->mapobj_unk_19b);
+ if (minv > y || maxv < y)
+ {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
+{
+ if (gUnknown_08375684[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_08375694[direction - 1](MapGridGetMetatileBehaviorAt(x, y)))
+ {
+ return 1;
+ }
+ return 0;
+}
+
+bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y)
+{
+ struct MapObject *mapObject2;
+ u8 i;
+ for (i=0; i<16; i++)
+ {
+ mapObject2 = &gMapObjects[i];
+ if (mapObject2->active && mapObject2 != mapObject)
+ {
+ if ((mapObject2->coords2.x != x || mapObject2->coords2.y != y) && (mapObject2->coords3.x != x || mapObject2->coords3.y != y))
+ {
+ continue;
+ }
+ if (AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, mapObject2->mapobj_unk_0B_0))
+ {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+bool8 sub_8060234(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 mapObjectId;
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ {
+ if (gSprites[gMapObjects[mapObjectId].spriteId].data7 & 2)
+ {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void sub_8060288(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 mapObjectId;
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ {
+ gSprites[gMapObjects[mapObjectId].spriteId].data7 |= 4;
+ }
+}
+
+void MoveCoords(u8 direction, s16 *x, s16 *y)
+{
+ *x += gDirectionToVector[direction].x;
+ *y += gDirectionToVector[direction].y;
+}
+
+void unref_sub_80602F8(u8 direction, s16 *x, s16 *y)
+{
+ *x += gDirectionToVector[direction].x << 4;
+ *y += gDirectionToVector[direction].y << 4;
+}
+
+void sub_8060320(u8 direction, s16 *x, s16 *y, s16 deltaX, s16 deltaY)
+{
+ if (gDirectionToVector[direction].x > 0)
+ {
+ *x += deltaX;
+ }
+ if (gDirectionToVector[direction].x < 0)
+ {
+ *x -= deltaX;
+ }
+ if (gDirectionToVector[direction].y > 0)
+ {
+ *y += deltaY;
+ }
+ if (gDirectionToVector[direction].y < 0)
+ {
+ *y -= deltaY;
+ }
+}
+
+void sub_8060388(s16 x1, s16 y1, s16 *x2, s16 *y2)
+{
+ *x2 = (x1 - gSaveBlock1.pos.x) << 4;
+ *y2 = (y1 - gSaveBlock1.pos.y) << 4;
+ *x2 -= gUnknown_0300489C;
+ *y2 -= gUnknown_03004898;
+}
+
+void sub_80603CC(s16 x1, s16 y1, s16 *x2, s16 *y2)
+{
+ s16 x3;
+ s16 y3;
+ x3 = -gUnknown_0300489C - gUnknown_03004880.unk10;
+ y3 = -gUnknown_03004898 - gUnknown_03004880.unk14;
+ if (gUnknown_03004880.unk10 > 0)
+ {
+ x3 += 0x10;
+ }
+ if (gUnknown_03004880.unk10 < 0)
+ {
+ x3 -= 0x10;
+ }
+ if (gUnknown_03004880.unk14 > 0)
+ {
+ y3 += 0x10;
+ }
+ if (gUnknown_03004880.unk14 < 0)
+ {
+ y3 -= 0x10;
+ }
+ *x2 = ((x1 - gSaveBlock1.pos.x) << 4) + x3;
+ *y2 = ((y1 - gSaveBlock1.pos.y) << 4) + y3;
+}
+
+void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy)
+{
+ sub_80603CC(*x, *y, x, y);
+ *x += dx;
+ *y += dy;
+}
+
+void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y)
+{
+ *x = 0;
+ *y = 0;
+ if (gUnknown_03004880.unk10 > 0)
+ {
+ (*x)++;
+ }
+ if (gUnknown_03004880.unk10 < 0)
+ {
+ (*x)--;
+ }
+ if (gUnknown_03004880.unk14 > 0)
+ {
+ (*y)++;
+ }
+ if (gUnknown_03004880.unk14 < 0)
+ {
+ (*y)--;
+ }
+}
+
+void FieldObjectMoveDestCoords(struct MapObject *mapObject, u8 direction, s16 *x, s16 *y)
+{
+ *x = mapObject->coords2.x;
+ *y = mapObject->coords2.y;
+ MoveCoords(direction, x, y);
+}
+
+bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xff)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId)
+{
+ if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject))
+ {
+ return TRUE;
+ }
+ UnfreezeMapObject(mapObject);
+ mapObject->mapobj_unk_1C = specialAnimId;
+ mapObject->mapobj_bit_6 = 1;
+ mapObject->mapobj_bit_7 = 0;
+ gSprites[mapObject->spriteId].data2 = 0;
+ return FALSE;
+}
+
+void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId)
+{
+ FieldObjectClearAnimIfSpecialAnimActive(mapObject);
+ FieldObjectSetSpecialAnim(mapObject, specialAnimId);
+}
+
+void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6)
+ {
+ FieldObjectClearAnim(mapObject);
+ }
+}
+
+void FieldObjectClearAnim(struct MapObject *mapObject)
+{
+ mapObject->mapobj_unk_1C = 0xFF;
+ mapObject->mapobj_bit_6 = 0;
+ mapObject->mapobj_bit_7 = 0;
+ gSprites[mapObject->spriteId].data1 = 0;
+ gSprites[mapObject->spriteId].data2 = 0;
+}
+
+bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6)
+ return mapObject->mapobj_bit_7;
+ return 0x10;
+}
+
+bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject)
+{
+ u8 specialAnimStatus;
+ specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject);
+ if (specialAnimStatus != 0 && specialAnimStatus != 0x10)
+ {
+ FieldObjectClearAnimIfSpecialAnimActive(mapObject);
+ }
+ return specialAnimStatus;
+}
+
+u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6)
+ {
+ return mapObject->mapobj_unk_1C;
+ }
+ return 0xFF;
+}
+
+extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite);
+extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite);
+extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite);
+void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite);
+void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite);
+void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite);
+void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite);
+
+void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *))
+{
+ DoGroundEffects_OnSpawn(mapObject, sprite);
+ sub_80634A0(mapObject, sprite);
+ if (FieldObjectIsSpecialAnimActive(mapObject))
+ {
+ FieldObjectExecSpecialAnim(mapObject, sprite);
+ } else
+ {
+ if (!mapObject->mapobj_bit_8)
+ {
+ while (callback(mapObject, sprite));
+ }
+ }
+ DoGroundEffects_OnBeginStep(mapObject, sprite);
+ DoGroundEffects_OnFinishStep(mapObject, sprite);
+ npc_obj_transfer_image_anim_pause_flag(mapObject, sprite);
+ sub_80634D0(mapObject, sprite);
+ FieldObjectUpdateSubpriority(mapObject, sprite);
+}
+
+
+extern const u8 gUnknown_083756C8[5];
+
+u8 GetFaceDirectionAnimId(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756C8, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756CD[5];
+
+u8 GetSimpleGoAnimId(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756CD, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756D2[5];
+
+u8 GetGoSpeed0AnimId(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756D2, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756D7[5];
+
+u8 sub_8060744(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756D7, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756DC[5];
+
+u8 d2s_08064034(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756DC, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756E1[5];
+
+u8 sub_806079C(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756E1, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756E6[5];
+
+u8 sub_80607C8(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756E6, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756EB[5];
+
+u8 sub_80607F4(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756EB, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756F0[5];
+
+u8 GetJumpLedgeAnimId(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756F0, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756F5[5];
+
+u8 sub_806084C(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756F5, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756FA[5];
+
+u8 sub_8060878(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756FA, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_083756FF[5];
+
+u8 sub_80608A4(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_083756FF, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375704[5];
+
+u8 sub_80608D0(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375704, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375709[5];
+
+u8 GetStepInPlaceDelay32AnimId(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375709, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_0837570E[5];
+
+u8 GetStepInPlaceDelay16AnimId(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_0837570E, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375713[5];
+
+u8 GetStepInPlaceDelay8AnimId(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375713, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375718[5];
+
+u8 GetStepInPlaceDelay4AnimId(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375718, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction)
+{
+ return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction)));
+}
+
+extern const u8 gUnknown_0837571D[5];
+
+u8 sub_80609D8(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_0837571D, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375722[5];
+
+u8 sub_8060A04(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375722, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375727[5];
+
+u8 sub_8060A30(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375727, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_0837572C[5];
+
+u8 sub_8060A5C(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_0837572C, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375731[5];
+
+u8 sub_8060A88(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375731, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375736[5];
+
+u8 sub_8060AB4(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375736, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_0837573B[5];
+
+u8 sub_8060AE0(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_0837573B, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375740[5];
+
+u8 sub_8060B0C(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375740, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_08375745[5];
+
+u8 sub_8060B38(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_08375745, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+extern const u8 gUnknown_0837574A[5];
+
+u8 sub_8060B64(u8 index)
+{
+ u8 directions[5];
+ memcpy(directions, gUnknown_0837574A, 5);
+ if (index >= 5)
+ {
+ index = 0;
+ }
+ return directions[index];
+}
+
+u8 GetOppositeDirection(u8 direction)
+{
+ u8 directions[8];
+ memcpy(directions, gUnknown_0837574F, 8);
+ if (direction == 0 || direction > 8)
+ {
+ return direction;
+ }
+ return directions[direction - 1];
+}
+
+int zffu_offset_calc(u8 a0, u8 a1)
+{
+ return gUnknown_08375757[a0 - 1][a1 - 1];
+}
+
+#ifdef NONMATCHING
+int state_to_direction(u8 a0, u8 a1, u8 a2)
+{
+ int zffuOffset;
+ asm_comment("For some reason, r2 is being backed up to r3 and restored ahead of the zffu call.");
+ if (a1 == 0 || a2 == 0 || a1 > 4 || a2 > 4)
+ {
+ return 0;
+ }
+ zffuOffset = zffu_offset_calc(a1, a2);
+ return gUnknown_08375767[a0 - 1][zffuOffset - 1];
+}
+#else
+__attribute__((naked))
+int state_to_direction(u8 a0, u8 a1, u8 a2)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ adds r0, r1, 0\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ cmp r1, 0\n\
+ beq _08060BFC\n\
+ cmp r2, 0\n\
+ beq _08060BFC\n\
+ cmp r1, 0x4\n\
+ bhi _08060BFC\n\
+ cmp r2, 0x4\n\
+ bls _08060C00\n\
+_08060BFC:\n\
+ movs r0, 0\n\
+ b _08060C12\n\
+_08060C00:\n\
+ adds r1, r2, 0\n\
+ bl zffu_offset_calc\n\
+ ldr r2, _08060C18 @ =gUnknown_08375767\n\
+ lsls r1, r4, 2\n\
+ subs r1, 0x5\n\
+ adds r0, r1\n\
+ adds r0, r2\n\
+ ldrb r0, [r0]\n\
+_08060C12:\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_08060C18: .4byte gUnknown_08375767\n\
+.syntax divided\n");
+}
+#endif
+
+void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite))
+ {
+ mapObject->mapobj_bit_7 = 1;
+ }
+}
+
+bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite))
+ {
+ mapObject->mapobj_unk_1C = 0xFF;
+ sprite->data2 = 0;
+ return 1;
+ }
+ return 0;
+}
+
+void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId)
+{
+ mapObject->mapobj_unk_1C = animId;
+ sprite->data2 = 0;
+}
+
+void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
+{
+ FieldObjectSetDirection(mapObject, direction);
+ npc_coords_shift_still(mapObject);
+ sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
+ sprite->animPaused = 1;
+ sprite->data2 = 1;
+}
+
+u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ an_look_any(mapObject, sprite, DIR_SOUTH);
+ return 1;
+}
+
+u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ an_look_any(mapObject, sprite, DIR_NORTH);
+ return 1;
+}
+
+u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ an_look_any(mapObject, sprite, DIR_WEST);
+ return 1;
+}
+
+u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ an_look_any(mapObject, sprite, DIR_EAST);
+ return 1;
+}
+
+void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3)
+{
+ s16 x;
+ s16 y;
+ x = mapObject->coords2.x;
+ y = mapObject->coords2.y;
+ FieldObjectSetDirection(mapObject, direction);
+ MoveCoords(direction, &x, &y);
+ npc_coords_shift(mapObject, x, y);
+ oamt_npc_ministep_reset(sprite, direction, a3);
+ sprite->animPaused = 0;
+ mapObject->mapobj_bit_2 = 1;
+ sprite->data2 = 1;
+}
+
+extern u8 (*const gUnknown_083759C0[5])(u8);
+
+void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3)
+{
+ u8 (*functions[5])(u8);
+ memcpy(functions, gUnknown_083759C0, sizeof(gUnknown_083759C0));
+ sub_8060D20(mapObject, sprite, direction, a3);
+ sub_805FE28(mapObject, sprite, functions[a3](mapObject->mapobj_unk_18));
+}
+
+void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
+{
+ sub_8060D20(mapObject, sprite, direction, 1);
+ sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18));
+}
+
+bool8 obj_npc_ministep(struct Sprite *);
+
+bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (obj_npc_ministep(sprite))
+ {
+ npc_coords_shift_still(mapObject);
+ mapObject->mapobj_bit_3 = 1;
+ sprite->animPaused = 1;
+ return 1;
+ }
+ return 0;
+}
+
+void sub_8060E68(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
+{
+ s16 x;
+ s16 y;
+ x = mapObject->coords2.x;
+ y = mapObject->coords2.y;
+ FieldObjectSetDirection(mapObject, direction);
+ MoveCoords(direction, &x, &y);
+ npc_coords_shift(mapObject, x, y);
+ sub_806467C(sprite, direction);
+ sprite->animPaused = 0;
+ mapObject->mapobj_bit_2 = 1;
+ sprite->data2 = 1;
+}
+
+void sub_8060ED8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
+{
+ sub_8060E68(mapObject, sprite, direction);
+ sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
+}
+
+bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_806468C(sprite))
+ {
+ npc_coords_shift_still(mapObject);
+ mapObject->mapobj_bit_3 = 1;
+ sprite->animPaused = 1;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8060F5C(struct MapObject *, struct Sprite *);
+
+bool8 sub_8060F3C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8060ED8(mapObject, sprite, DIR_SOUTH);
+ return sub_8060F5C(mapObject, sprite);
+}
+
+bool8 sub_8060F5C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8060F9C(struct MapObject *, struct Sprite *);
+
+bool8 sub_8060F7C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8060ED8(mapObject, sprite, DIR_NORTH);
+ return sub_8060F9C(mapObject, sprite);
+}
+
+bool8 sub_8060F9C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8060FDC(struct MapObject *, struct Sprite *);
+
+bool8 sub_8060FBC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8060ED8(mapObject, sprite, DIR_WEST);
+ return sub_8060FDC(mapObject, sprite);
+}
+
+bool8 sub_8060FDC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806101C(struct MapObject *, struct Sprite *);
+
+bool8 sub_8060FFC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8060ED8(mapObject, sprite, DIR_EAST);
+ return sub_806101C(mapObject, sprite);
+}
+
+bool8 sub_806101C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806105C(struct MapObject *, struct Sprite *);
+
+bool8 sub_806103C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_SOUTH, 0);
+ return sub_806105C(mapObject, sprite);
+}
+
+bool8 sub_806105C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806109C(struct MapObject *, struct Sprite *);
+
+bool8 sub_806107C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_NORTH, 0);
+ return sub_806109C(mapObject, sprite);
+}
+
+bool8 sub_806109C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80610DC(struct MapObject *, struct Sprite *);
+
+bool8 sub_80610BC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_WEST, 0);
+ return sub_80610DC(mapObject, sprite);
+}
+
+bool8 sub_80610DC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806111C(struct MapObject *, struct Sprite *);
+
+bool8 sub_80610FC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_EAST, 0);
+ return sub_806111C(mapObject, sprite);
+}
+
+bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+extern const s16 gUnknown_08375A34[3];
+extern const s16 gUnknown_08375A3A[3];
+
+void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5)
+{
+ s16 vSPp4[3];
+ s16 x;
+ s16 y;
+ memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34);
+ x = 0;
+ y = 0;
+ FieldObjectSetDirection(mapObject, direction);
+ sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]);
+ npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y);
+ sub_80646E4(sprite, direction, a4, a5);
+ sprite->data2 = 1;
+ sprite->animPaused = 0;
+ mapObject->mapobj_bit_2 = 1;
+ mapObject->mapobj_bit_4 = 1;
+}
+
+void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5)
+{
+ sub_806113C(mapObject, sprite, direction, a4, a5);
+ sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
+ DoShadowFieldEffect(mapObject);
+}
+
+u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *))
+{
+ s16 vSPp4[3];
+ s16 x;
+ s16 y;
+ u8 retval;
+ memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A);
+ retval = callback(sprite);
+ if (retval == 1 && vSPp4[sprite->data4] != 0)
+ {
+ x = 0;
+ y = 0;
+ sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data4], vSPp4[sprite->data4]);
+ npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y);
+ mapObject->mapobj_bit_2 = 1;
+ mapObject->mapobj_bit_4 = 1;
+ } else if (retval == 0xff)
+ {
+ npc_coords_shift_still(mapObject);
+ mapObject->mapobj_bit_3 = 1;
+ mapObject->mapobj_bit_5 = 1;
+ sprite->animPaused = 1;
+ }
+ return retval;
+}
+
+u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return sub_806123C(mapObject, sprite, sub_8064704);
+}
+
+u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return sub_806123C(mapObject, sprite, sub_806478C);
+}
+
+bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061300(mapObject, sprite) == 0xFF)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061314(mapObject, sprite) == 0xFF)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 retval;
+
+ retval = sub_8061300(mapObject, sprite);
+ if (retval != 1)
+ {
+ if (retval == 0xFF)
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18));
+ sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
+ return FALSE;
+}
+
+bool8 sub_80613D4(struct MapObject *, struct Sprite *);
+bool8 sub_806142C(struct MapObject *, struct Sprite *);
+bool8 sub_8061484(struct MapObject *, struct Sprite *);
+bool8 sub_80614DC(struct MapObject *, struct Sprite *);
+
+bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0);
+ return sub_80613D4(mapObject, sprite);
+}
+
+bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0);
+ return sub_806142C(mapObject, sprite);
+}
+
+bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0);
+ return sub_8061484(mapObject, sprite);
+}
+
+bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0);
+ return sub_80614DC(mapObject, sprite);
+}
+
+bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8061508(struct Sprite *sprite, u16 duration)
+{
+ sprite->data2 = 1;
+ sprite->data3 = duration;
+}
+
+bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->data3--;
+ if (!sprite->data3)
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 1);
+ return sub_8061510(mapObject, sprite);
+}
+
+bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 2);
+ return sub_8061510(mapObject, sprite);
+}
+
+bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 4);
+ return sub_8061510(mapObject, sprite);
+}
+
+bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 8);
+ return sub_8061510(mapObject, sprite);
+}
+
+bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 16);
+ return sub_8061510(mapObject, sprite);
+}
+
+bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite);
+bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite);
+bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite);
+bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_80615CC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_SOUTH, 1);
+ return sub_80615EC(mapObject, sprite);
+}
+
+bool8 sub_80615EC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+bool8 sub_806160C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_NORTH, 1);
+ return sub_806162C(mapObject, sprite);
+}
+
+bool8 sub_806162C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+bool8 sub_806164C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_WEST, 1);
+ return sub_806166C(mapObject, sprite);
+}
+
+bool8 sub_806166C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+bool8 sub_806168C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_EAST, 1);
+ return sub_80616AC(mapObject, sprite);
+}
+
+bool8 sub_80616AC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_80616CC(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animId, u16 duration)
+{
+ FieldObjectSetDirection(mapObject, direction);
+ sub_805FE28(mapObject, sprite, animId);
+ sprite->animPaused = 0;
+ sprite->data2 = 1;
+ sprite->data3 = duration;
+}
+
+bool8 sub_8061714(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->data3--;
+ if (sprite->data3 == 0)
+ {
+ sprite->data2 = 2;
+ sprite->animPaused = 1;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806173C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sprite->data3 & 1)
+ {
+ sprite->animDelayCounter++;
+ }
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061778(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 32);
+ return sub_806173C(mapObject, sprite);
+}
+
+bool8 sub_80617B0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 32);
+ return sub_806173C(mapObject, sprite);
+}
+
+bool8 sub_80617E8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 32);
+ return sub_806173C(mapObject, sprite);
+}
+
+bool8 sub_8061820(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 32);
+ return sub_806173C(mapObject, sprite);
+}
+
+bool8 sub_8061858(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_image_anim_num(DIR_SOUTH), 16);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061890(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_image_anim_num(DIR_NORTH), 16);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_80618C8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_WEST, get_go_image_anim_num(DIR_WEST), 16);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061900(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_EAST, get_go_image_anim_num(DIR_EAST), 16);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061938(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_fast_image_anim_num(DIR_SOUTH), 8);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061970(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_fast_image_anim_num(DIR_NORTH), 8);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_80619A8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_WEST, get_go_fast_image_anim_num(DIR_WEST), 8);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_80619E0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_EAST, get_go_fast_image_anim_num(DIR_EAST), 8);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061A18(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_SOUTH, get_go_faster_image_anim_num(DIR_SOUTH), 4);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061A50(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_NORTH, get_go_faster_image_anim_num(DIR_NORTH), 4);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061A88(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_WEST, get_go_faster_image_anim_num(DIR_WEST), 4);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061AC0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_EAST, get_go_faster_image_anim_num(DIR_EAST), 4);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8061B18(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061AF8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_SOUTH, 2);
+ return sub_8061B18(mapObject, sprite);
+}
+
+bool8 sub_8061B18(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+bool8 sub_8061B58(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061B38(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_NORTH, 2);
+ return sub_8061B58(mapObject, sprite);
+}
+
+bool8 sub_8061B58(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+bool8 sub_8061B98(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061B78(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_WEST, 2);
+ return sub_8061B98(mapObject, sprite);
+}
+
+bool8 sub_8061B98(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+bool8 sub_8061BD8(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061BB8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_EAST, 2);
+ return sub_8061BD8(mapObject, sprite);
+}
+
+bool8 sub_8061BD8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061C18(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061BF8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_SOUTH, 3);
+ return sub_8061C18(mapObject, sprite);
+}
+
+bool8 sub_8061C18(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061C58(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061C38(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_NORTH, 3);
+ return sub_8061C58(mapObject, sprite);
+}
+
+bool8 sub_8061C58(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+bool8 sub_8061C98(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061C78(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_WEST, 3);
+ return sub_8061C98(mapObject, sprite);
+}
+
+bool8 sub_8061C98(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+bool8 sub_8061CD8(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061CB8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_EAST, 3);
+ return sub_8061CD8(mapObject, sprite);
+}
+
+bool8 sub_8061CD8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061D18(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061CF8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_SOUTH, 4);
+ return sub_8061D18(mapObject, sprite);
+}
+
+bool8 sub_8061D18(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061D58(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061D38(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_NORTH, 4);
+ return sub_8061D58(mapObject, sprite);
+}
+
+bool8 sub_8061D58(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+bool8 sub_8061D98(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061D78(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_WEST, 4);
+ return sub_8061D98(mapObject, sprite);
+}
+
+bool8 sub_8061D98(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+bool8 sub_8061DD8(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061DB8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_go_anim(mapObject, sprite, DIR_EAST, 4);
+ return sub_8061DD8(mapObject, sprite);
+}
+
+bool8 sub_8061DD8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061E18(struct MapObject *, struct Sprite *);
+
+bool8 do_run_south_anim(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_run_anim(mapObject, sprite, DIR_SOUTH);
+ return sub_8061E18(mapObject, sprite);
+}
+
+bool8 sub_8061E18(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061E58(struct MapObject *, struct Sprite *);
+
+bool8 do_run_north_anim(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_run_anim(mapObject, sprite, DIR_NORTH);
+ return sub_8061E58(mapObject, sprite);
+}
+
+bool8 sub_8061E58(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061E98(struct MapObject *, struct Sprite *);
+
+bool8 do_run_west_anim(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_run_anim(mapObject, sprite, DIR_WEST);
+ return sub_8061E98(mapObject, sprite);
+}
+
+bool8 sub_8061E98(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061ED8(struct MapObject *, struct Sprite *);
+
+bool8 do_run_east_anim(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ do_run_anim(mapObject, sprite, DIR_EAST);
+ return sub_8061ED8(mapObject, sprite);
+}
+
+bool8 sub_8061ED8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum)
+{
+ obj_anim_image_set_and_seek(sprite, animNum, 0);
+ FieldObjectSetDirection(mapObject, direction);
+ sprite->data2 = 1;
+}
+
+bool8 sub_8061F24(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum);
+ return FALSE;
+}
+
+bool8 sub_8064864(struct Sprite *);
+
+bool8 sub_8061F3C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064864(sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8061F5C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
+{
+ sub_806113C(mapObject, sprite, direction, 1, 0);
+ StartSpriteAnim(sprite, sub_805FD88(direction));
+}
+
+bool8 sub_8061FB0(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061F90(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061F5C(mapObject, sprite, DIR_SOUTH);
+ return sub_8061FB0(mapObject, sprite);
+}
+
+bool8 sub_8061FB0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061340(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ mapObject->mapobj_bit_5 = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061FF8(struct MapObject *, struct Sprite *);
+
+bool8 sub_8061FD8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061F5C(mapObject, sprite, DIR_NORTH);
+ return sub_8061FF8(mapObject, sprite);
+}
+
+bool8 sub_8061FF8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061340(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ mapObject->mapobj_bit_5 = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062040(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062020(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061F5C(mapObject, sprite, DIR_WEST);
+ return sub_8062040(mapObject, sprite);
+}
+
+bool8 sub_8062040(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061340(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ mapObject->mapobj_bit_5 = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062088(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062068(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061F5C(mapObject, sprite, DIR_EAST);
+ return sub_8062088(mapObject, sprite);
+}
+
+bool8 sub_8062088(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061340(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ mapObject->mapobj_bit_5 = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80620B0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 objectId;
+ if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, &objectId))
+ {
+ an_look_any(mapObject, sprite, sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y));
+ }
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_806210C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 objectId;
+ if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, &objectId))
+ {
+ an_look_any(mapObject, sprite, GetOppositeDirection(sub_805FE90(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[objectId].coords2.x, gMapObjects[objectId].coords2.y)));
+ }
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_8062170(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_9 = 1;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_8062180(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_9 = 0;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_8062190(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 1, 2);
+ return sub_80621BC(mapObject, sprite);
+}
+
+bool8 sub_80621BC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_80621E8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_NORTH, 1, 2);
+ return sub_8062214(mapObject, sprite);
+}
+
+bool8 sub_8062214(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_8062240(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_WEST, 1, 2);
+ return sub_806226C(mapObject, sprite);
+}
+
+bool8 sub_806226C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_8062298(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_EAST, 1, 2);
+ return sub_80622C4(mapObject, sprite);
+}
+
+bool8 sub_80622C4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_80622F0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 0);
+ return sub_806231C(mapObject, sprite);
+}
+
+bool8 sub_806231C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_8062348(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 0);
+ return sub_8062374(mapObject, sprite);
+}
+
+bool8 sub_8062374(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_80623A0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 0);
+ return sub_80623CC(mapObject, sprite);
+}
+
+bool8 sub_80623CC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_80623F8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 0);
+ return sub_8062424(mapObject, sprite);
+}
+
+bool8 sub_8062424(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_8062450(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 0, 2);
+ return sub_806247C(mapObject, sprite);
+}
+
+bool8 sub_806247C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061358(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_80624A8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_NORTH, 0, 2);
+ return sub_80624D4(mapObject, sprite);
+}
+
+bool8 sub_80624D4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061358(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_8062500(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_WEST, 0, 2);
+ return sub_806252C(mapObject, sprite);
+}
+
+bool8 sub_806252C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061358(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite);
+
+bool8 sub_8062558(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_EAST, 0, 2);
+ return sub_8062584(mapObject, sprite);
+}
+
+bool8 sub_8062584(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061358(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80625B0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ an_look_any(mapObject, sprite, gUnknown_0836DC09[mapObject->animPattern]);
+ return TRUE;
+}
+
+bool8 sub_80625C8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14);
+ return FALSE;
+}
+
+bool8 sub_80625D8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_25 = 0;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_80625E8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_25 = 1;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_80625F8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_12 = 1;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_8062608(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_8062634(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_13 = 1;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_8062644(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_13 = 0;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
+ FieldEffectStart(0x0);
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
+ FieldEffectStart(0x21);
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectGetLocalIdAndMap(mapObject, (u8 *)&gUnknown_0202FF84[0], (u8 *)&gUnknown_0202FF84[1], (u8 *)&gUnknown_0202FF84[2]);
+ FieldEffectStart(0x2e);
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_8062704(struct MapObject *, struct Sprite *);
+
+bool8 sub_80626C0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (mapObject->animPattern == 0x3F)
+ {
+ sub_8084794(mapObject);
+ return FALSE;
+ }
+ else if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A)
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ else
+ {
+ sub_812869C(mapObject);
+ sprite->data2 = 1;
+ return sub_8062704(mapObject, sprite);
+ }
+}
+
+bool8 sub_8062704(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_81286C4(mapObject))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062724(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ obj_anim_image_set_and_seek(sprite, 1, 0);
+ sprite->data2 = 1;
+ return FALSE;
+}
+
+bool8 sub_8062740(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064864(sprite))
+ {
+ sub_8064820(sprite, 0x20);
+ sprite->data2 = 2;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062764(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_13 ^= 1;
+ if (sub_8064824(sprite))
+ {
+ mapObject->mapobj_bit_13 = 1;
+ sprite->data2 = 3;
+ }
+ return FALSE;
+}
+
+bool8 sub_80627A0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ obj_anim_image_set_and_seek(sprite, 1, 0);
+ sprite->data2 = 1;
+ return FALSE;
+}
+
+bool8 sub_80627BC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8064864(sprite))
+ {
+ sub_8064820(sprite, 0x20);
+ sprite->data2 = 2;
+ }
+ return FALSE;
+}
+
+bool8 sub_80627E0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_13 ^= 1;
+ if (sub_8064824(sprite))
+ {
+ mapObject->mapobj_bit_13 = 1;
+ sprite->data2 = 3;
+ }
+ return FALSE;
+}
+
+bool8 sub_806281C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_26 = 1;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_806282C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ mapObject->mapobj_bit_26 = 0;
+ sprite->data2 = 1;
+ return TRUE;
+}
+
+bool8 sub_806283C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->oam.affineMode = 3;
+ InitSpriteAffineAnim(sprite);
+ sprite->affineAnimPaused = 1;
+ sprite->subspriteMode = 0;
+ return TRUE;
+}
+
+bool8 sub_806286C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->oam.affineMode = 0;
+ CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
+ return TRUE;
+}
+
+bool8 sub_80628D0(struct MapObject *, struct Sprite *);
+
+bool8 sub_806289C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8060ED8(mapObject, sprite, DIR_SOUTH);
+ sprite->affineAnimPaused = 0;
+ StartSpriteAffineAnimIfDifferent(sprite, 0);
+ return sub_80628D0(mapObject, sprite);
+}
+
+bool8 sub_80628D0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(mapObject, sprite))
+ {
+ sprite->affineAnimPaused = 1;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062930(struct MapObject *, struct Sprite *);
+
+bool8 sub_80628FC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8060ED8(mapObject, sprite, DIR_SOUTH);
+ sprite->affineAnimPaused = 0;
+ ChangeSpriteAffineAnimIfDifferent(sprite, 1);
+ return sub_8062930(mapObject, sprite);
+}
+
+bool8 sub_8062930(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (an_walk_any_2(mapObject, sprite))
+ {
+ sprite->affineAnimPaused = 1;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_806295C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
+{
+ FieldObjectSetDirection(mapObject, direction);
+ npc_coords_shift_still(mapObject);
+ sub_805FE64(mapObject, sprite, sub_805FDD8(direction));
+ sprite->animPaused = 1;
+ sprite->data2 = 1;
+}
+
+bool8 sub_806299C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_806295C(mapObject, sprite, DIR_SOUTH);
+ return TRUE;
+}
+
+bool8 sub_80629AC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_806295C(mapObject, sprite, DIR_NORTH);
+ return TRUE;
+}
+
+bool8 sub_80629BC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_806295C(mapObject, sprite, DIR_WEST);
+ return TRUE;
+}
+
+bool8 sub_80629CC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_806295C(mapObject, sprite, DIR_EAST);
+ return TRUE;
+}
+
+bool8 sub_80629DC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FD98(DIR_SOUTH));
+ return FALSE;
+}
+
+bool8 sub_8062A00(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FD98(DIR_NORTH));
+ return FALSE;
+}
+
+bool8 sub_8062A24(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FD98(DIR_WEST));
+ return FALSE;
+}
+
+bool8 sub_8062A48(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FD98(DIR_EAST));
+ return FALSE;
+}
+
+bool8 sub_8062A6C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDB8(DIR_SOUTH));
+ return FALSE;
+}
+
+bool8 sub_8062A90(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDB8(DIR_NORTH));
+ return FALSE;
+}
+
+bool8 sub_8062AB4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDB8(DIR_WEST));
+ return FALSE;
+}
+
+bool8 sub_8062AD8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDB8(DIR_EAST));
+ return FALSE;
+}
+
+bool8 sub_8062AFC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, sub_805FDC8(DIR_SOUTH));
+ return FALSE;
+}
+
+bool8 sub_8062B20(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_NORTH, sub_805FDC8(DIR_NORTH));
+ return FALSE;
+}
+
+bool8 sub_8062B44(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_WEST, sub_805FDC8(DIR_WEST));
+ return FALSE;
+}
+
+bool8 sub_8062B68(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_EAST, sub_805FDC8(DIR_EAST));
+ return FALSE;
+}
+
+void sub_8062B8C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3, u8 a4)
+{
+ sub_806113C(mapObject, sprite, direction, a3, a4);
+ StartSpriteAnimIfDifferent(sprite, sub_805FD98(direction));
+ DoShadowFieldEffect(mapObject);
+}
+
+bool8 sub_8062BFC(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062BD0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_SOUTH, 0, 1);
+ return sub_8062BFC(mapObject, sprite);
+}
+
+bool8 sub_8062BFC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062C54(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062C28(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_NORTH, 0, 1);
+ return sub_8062C54(mapObject, sprite);
+}
+
+bool8 sub_8062C54(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062CAC(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062C80(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_WEST, 0, 1);
+ return sub_8062CAC(mapObject, sprite);
+}
+
+bool8 sub_8062CAC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062D04(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062CD8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_EAST, 0, 1);
+ return sub_8062D04(mapObject, sprite);
+}
+
+bool8 sub_8062D04(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062D5C(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062D30(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_SOUTH, 1, 1);
+ return sub_8062D5C(mapObject, sprite);
+}
+
+bool8 sub_8062D5C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062DB4(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062D88(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_NORTH, 1, 1);
+ return sub_8062DB4(mapObject, sprite);
+}
+
+bool8 sub_8062DB4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062E0C(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062DE0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_WEST, 1, 1);
+ return sub_8062E0C(mapObject, sprite);
+}
+
+bool8 sub_8062E0C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062E64(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062E38(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_EAST, 1, 1);
+ return sub_8062E64(mapObject, sprite);
+}
+
+bool8 sub_8062E64(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062EBC(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062E90(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_SOUTH, 2, 0);
+ return sub_8062EBC(mapObject, sprite);
+}
+
+bool8 sub_8062EBC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062F14(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062EE8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_NORTH, 2, 0);
+ return sub_8062F14(mapObject, sprite);
+}
+
+bool8 sub_8062F14(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062F6C(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062F40(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_WEST, 2, 0);
+ return sub_8062F6C(mapObject, sprite);
+}
+
+bool8 sub_8062F6C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062FC4(struct MapObject *, struct Sprite *);
+
+bool8 sub_8062F98(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8062B8C(mapObject, sprite, DIR_EAST, 2, 0);
+ return sub_8062FC4(mapObject, sprite);
+}
+
+bool8 sub_8062FC4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8062FF0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_SOUTH, sub_805FDD8(DIR_SOUTH), 8);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8063028(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_NORTH, sub_805FDD8(DIR_NORTH), 8);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8063060(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_WEST, sub_805FDD8(DIR_WEST), 8);
+ return sub_8061714(mapObject, sprite);
+}
+
+bool8 sub_8063098(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80616CC(mapObject, sprite, DIR_EAST, sub_805FDD8(DIR_EAST), 8);
+ return sub_8061714(mapObject, sprite);
+}
+
+void sub_80630D0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3)
+{
+ sub_8060D20(mapObject, sprite, direction, a3);
+ StartSpriteAnim(sprite, sub_805FD98(mapObject->mapobj_unk_18));
+ SeekSpriteAnim(sprite, 0);
+}
+
+bool8 sub_8063128(struct MapObject *, struct Sprite *);
+
+bool8 sub_8063108(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80630D0(mapObject, sprite, DIR_SOUTH, 1);
+ return sub_8063128(mapObject, sprite);
+}
+
+bool8 sub_8063128(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8063168(struct MapObject *, struct Sprite *);
+
+bool8 sub_8063148(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80630D0(mapObject, sprite, DIR_NORTH, 1);
+ return sub_8063168(mapObject, sprite);
+}
+
+bool8 sub_8063168(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80631A8(struct MapObject *, struct Sprite *);
+
+bool8 sub_8063188(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80630D0(mapObject, sprite, DIR_WEST, 1);
+ return sub_80631A8(mapObject, sprite);
+}
+
+bool8 sub_80631A8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80631E8(struct MapObject *, struct Sprite *);
+
+bool8 sub_80631C8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80630D0(mapObject, sprite, DIR_EAST, 1);
+ return sub_80631E8(mapObject, sprite);
+}
+
+bool8 sub_80631E8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8063208(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3)
+{
+ sub_8060D20(mapObject, sprite, direction, a3);
+ sub_805FE28(mapObject, sprite, sub_805FDD8(mapObject->mapobj_unk_18));
+}
+
+bool8 sub_8063258(struct MapObject *, struct Sprite *);
+
+bool8 sub_8063238(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8063208(mapObject, sprite, DIR_SOUTH, 1);
+ return sub_8063258(mapObject, sprite);
+}
+
+bool8 sub_8063258(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8063298(struct MapObject *, struct Sprite *);
+
+bool8 sub_8063278(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8063208(mapObject, sprite, DIR_NORTH, 1);
+ return sub_8063298(mapObject, sprite);
+}
+
+bool8 sub_8063298(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80632D8(struct MapObject *, struct Sprite *);
+
+bool8 sub_80632B8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8063208(mapObject, sprite, DIR_WEST, 1);
+ return sub_80632D8(mapObject, sprite);
+}
+
+bool8 sub_80632D8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8063318(struct MapObject *, struct Sprite *);
+
+bool8 sub_80632F8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8063208(mapObject, sprite, DIR_EAST, 1);
+ return sub_8063318(mapObject, sprite);
+}
+
+bool8 sub_8063318(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8063338(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a3)
+{
+ sub_8060D20(mapObject, sprite, direction, a3);
+ StartSpriteAnim(sprite, sub_805FDB8(mapObject->mapobj_unk_18));
+ SeekSpriteAnim(sprite, 0);
+}
+
+bool8 sub_8063390(struct MapObject *, struct Sprite *);
+
+bool8 sub_8063370(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8063338(mapObject, sprite, DIR_SOUTH, 1);
+ return sub_8063390(mapObject, sprite);
+}
+
+bool8 sub_8063390(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80633D0(struct MapObject *, struct Sprite *);
+
+bool8 sub_80633B0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8063338(mapObject, sprite, DIR_NORTH, 1);
+ return sub_80633D0(mapObject, sprite);
+}
+
+bool8 sub_80633D0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8063410(struct MapObject *, struct Sprite *);
+
+bool8 sub_80633F0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8063338(mapObject, sprite, DIR_WEST, 1);
+ return sub_8063410(mapObject, sprite);
+}
+
+bool8 sub_8063410(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8063450(struct MapObject *, struct Sprite *);
+
+bool8 sub_8063430(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8063338(mapObject, sprite, DIR_EAST, 1);
+ return sub_8063450(mapObject, sprite);
+}
+
+bool8 sub_8063450(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (npc_obj_ministep_stop_on_arrival(mapObject, sprite))
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8063470(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return TRUE;
+}
+
+bool8 sub_8063474(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->animPaused = 1;
+ return TRUE;
+}
+
+void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (mapObject->mapobj_bit_10)
+ {
+ sprite->animPaused = 1;
+ }
+}
+
+void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (mapObject->mapobj_bit_11)
+ {
+ sprite->animPaused = 0;
+ mapObject->mapobj_bit_10 = 0;
+ mapObject->mapobj_bit_11 = 0;
+ }
+}
+
+void sub_80634E8(struct MapObject *, struct Sprite *);
+void npc_update_obj_anim_flag(struct MapObject *, struct Sprite *);
+
+void sub_80634D0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_80634E8(mapObject, sprite);
+ npc_update_obj_anim_flag(mapObject, sprite);
+}
+
+#ifdef NONMATCHING
+void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u16 x;
+ u16 y;
+ s16 x2;
+ s16 y2;
+ const struct MapObjectGraphicsInfo *graphicsInfo;
+ mapObject->mapobj_bit_14 = 0;
+ graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+ if (sprite->coordOffsetEnabled)
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
+ } else
+ {
+ x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
+ y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
+ }
+ x2 = graphicsInfo->width + x; // offending line
+ y2 = graphicsInfo->height + y; // similarly offending line
+ if ((s16)x >= 0x100 || x2 < -0x10)
+ {
+ mapObject->mapobj_bit_14 = 1;
+ }
+ if ((s16)y >= 0xB0 || y2 < -0x10)
+ {
+ mapObject->mapobj_bit_14 = 1;
+ }
+}
+#else
+__attribute__((naked))
+void sub_80634E8(struct MapObject *mapObject, struct Sprite *sprite) {
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ adds r5, r0, 0\n\
+ adds r4, r1, 0\n\
+ ldrb r1, [r5, 0x1]\n\
+ movs r0, 0x41\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ strb r0, [r5, 0x1]\n\
+ ldrb r0, [r5, 0x5]\n\
+ bl GetFieldObjectGraphicsInfo\n\
+ adds r6, r0, 0\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x3E\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0806354C\n\
+ ldrh r1, [r4, 0x24]\n\
+ ldrh r0, [r4, 0x20]\n\
+ adds r1, r0\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x28\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ ldr r2, _08063544 @ =gSpriteCoordOffsetX\n\
+ adds r0, r1\n\
+ ldrh r2, [r2]\n\
+ adds r0, r2\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ ldrh r1, [r4, 0x26]\n\
+ ldrh r0, [r4, 0x22]\n\
+ adds r1, r0\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x29\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ ldr r2, _08063548 @ =gSpriteCoordOffsetY\n\
+ adds r0, r1\n\
+ ldrh r2, [r2]\n\
+ adds r0, r2\n\
+ b _08063574\n\
+ .align 2, 0\n\
+_08063544: .4byte gSpriteCoordOffsetX\n\
+_08063548: .4byte gSpriteCoordOffsetY\n\
+_0806354C:\n\
+ ldrh r1, [r4, 0x24]\n\
+ ldrh r0, [r4, 0x20]\n\
+ adds r1, r0\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x28\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ adds r0, r1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ ldrh r1, [r4, 0x26]\n\
+ ldrh r0, [r4, 0x22]\n\
+ adds r1, r0\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x29\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ adds r0, r1\n\
+_08063574:\n\
+ lsls r0, 16\n\
+ lsrs r2, r0, 16\n\
+ ldrh r0, [r6, 0x8]\n\
+ adds r0, r3\n\
+ lsls r0, 16\n\
+ lsrs r1, r0, 16\n\
+ ldrh r0, [r6, 0xA]\n\
+ adds r0, r2\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0xFF\n\
+ bgt _0806359C\n\
+ lsls r0, r1, 16\n\
+ asrs r0, 16\n\
+ movs r1, 0x10\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ bge _080635A4\n\
+_0806359C:\n\
+ ldrb r0, [r5, 0x1]\n\
+ movs r1, 0x40\n\
+ orrs r0, r1\n\
+ strb r0, [r5, 0x1]\n\
+_080635A4:\n\
+ lsls r0, r2, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0xAF\n\
+ bgt _080635B8\n\
+ lsls r0, r4, 16\n\
+ asrs r0, 16\n\
+ movs r1, 0x10\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ bge _080635C0\n\
+_080635B8:\n\
+ ldrb r0, [r5, 0x1]\n\
+ movs r1, 0x40\n\
+ orrs r0, r1\n\
+ strb r0, [r5, 0x1]\n\
+_080635C0:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+.syntax divided\n");
+}
+#endif
+
+void npc_update_obj_anim_flag(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->invisible = 0;
+ if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14)
+ {
+ sprite->invisible = 1;
+ }
+}
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index 6a0fe1dce..1e1162350 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -16,18 +16,13 @@
#include "script.h"
#include "songs.h"
#include "sound.h"
+#include "strings2.h"
#include "task.h"
#include "wild_encounter.h"
-extern u8 gOtherText_OhABite[];
-extern u8 gOtherText_PokeOnHook[];
-extern u8 gOtherText_NotEvenANibble[];
-extern u8 gOtherText_ItGotAway[];
-
extern u32 gUnknown_0202FF84[];
//Functions
-static u32 sub_80587D8(void);
static bool8 sub_8058854(struct MapObject *, u8);
static void npc_clear_strange_bits(struct MapObject *a);
static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c);
@@ -246,16 +241,7 @@ static u8 (*const gUnknown_0830FC98[])(struct Task *, struct MapObject *) =
sub_805A1B8,
};
-
-void sub_80587B4(struct Sprite *sprite)
-{
- meta_step(&gMapObjects[sprite->data0], sprite, sub_80587D8);
-}
-
-static u32 sub_80587D8(void)
-{
- return 0;
-}
+fieldmap_object_null_cb(sub_80587B4, sub_80587D8);
void player_step(u8 direction, u16 newKeys, u16 heldKeys)
{
diff --git a/src/field_poison.c b/src/field_poison.c
index 8e49080b0..4d4d4b975 100644
--- a/src/field_poison.c
+++ b/src/field_poison.c
@@ -72,32 +72,32 @@ void Task_WhiteOut(u8 taskId)
switch (taskData[TD_STATE])
{
- case 0: //Check if Pokemon have fainted due to poison
- while (taskData[TD_PARTY_MEMBER] < 6)
+ case 0: //Check if Pokemon have fainted due to poison
+ while (taskData[TD_PARTY_MEMBER] < 6)
+ {
+ if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER]))
{
- if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER]))
- {
- MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]);
- ShowFieldMessage(fieldPoisonText_PokemonFainted);
- taskData[TD_STATE]++;
- return;
- }
- taskData[TD_PARTY_MEMBER]++;
+ MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]);
+ ShowFieldMessage(fieldPoisonText_PokemonFainted);
+ taskData[TD_STATE]++;
+ return;
}
- taskData[TD_STATE] = 2;
- break;
- case 1: //Wait for message box to disappear
- if (IsFieldMessageBoxHidden())
- taskData[TD_STATE]--; //Check next party member
- break;
- case 2: //Done checking Pokemon
- if (AllMonsFainted())
- gScriptResult = 1;
- else
- gScriptResult = 0;
- EnableBothScriptContexts();
- DestroyTask(taskId);
- break;
+ taskData[TD_PARTY_MEMBER]++;
+ }
+ taskData[TD_STATE] = 2;
+ break;
+ case 1: //Wait for message box to disappear
+ if (IsFieldMessageBoxHidden())
+ taskData[TD_STATE]--; //Check next party member
+ break;
+ case 2: //Done checking Pokemon
+ if (AllMonsFainted())
+ gScriptResult = 1;
+ else
+ gScriptResult = 0;
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
}
}
diff --git a/src/field_region_map.c b/src/field_region_map.c
index ec630ad00..66e3d968c 100644
--- a/src/field_region_map.c
+++ b/src/field_region_map.c
@@ -5,6 +5,7 @@
#include "palette.h"
#include "sprite.h"
#include "text.h"
+#include "strings2.h"
extern void sub_80FA8EC(u32, u8);
extern void sub_80FAB10(void);
@@ -29,8 +30,6 @@ struct UnkStruct
extern struct UnkStruct unk_2000000;
-extern u8 gOtherText_Hoenn[];
-
void CB2_FieldInitRegionMap(void);
void CB2_FieldRegionMap(void);
void VBlankCB_FieldRegionMap(void);
diff --git a/src/field_special_scene.c b/src/field_special_scene.c
index 59280b743..9e06ede81 100644
--- a/src/field_special_scene.c
+++ b/src/field_special_scene.c
@@ -143,64 +143,64 @@ void Task_HandleTruckSequence(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- switch (data[0])
- {
- /*
- Each case has a timer which is handled with data[1], incrementing
- until it reaches the if function's condition, which sets the next task up.
- */
- case 0:
- data[1]++;
- if (data[1] == SECONDS(1.5))
- {
- SetCameraPanningCallback(0);
- data[1] = 0; // reset the timer.
- data[2] = CreateTask(Task_Truck1, 0xA);
- data[0] = 1; // run the next case.
- PlaySE(SE_TRACK_MOVE);
- }
- break;
- case 1:
- data[1]++;
- if (data[1] == SECONDS(2.5))
- {
- pal_fill_black();
- data[1] = 0;
- data[0] = 2;
- }
- break;
- case 2:
- data[1]++;
- if (!gPaletteFade.active && data[1] > SECONDS(5))
- {
- data[1] = 0;
- DestroyTask(data[2]);
- data[3] = CreateTask(Task_Truck2, 0xA);
- data[0] = 3;
- PlaySE(SE_TRACK_STOP);
- }
- break;
- case 3:
- if (!gTasks[data[3]].isActive) // is Truck2 no longer active (is Truck3 active?)
- {
- InstallCameraPanAheadCallback();
- data[1] = 0;
- data[0] = 4;
- }
- break;
- case 4:
- data[1]++;
- if (data[1] == 90)
- {
- PlaySE(SE_TRACK_HAIK);
- data[1] = 0;
- data[0] = 5;
- }
- break;
- case 5:
- data[1]++;
- if (data[1] == 120)
- {
+ switch (data[0])
+ {
+ /*
+ Each case has a timer which is handled with data[1], incrementing
+ until it reaches the if function's condition, which sets the next task up.
+ */
+ case 0:
+ data[1]++;
+ if (data[1] == SECONDS(1.5))
+ {
+ SetCameraPanningCallback(0);
+ data[1] = 0; // reset the timer.
+ data[2] = CreateTask(Task_Truck1, 0xA);
+ data[0] = 1; // run the next case.
+ PlaySE(SE_TRACK_MOVE);
+ }
+ break;
+ case 1:
+ data[1]++;
+ if (data[1] == SECONDS(2.5))
+ {
+ pal_fill_black();
+ data[1] = 0;
+ data[0] = 2;
+ }
+ break;
+ case 2:
+ data[1]++;
+ if (!gPaletteFade.active && data[1] > SECONDS(5))
+ {
+ data[1] = 0;
+ DestroyTask(data[2]);
+ data[3] = CreateTask(Task_Truck2, 0xA);
+ data[0] = 3;
+ PlaySE(SE_TRACK_STOP);
+ }
+ break;
+ case 3:
+ if (!gTasks[data[3]].isActive) // is Truck2 no longer active (is Truck3 active?)
+ {
+ InstallCameraPanAheadCallback();
+ data[1] = 0;
+ data[0] = 4;
+ }
+ break;
+ case 4:
+ data[1]++;
+ if (data[1] == 90)
+ {
+ PlaySE(SE_TRACK_HAIK);
+ data[1] = 0;
+ data[0] = 5;
+ }
+ break;
+ case 5:
+ data[1]++;
+ if (data[1] == 120)
+ {
MapGridSetMetatileIdAt(11, 8, 520);
MapGridSetMetatileIdAt(11, 9, 528);
MapGridSetMetatileIdAt(11, 10, 536);
@@ -208,9 +208,9 @@ void Task_HandleTruckSequence(u8 taskId)
PlaySE(SE_TRACK_DOOR);
DestroyTask(taskId);
ScriptContext2_Disable();
- }
- break;
- }
+ }
+ break;
+ }
}
void ExecuteTruckSequence(void)
diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c
index 77c8752d1..8fde74852 100644
--- a/src/fldeff_cut.c
+++ b/src/fldeff_cut.c
@@ -160,37 +160,37 @@ void sub_80A27A8(s16 x, s16 y)
switch(metatileId)
{
- case 0x208:
- case 0x15:
- case 0xD:
- MapGridSetMetatileIdAt(x, y, 0x1);
- break;
- case 0x1C6:
- MapGridSetMetatileIdAt(x, y, 0x1CE);
- break;
- case 0x1C7:
- MapGridSetMetatileIdAt(x, y, 0x1CF);
- break;
- case 0x281:
- MapGridSetMetatileIdAt(x, y, 0x279);
- break;
- case 0x282:
- MapGridSetMetatileIdAt(x, y, 0x27A);
- break;
- case 0x283:
- MapGridSetMetatileIdAt(x, y, 0x27B);
- break;
- case 0x206:
- case 0x207:
- MapGridSetMetatileIdAt(x, y, 0x271);
- break;
- case 0x212:
- case 0x20A:
- MapGridSetMetatileIdAt(x, y, 0x218);
- break;
- case 0x25:
- MapGridSetMetatileIdAt(x, y, 0xE);
- break;
+ case 0x208:
+ case 0x15:
+ case 0xD:
+ MapGridSetMetatileIdAt(x, y, 0x1);
+ break;
+ case 0x1C6:
+ MapGridSetMetatileIdAt(x, y, 0x1CE);
+ break;
+ case 0x1C7:
+ MapGridSetMetatileIdAt(x, y, 0x1CF);
+ break;
+ case 0x281:
+ MapGridSetMetatileIdAt(x, y, 0x279);
+ break;
+ case 0x282:
+ MapGridSetMetatileIdAt(x, y, 0x27A);
+ break;
+ case 0x283:
+ MapGridSetMetatileIdAt(x, y, 0x27B);
+ break;
+ case 0x206:
+ case 0x207:
+ MapGridSetMetatileIdAt(x, y, 0x271);
+ break;
+ case 0x212:
+ case 0x20A:
+ MapGridSetMetatileIdAt(x, y, 0x218);
+ break;
+ case 0x25:
+ MapGridSetMetatileIdAt(x, y, 0xE);
+ break;
}
}
@@ -223,18 +223,18 @@ void sub_80A28F4(s16 x, s16 y)
{
switch((u8)sub_80A28A0(currentXsigned, y + 1))
{
- case 1:
- MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x208);
- break;
- case 2:
- MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x281);
- break;
- case 3:
- MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x282);
- break;
- case 4:
- MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x283);
- break;
+ case 1:
+ MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x208);
+ break;
+ case 2:
+ MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x281);
+ break;
+ case 3:
+ MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x282);
+ break;
+ case 4:
+ MapGridSetMetatileIdAt(currentXsigned, y + 1, 0x283);
+ break;
}
}
if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY) == 1)
diff --git a/src/intro.c b/src/intro.c
index ea6edba3d..ba2197ae7 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -2,6 +2,7 @@
#include "gba/m4a_internal.h"
#include "intro.h"
#include "asm.h"
+#include "data2.h"
#include "decompress.h"
#include "libgncmultiboot.h"
#include "link.h"
@@ -19,15 +20,8 @@
#include "trig.h"
extern void *species_and_otid_get_pal(/*TODO: arg types*/);
-extern void sub_8143648(int, u8);
extern void sub_8143680(int, u8);
-struct MonCoords
-{
- u8 x, y;
-};
-
-
extern struct SpriteTemplate gUnknown_02024E8C;
extern u16 gUnknown_02039318;
extern u16 gUnknown_0203931A;
@@ -37,13 +31,6 @@ extern u32 gIntroFrameCounter;
extern struct GcmbStruct gMultibootProgramStruct;
extern u16 gSaveFileStatus;
extern u8 gReservedSpritePaletteCount;
-extern struct SpriteSheet gMonFrontPicTable[];
-extern struct MonCoords gMonFrontPicCoords[];
-extern struct SpriteSheet gMonBackPicTable[];
-extern struct MonCoords gMonBackPicCoords[];
-extern struct SpriteSheet gTrainerBackPicTable[];
-extern struct MonCoords gTrainerBackPicCoords[];
-extern struct SpritePalette gTrainerBackPicPaletteTable[];
extern const u8 gInterfaceGfx_PokeBall[];
extern const u16 gInterfacePal_PokeBall[];
extern const struct SpriteSheet gIntro2BrendanSpriteSheet;
@@ -57,7 +44,6 @@ extern const u16 gIntroCopyright_Pal[];
extern const u16 gIntroCopyright_Tilemap[];
extern const u16 gUnknown_08393E64[];
extern void *const gUnknown_0840B5A0[];
-extern const s16 gSineTable[];
//--------------------------------------------------
// Graphics Data
@@ -852,14 +838,14 @@ static void MainCB2_EndIntro(void)
SetMainCallback2(CB2_InitTitleScreen);
}
-static void LoadCopyrightGraphics(u16 a1, u16 a2, u16 a3)
+static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 paletteAddress)
{
- LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + a1));
- LoadPalette(gIntroCopyright_Pal, a3, 0x20);
- CpuCopy16(gIntroCopyright_Tilemap, (void *)(VRAM + a2), 0x500);
+ LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress));
+ LoadPalette(gIntroCopyright_Pal, paletteAddress, 0x20);
+ CpuCopy16(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress), 0x500);
}
-static void SerialCb_CopyrightScreen(void)
+static void SerialCB_CopyrightScreen(void)
{
GameCubeMultiBoot_HandleSerialInterrupt(&gMultibootProgramStruct);
}
@@ -883,7 +869,7 @@ static u8 SetUpCopyrightScreen(void)
DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
ResetPaletteFade();
- LoadCopyrightGraphics(0, 14336, 0);
+ LoadCopyrightGraphics(0, 0x3800, 0);
remove_some_task();
ResetTasks();
ResetSpriteData();
@@ -901,7 +887,7 @@ static u8 SetUpCopyrightScreen(void)
REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
SetVBlankCallback(VBlankCB_Intro);
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON;
- SetSerialCallback(SerialCb_CopyrightScreen);
+ SetSerialCallback(SerialCB_CopyrightScreen);
GameCubeMultiBoot_Init(&gMultibootProgramStruct);
default:
UpdatePaletteFade();
@@ -912,7 +898,7 @@ static u8 SetUpCopyrightScreen(void)
GameCubeMultiBoot_Main(&gMultibootProgramStruct);
if (gMultibootProgramStruct.gcmb_field_2 != 1)
{
- BeginNormalPaletteFade(0xFFFFFFFFu, 0, 0, 0x10, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
gMain.state++;
}
break;
@@ -936,7 +922,7 @@ static u8 SetUpCopyrightScreen(void)
return 1;
}
-void c2_copyright_1(void)
+void CB2_InitCopyrightScreenAfterBootup(void)
{
if (!SetUpCopyrightScreen())
{
@@ -949,7 +935,7 @@ void c2_copyright_1(void)
}
}
-void CB2_InitCopyrightScreen(void)
+void CB2_InitCopyrightScreenAfterTitleScreen(void)
{
SetUpCopyrightScreen();
}
@@ -1798,9 +1784,9 @@ static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front)
u8 spriteId;
if (front)
- LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].x, gMonFrontPicCoords[species].y, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1);
+ LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1);
else
- LoadSpecialPokePic(&gMonBackPicTable[species], gMonBackPicCoords[species].x, gMonBackPicCoords[species].y, 0x2000000, gUnknown_0840B5A0[d], species, 0, 0);
+ LoadSpecialPokePic(&gMonBackPicTable[species], gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, 0x2000000, gUnknown_0840B5A0[d], species, 0, 0);
pal = species_and_otid_get_pal(species, 0, 0xFFFF);
LoadCompressedPalette(pal, 0x100 + d * 0x10, 0x20);
sub_8143648(d, d);
@@ -1814,7 +1800,7 @@ static u8 sub_813CFA8(u16 a, u16 b, u16 c, u16 d)
{
u8 spriteId;
- DecompressPicFromTable_2(&gTrainerBackPicTable[a], gTrainerBackPicCoords[a].x, gTrainerBackPicCoords[a].y, (void *)0x2000000, gUnknown_0840B5A0[d], a);
+ DecompressPicFromTable_2(&gTrainerBackPicTable[a], gTrainerBackPicCoords[a].coords, gTrainerBackPicCoords[a].y_offset, (void *)0x2000000, gUnknown_0840B5A0[d], a);
LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + d * 0x10, 0x20);
sub_8143680(d, d);
gUnknown_02024E8C.anims = gUnknown_0840B064;
@@ -2085,29 +2071,29 @@ static void sub_813D788(struct Sprite *sprite)
{
switch (sprite->data0)
{
- case 0:
- StartSpriteAnimIfDifferent(sprite, 0);
- sprite->pos1.x--;
- break;
- case 1:
- StartSpriteAnimIfDifferent(sprite, 0);
- if (gIntroFrameCounter & 7)
- return;
+ case 0:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ sprite->pos1.x--;
+ break;
+ case 1:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if (gIntroFrameCounter & 7)
+ return;
+ sprite->pos1.x++;
+ break;
+ case 2:
+ StartSpriteAnimIfDifferent(sprite, 2);
+ if (sprite->pos1.x <= 120 || (gIntroFrameCounter & 7))
sprite->pos1.x++;
- break;
- case 2:
- StartSpriteAnimIfDifferent(sprite, 2);
- if (sprite->pos1.x <= 120 || (gIntroFrameCounter & 7))
- sprite->pos1.x++;
- break;
- case 3:
- StartSpriteAnimIfDifferent(sprite, 3);
- break;
- case 4:
- StartSpriteAnimIfDifferent(sprite, 0);
- if (sprite->pos1.x > -32)
- sprite->pos1.x -= 2;
- break;
+ break;
+ case 3:
+ StartSpriteAnimIfDifferent(sprite, 3);
+ break;
+ case 4:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if (sprite->pos1.x > -32)
+ sprite->pos1.x -= 2;
+ break;
}
if (gIntroFrameCounter & 7)
return;
@@ -2119,16 +2105,16 @@ static void sub_813D788(struct Sprite *sprite)
{
switch (Random() & 3)
{
- case 0:
- sprite->pos2.y = -1;
- break;
- case 1:
- sprite->pos2.y = 1;
- break;
- case 2:
- case 3:
- sprite->pos2.y = 0;
- break;
+ case 0:
+ sprite->pos2.y = -1;
+ break;
+ case 1:
+ sprite->pos2.y = 1;
+ break;
+ case 2:
+ case 3:
+ sprite->pos2.y = 0;
+ break;
}
}
}
@@ -2137,24 +2123,24 @@ static void sub_813D880(struct Sprite *sprite)
{
switch (sprite->data0)
{
- case 0:
- break;
- case 1:
- if (sprite->pos2.x + sprite->pos1.x < 304)
- sprite->pos2.x += 8;
- else
- sprite->data0 = 2;
- break;
- case 2:
- if (sprite->pos2.x + sprite->pos1.x > 120)
- sprite->pos2.x -= 1;
- else
- sprite->data0 = 3;
- break;
- case 3:
- if (sprite->pos2.x > 0)
- sprite->pos2.x -= 2;
- break;
+ case 0:
+ break;
+ case 1:
+ if (sprite->pos2.x + sprite->pos1.x < 304)
+ sprite->pos2.x += 8;
+ else
+ sprite->data0 = 2;
+ break;
+ case 2:
+ if (sprite->pos2.x + sprite->pos1.x > 120)
+ sprite->pos2.x -= 1;
+ else
+ sprite->data0 = 3;
+ break;
+ case 3:
+ if (sprite->pos2.x > 0)
+ sprite->pos2.x -= 2;
+ break;
}
sprite->pos2.y = Sin((u8)sprite->data1, 8) - gUnknown_0203935A;
sprite->data1 += 4;
diff --git a/src/item.c b/src/item.c
index 656563ad4..ad2b9aed3 100644
--- a/src/item.c
+++ b/src/item.c
@@ -1,30 +1,11 @@
#include "global.h"
#include "item.h"
#include "string_util.h"
+#include "strings.h"
extern struct Berry *GetBerryInfo(u8 berry);
-extern u8 gOtherText_Berry2[];
extern u8 gUnknown_02038560;
-
-struct Item
-{
- u8 name[14];
- u16 itemId;
- u16 price;
- u8 holdEffect;
- u8 holdEffectParam;
- u8 *description;
- u8 importance;
- u8 unk19;
- u8 pocket;
- u8 type;
- ItemUseFunc fieldUseFunc;
- u8 battleUsage;
- ItemUseFunc battleUseFunc;
- u8 secondaryId;
-};
-
extern struct Item gItems[];
struct BagPocket
diff --git a/src/item_use.c b/src/item_use.c
index 4047ade5c..d1c1dbf2a 100644
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -3,6 +3,7 @@
#include "battle.h"
#include "berry.h"
#include "coins.h"
+#include "data2.h"
#include "event_data.h"
#include "field_map_obj_helpers.h"
#include "field_player_avatar.h"
@@ -22,6 +23,7 @@
#include "songs.h"
#include "sound.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
#include "vars.h"
@@ -29,8 +31,6 @@ extern void (* gUnknown_03005D00)(u8);
extern void (* gUnknown_0300485C)(void);
extern void (* gUnknown_03004AE4)(u8);
-extern u8 gMoveNames[][13];
-
extern u8 gUnknown_02038561;
extern u8 gLastFieldPokeMenuOpened;
extern u8 gUnknown_02024E6C;
@@ -74,23 +74,6 @@ extern u8 GetItemEffectType();
extern void sub_808B020(void);
extern void sub_810B96C(void);
-extern u8 gOtherText_DadsAdvice[];
-extern u8 gOtherText_CantGetOffBike[];
-extern u8 gOtherText_NoResponse[];
-extern u8 gOtherText_ItemfinderResponding[];
-extern u8 gOtherText_ItemfinderItemUnderfoot[];
-extern u8 gOtherText_Coins3[];
-extern u8 gOtherText_BootedHM[];
-extern u8 gOtherText_BootedTM[];
-extern u8 gOtherText_ContainsMove[];
-extern u8 gOtherText_UsedItem[];
-extern u8 gOtherText_RepelLingers[];
-extern u8 gOtherText_UsedFlute[];
-extern u8 gOtherText_UsedRepel[];
-extern u8 gOtherText_BoxIsFull[];
-extern u8 gOtherText_WontHaveAnyEffect[];
-extern u8 gOtherText_SnapConfusion[];
-
extern u16 gScriptItemId;
extern u16 gBattleTypeFlags;
@@ -180,13 +163,13 @@ void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text)
switch (playerMenuStatus)
{
- case 0: // Item Menu
- MenuZeroFillWindowRect(0, 13, 13, 20);
- DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1);
- break;
- default: // Field
- DisplayItemMessageOnField(var1, gStringVar4, CleanUpOverworldMessage, 0);
- break;
+ case 0: // Item Menu
+ MenuZeroFillWindowRect(0, 13, 13, 20);
+ DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1);
+ break;
+ default: // Field
+ DisplayItemMessageOnField(var1, gStringVar4, CleanUpOverworldMessage, 0);
+ break;
}
}
@@ -439,33 +422,33 @@ bool8 sub_80C9688(struct MapConnection *connection, int x, int y)
switch(connection->direction)
{
- // same weird temp variable behavior seen in HiddenItemAtPos
- case 2:
- localOffset = connection->offset + 7;
- localX = x - localOffset;
- localLength = mapHeader->mapData->height - 7;
- localY = localLength + y; // additions are reversed for some reason
- break;
- case 1:
- localOffset = connection->offset + 7;
- localX = x - localOffset;
- localLength = gMapHeader.mapData->height + 7;
- localY = y - localLength;
- break;
- case 3:
- localLength = mapHeader->mapData->width - 7;
- localX = localLength + x; // additions are reversed for some reason
- localOffset = connection->offset + 7;
- localY = y - localOffset;
- break;
- case 4:
- localLength = gMapHeader.mapData->width + 7;
- localX = x - localLength;
- localOffset = connection->offset + 7;
- localY = y - localOffset;
- break;
- default:
- return FALSE;
+ // same weird temp variable behavior seen in HiddenItemAtPos
+ case 2:
+ localOffset = connection->offset + 7;
+ localX = x - localOffset;
+ localLength = mapHeader->mapData->height - 7;
+ localY = localLength + y; // additions are reversed for some reason
+ break;
+ case 1:
+ localOffset = connection->offset + 7;
+ localX = x - localOffset;
+ localLength = gMapHeader.mapData->height + 7;
+ localY = y - localLength;
+ break;
+ case 3:
+ localLength = mapHeader->mapData->width - 7;
+ localX = localLength + x; // additions are reversed for some reason
+ localOffset = connection->offset + 7;
+ localY = y - localOffset;
+ break;
+ case 4:
+ localLength = gMapHeader.mapData->width + 7;
+ localX = x - localLength;
+ localOffset = connection->offset + 7;
+ localY = y - localOffset;
+ break;
+ default:
+ return FALSE;
}
return HiddenItemAtPos(mapHeader->events, localX, localY);
}
@@ -1188,42 +1171,42 @@ void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
{
switch(GetItemEffectType(gScriptItemId) - 1)
{
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 10:
- case 11:
- case 12:
- case 13:
- case 14:
- case 15:
- case 16:
- gTasks[taskId].data[15] = 1;
- ItemUseOutOfBattle_Medicine(taskId);
- break;
- case 9:
- gTasks[taskId].data[15] = 1;
- ItemUseOutOfBattle_SacredAsh(taskId);
- break;
- case 0:
- gTasks[taskId].data[15] = 1;
- ItemUseOutOfBattle_RareCandy(taskId);
- break;
- case 18:
- case 19:
- gTasks[taskId].data[15] = 1;
- ItemUseOutOfBattle_PPUp(taskId);
- break;
- case 20:
- gTasks[taskId].data[15] = 1;
- ItemUseOutOfBattle_PPRecovery(taskId);
- break;
- default:
- gTasks[taskId].data[15] = 4;
- ItemUseOutOfBattle_CannotUse(taskId);
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ gTasks[taskId].data[15] = 1;
+ ItemUseOutOfBattle_Medicine(taskId);
+ break;
+ case 9:
+ gTasks[taskId].data[15] = 1;
+ ItemUseOutOfBattle_SacredAsh(taskId);
+ break;
+ case 0:
+ gTasks[taskId].data[15] = 1;
+ ItemUseOutOfBattle_RareCandy(taskId);
+ break;
+ case 18:
+ case 19:
+ gTasks[taskId].data[15] = 1;
+ ItemUseOutOfBattle_PPUp(taskId);
+ break;
+ case 20:
+ gTasks[taskId].data[15] = 1;
+ ItemUseOutOfBattle_PPRecovery(taskId);
+ break;
+ default:
+ gTasks[taskId].data[15] = 4;
+ ItemUseOutOfBattle_CannotUse(taskId);
}
}
@@ -1231,25 +1214,25 @@ void ItemUseInBattle_EnigmaBerry(u8 taskId)
{
switch(GetItemEffectType(gScriptItemId))
{
- case 0:
- ItemUseInBattle_StatIncrease(taskId);
- break;
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 11:
- ItemUseInBattle_Medicine(taskId);
- break;
- case 21:
- ItemUseInBattle_PPRecovery(taskId);
- break;
- default:
- ItemUseOutOfBattle_CannotUse(taskId);
+ case 0:
+ ItemUseInBattle_StatIncrease(taskId);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 11:
+ ItemUseInBattle_Medicine(taskId);
+ break;
+ case 21:
+ ItemUseInBattle_PPRecovery(taskId);
+ break;
+ default:
+ ItemUseOutOfBattle_CannotUse(taskId);
}
}
diff --git a/src/link.c b/src/link.c
index 224c0ae1c..17e78e0a5 100644
--- a/src/link.c
+++ b/src/link.c
@@ -10,6 +10,7 @@
#include "songs.h"
#include "sound.h"
#include "sprite.h"
+#include "strings2.h"
#include "task.h"
#include "text.h"
@@ -39,8 +40,6 @@ extern u16 gScriptItemId;
extern u16 word_3004858;
-extern u8 gMultiText_LinkError[];
-
static void InitLinkTestBG(u8, u8, u8, u8);
void InitLinkTestBG_Unused(u8, u8, u8, u8);
void LinkTestScreen();
@@ -643,7 +642,7 @@ static void BuildSendCmd(u16 code)
gSendCmd[0] = 0x5FFF;
break;
case 0xCAFE:
- if (!word_3004858 || gUnknown_3001764)
+ if (!word_3004858 || gLinkTransferringData)
break;
gSendCmd[0] = 0xCAFE;
gSendCmd[1] = word_3004858;
diff --git a/src/mail.c b/src/mail.c
index 807864332..4ec107011 100644
--- a/src/mail.c
+++ b/src/mail.c
@@ -8,6 +8,7 @@
#include "rom4.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings2.h"
#include "task.h"
#include "text.h"
@@ -70,8 +71,6 @@ extern u16 gUnknown_083E562C[][2];
extern struct MailLayout gUnknown_083E5730[];
extern struct MailLayout gUnknown_083E57A4[];
-extern u8 gOtherText_From[];
-
static u8 sub_80F8A28(void);
static void sub_80F8D50(void);
static void sub_80F8DA0(void);
diff --git a/src/main.c b/src/main.c
index 114fc171f..19891459c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -60,7 +60,7 @@ const IntrFunc gIntrTableTemplate[] =
#define INTR_COUNT ((int)(sizeof(gIntrTableTemplate)/sizeof(IntrFunc)))
u16 gKeyRepeatStartDelay;
-u8 gUnknown_3001764;
+bool8 gLinkTransferringData;
struct Main gMain;
u16 gKeyRepeatContinueDelay;
u8 gSoftResetDisabled;
@@ -99,7 +99,7 @@ void AgbMain()
if (gFlashMemoryPresent != TRUE)
SetMainCallback2(NULL);
- gUnknown_3001764 = 0;
+ gLinkTransferringData = FALSE;
for (;;)
{
@@ -112,13 +112,13 @@ void AgbMain()
if (gLink.sendQueue.count > 1 && sub_8055910() == 1)
{
- gUnknown_3001764 = 1;
+ gLinkTransferringData = TRUE;
UpdateLinkAndCallCallbacks();
- gUnknown_3001764 = 0;
+ gLinkTransferringData = FALSE;
}
else
{
- gUnknown_3001764 = 0;
+ gLinkTransferringData = FALSE;
UpdateLinkAndCallCallbacks();
if (gLink.recvQueue.count > 1)
@@ -126,9 +126,9 @@ void AgbMain()
if (sub_80558AC() == 1)
{
gMain.newKeys = 0;
- gUnknown_3001764 = 1;
+ gLinkTransferringData = TRUE;
UpdateLinkAndCallCallbacks();
- gUnknown_3001764 = 0;
+ gLinkTransferringData = FALSE;
}
}
}
@@ -152,7 +152,7 @@ static void InitMainCallbacks(void)
gMain.vblankCounter1 = 0;
gMain.vblankCounter2 = 0;
gMain.callback1 = NULL;
- SetMainCallback2(c2_copyright_1);
+ SetMainCallback2(CB2_InitCopyrightScreenAfterBootup);
}
static void CallCallbacks(void)
diff --git a/src/main_menu.c b/src/main_menu.c
index e825ae70e..ac26d604d 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "main_menu.h"
#include "asm.h"
+#include "data2.h"
#include "decompress.h"
#include "event_data.h"
#include "menu.h"
@@ -15,17 +16,13 @@
#include "sound.h"
#include "species.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
#include "text.h"
#include "title_screen.h"
#define BirchSpeechUpdateWindowText() ((u8)MenuUpdateWindowText_OverrideLineLength(24))
-struct MonCoords
-{
- u8 x, y;
-};
-
extern struct PaletteFadeControl gPaletteFade;
extern u16 gSaveFileStatus;
@@ -41,24 +38,8 @@ extern const u8 gBirchSpeech_WhatsYourName[];
extern u8 gBirchSpeech_SoItsPlayer[];
extern u8 gBirchSpeech_AhOkayYouArePlayer[];
extern u8 gBirchSpeech_AreYouReady[];
-extern u8 gSaveFileDeletedMessage[];
-extern u8 gSaveFileCorruptMessage[];
-extern u8 gBoardNotInstalledMessage[];
-extern u8 gBatteryDryMessage[];
-extern u8 gMainMenuString_Continue[];
-extern u8 gMainMenuString_NewGame[];
-extern u8 gMainMenuString_MysteryEvents[];
-extern u8 gMainMenuString_Option[];
-extern u8 gMainMenuString_Player[];
-extern u8 gMainMenuString_Time[];
-extern u8 gMainMenuString_Pokedex[];
-extern u8 gMainMenuString_Badges[];
-
-extern const struct MonCoords gMonFrontPicCoords[];
-extern const struct SpriteSheet gMonFrontPicTable[];
-extern const struct SpritePalette gMonPaletteTable[];
+
extern struct SpriteTemplate gUnknown_02024E8C;
-extern void * const gUnknown_081FAF4C[];
extern u16 gUnknown_081E795C[];
extern const struct MenuAction gUnknown_081E79B0[];
extern const struct MenuAction gMalePresetNames[];
@@ -68,7 +49,6 @@ extern const u8 gUnknown_081E764C[];
extern const u8 gBirchIntroShadowGfx[];
extern const u8 gUnknown_081E7834[];
extern const u8 gUnknown_081E796C[];
-extern const u8 gSystemText_NewPara[];
extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[];
@@ -115,7 +95,7 @@ static void Task_MainMenuProcessKeyInput(u8 taskId);
static void Task_MainMenuPressedA(u8 taskId);
static void Task_MainMenuPressedB(u8 taskId);
static void HighlightCurrentMenuItem(u8 layout, u8 menuItem);
-static void PrintMainMenuItem(u8 *text, u8 left, u8 top);
+static void PrintMainMenuItem(const u8 *text, u8 left, u8 top);
static void PrintSaveFileInfo(void);
static void PrintPlayerName(void);
static void PrintPlayTime(void);
@@ -657,7 +637,7 @@ void HighlightCurrentMenuItem(u8 layout, u8 menuItem)
}
}
-void PrintMainMenuItem(u8 *text, u8 left, u8 top)
+void PrintMainMenuItem(const u8 *text, u8 left, u8 top)
{
u8 i;
u8 buffer[32];
@@ -1412,8 +1392,8 @@ u8 CreateAzurillSprite(u8 x, u8 y)
{
DecompressPicFromTable_2(
&gMonFrontPicTable[SPECIES_AZURILL],
- gMonFrontPicCoords[SPECIES_AZURILL].x,
- gMonFrontPicCoords[SPECIES_AZURILL].y,
+ gMonFrontPicCoords[SPECIES_AZURILL].coords,
+ gMonFrontPicCoords[SPECIES_AZURILL].y_offset,
gUnknown_081FAF4C[0],
gUnknown_081FAF4C[1],
SPECIES_AZURILL);
@@ -1646,9 +1626,9 @@ static void SetPresetPlayerName(u8 index)
u8 *name;
if (gSaveBlock2.playerGender == MALE)
- name = gMalePresetNames[index].text;
+ name = (u8 *) gMalePresetNames[index].text;
else
- name = gFemalePresetNames[index].text;
+ name = (u8 *) gFemalePresetNames[index].text;
for (i = 0; i < 7; i++)
gSaveBlock2.playerName[i] = name[i];
diff --git a/src/matsuda_debug_menu.c b/src/matsuda_debug_menu.c
index d2ca754bb..018e36567 100644
--- a/src/matsuda_debug_menu.c
+++ b/src/matsuda_debug_menu.c
@@ -2,6 +2,7 @@
#include "matsuda_debug_menu.h"
#include "asm.h"
#include "contest.h"
+#include "data2.h"
#include "link.h"
#include "main.h"
#include "menu.h"
@@ -55,7 +56,6 @@ extern struct SpriteTemplate gSpriteTemplate_83C92CC;
extern void (*gUnknown_083C92E4[][2])(struct Sprite *, s8);
extern u32 gUnknown_083C9400[2];
-extern u8 gMoveNames[][13];
extern u8 gMatsudaDebugMenu_UnknownByteArray[];
extern u8* gMatsudaDebugMenuTextList1[];
@@ -528,41 +528,41 @@ void sub_80AA754(struct Sprite *sprite)
{
switch (gMain.newAndRepeatedKeys)
{
- case 0x10:
- case 0x20:
- sprite->data0 ^= 1;
- break;
- case 0x40:
- if (sprite->data1 == 0)
- sprite->data1 = 8;
- else
- sprite->data1--;
- break;
- case 0x80:
- if (sprite->data1 == 8)
- sprite->data1 = 0;
- else
- sprite->data1++;
- break;
- case 0x1:
- gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 1);
- sub_80AA614(sprite->data2, sprite->data3);
- break;
- case 0x2:
- gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -1);
- sub_80AA614(sprite->data2, sprite->data3);
- break;
- case 0x100:
- gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 10);
- sub_80AA614(sprite->data2, sprite->data3);
- break;
- case 0x200:
- gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -10);
- sub_80AA614(sprite->data2, sprite->data3);
- break;
- case 0x8:
- sub_80AAD08(sprite, 1);
- break;
+ case DPAD_RIGHT:
+ case DPAD_LEFT:
+ sprite->data0 ^= 1;
+ break;
+ case DPAD_UP:
+ if (sprite->data1 == 0)
+ sprite->data1 = 8;
+ else
+ sprite->data1--;
+ break;
+ case DPAD_DOWN:
+ if (sprite->data1 == 8)
+ sprite->data1 = 0;
+ else
+ sprite->data1++;
+ break;
+ case A_BUTTON:
+ gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 1);
+ sub_80AA614(sprite->data2, sprite->data3);
+ break;
+ case B_BUTTON:
+ gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -1);
+ sub_80AA614(sprite->data2, sprite->data3);
+ break;
+ case R_BUTTON:
+ gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 10);
+ sub_80AA614(sprite->data2, sprite->data3);
+ break;
+ case L_BUTTON:
+ gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -10);
+ sub_80AA614(sprite->data2, sprite->data3);
+ break;
+ case START_BUTTON:
+ sub_80AAD08(sprite, 1);
+ break;
}
sprite->pos1.x = gUnknown_083C9296[sprite->data0 + sprite->data1 * 2];
sprite->pos1.y = gUnknown_083C92A8[sprite->data1];
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
index 11dadf380..d6fb33917 100644
--- a/src/mauville_old_man.c
+++ b/src/mauville_old_man.c
@@ -4,6 +4,7 @@
#include "rng.h"
#include "script.h"
#include "string_util.h"
+#include "strings.h"
extern u16 gScriptResult;
extern u16 gSpecialVar_0x8004;
@@ -14,8 +15,6 @@ extern void sub_80F83D0(void);
extern void sub_80F7F80(u8);
extern u16 sub_80EB8EC(void);
extern void sub_80F7DC0(void);
-extern u8 gOtherText_Is[];
-extern u8 gOtherText_DontYouAgree[];
extern u32 gUnknown_083E5388[];
extern u32 gUnknown_083E53A8[];
@@ -65,21 +64,21 @@ void SetMauvilleOldMan(void)
switch(var)
{
- case 0:
- sub_80F7A34();
- break;
- case 1:
- sub_80F7A6C();
- break;
- case 2:
- sub_80F7A98();
- break;
- case 3:
- sub_80F7A7C();
- break;
- case 4:
- sub_80F7A88();
- break;
+ case 0:
+ sub_80F7A34();
+ break;
+ case 1:
+ sub_80F7A6C();
+ break;
+ case 2:
+ sub_80F7A98();
+ break;
+ case 3:
+ sub_80F7A7C();
+ break;
+ case 4:
+ sub_80F7A88();
+ break;
}
sub_80F83D0();
}
diff --git a/src/menu.c b/src/menu.c
index d11c45c6f..c851662dd 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -6,6 +6,7 @@
#include "script.h"
#include "songs.h"
#include "sound.h"
+#include "strings.h"
#include "text.h"
#include "text_window.h"
@@ -22,9 +23,6 @@ struct Menu
u8 columnXCoords[8];
};
-extern u8 OtherText_Yes[];
-extern u8 OtherText_No[];
-
static void MultistepInitMenuWindowInternal(const struct WindowConfig *, u16);
static void InitMenuWindowInternal(const struct WindowConfig *, u16);
static bool8 sub_80723D4(void);
@@ -175,7 +173,7 @@ void MenuDrawTextWindow(u8 left, u8 top, u8 right, u8 bottom)
DrawTextWindow(gMenuWindowPtr, left, top, right, bottom);
}
-void sub_8071F40(u8 *str)
+void sub_8071F40(const u8 *str)
{
MenuDrawTextWindow(2, 14, 28, 19);
MenuPrint(str, 3, 15);
@@ -598,12 +596,12 @@ s8 ProcessMenuInputNoWrap_(void)
return ProcessMenuInputNoWrap();
}
-u8 MenuPrint_PixelCoords(u8 *text, u8 left, u16 top, u8 a4)
+u8 MenuPrint_PixelCoords(const u8 *text, u8 left, u16 top, u8 a4)
{
return sub_8004D04(gMenuWindowPtr, text, gMenuTextTileOffset, left, top, a4);
}
-u8 sub_8072A18(u8 *text, u8 left, u16 top, u8 width, u32 a5)
+u8 sub_8072A18(const u8 *text, u8 left, u16 top, u8 width, u32 a5)
{
return sub_8004FD0(gMenuWindowPtr, 0, text, gMenuTextTileOffset, left, top, width, a5);
}
@@ -639,7 +637,7 @@ void sub_8072B80(u8 *a1, u8 a2, u8 a3, u8 *a4)
sub_8003460(gMenuWindowPtr, buffer, gMenuTextTileOffset, a2, a3);
}
-void sub_8072BD8(u8 *a1, u8 a2, u8 a3, u16 a4)
+void sub_8072BD8(const u8 *a1, u8 a2, u8 a3, u16 a4)
{
sub_8004DB0(gMenuWindowPtr, a1, gMenuTextTileOffset, a2, a3, a4);
}
@@ -659,7 +657,7 @@ u8 *sub_8072C74(u8 *a1, const u8 *a2, u8 a3, u8 a4)
return AlignString(gMenuWindowPtr, a1, a2, a3, a4);
}
-u8 sub_8072CA4(u8 *str)
+u8 sub_8072CA4(const u8 *str)
{
return GetStringWidth(gMenuWindowPtr, str);
}
diff --git a/src/mori_debug_menu.c b/src/mori_debug_menu.c
index 9f586dcb9..18c65b7e6 100644
--- a/src/mori_debug_menu.c
+++ b/src/mori_debug_menu.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "mori_debug_menu.h"
#include "asm.h"
+#include "data2.h"
#include "link.h"
#include "main.h"
#include "menu.h"
@@ -20,8 +21,6 @@ extern u8 gUnknown_0839B257[];
extern const struct MenuAction gMoriDebugMenuActions[];
-extern u8 gSpeciesNames[][11];
-
void unref_sub_8083CF0(void)
{
int i;
@@ -65,7 +64,7 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr)
s8 MoriDebugMenu_Egg(void)
{
- if ( daycare_count_pokemon(gSaveBlock1.filler_2F9C) == 2 && daycare_relationship_score_from_savegame() )
+ if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() )
sub_8041940();
CloseMenu();
@@ -74,7 +73,7 @@ s8 MoriDebugMenu_Egg(void)
s8 MoriDebugMenu_MaleEgg(void)
{
- if ( daycare_count_pokemon(gSaveBlock1.filler_2F9C) == 2 && daycare_relationship_score_from_savegame() )
+ if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() )
sub_8041950();
CloseMenu();
diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c
index 97deb348c..77c959b07 100644
--- a/src/mystery_event_menu.c
+++ b/src/mystery_event_menu.c
@@ -10,19 +10,13 @@
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings2.h"
#include "task.h"
#include "text.h"
extern u8 unk_2000000[];
extern u8 gUnknown_02039338;
-extern u8 gSystemText_LinkStandby[];
-extern u8 gSystemText_LoadEventPressA[];
-extern u8 gSystemText_LoadingEvent[];
-extern u8 gSystemText_DontCutLink[];
-extern u8 gSystemText_EventLoadSuccess[];
-extern u8 gSystemText_LoadingError[];
-
static void VBlankCB(void);
static bool8 CheckLanguageMatch(void);
static bool8 GetEventLoadMessage(u8 *dest, u32 status);
@@ -91,240 +85,240 @@ static void CB2_MysteryEventMenu(void)
switch (gMain.state)
{
- case 0:
- MenuDrawTextWindow(0, 14, 29, 19);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
- gMain.state++;
+ case 0:
+ MenuDrawTextWindow(0, 14, 29, 19);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+ gMain.state++;
+ break;
+ case 1:
+ if (gPaletteFade.active)
break;
- case 1:
- if (gPaletteFade.active)
- break;
- sub_8072044(gSystemText_LinkStandby);
+ sub_8072044(gSystemText_LinkStandby);
+ gMain.state++;
+ break;
+ case 2:
+ if (MenuUpdateWindowText())
+ {
gMain.state++;
- break;
- case 2:
- if (MenuUpdateWindowText())
- {
- gMain.state++;
- gLinkType = 21761;
- OpenLink();
- }
- break;
- case 3:
- if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4)
- {
- PlaySE(SE_PIN);
- sub_8072044(gSystemText_LoadEventPressA);
- gMain.state++;
- }
- if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- CloseLink();
- gMain.state = 15;
- }
- break;
- case 4:
- if (MenuUpdateWindowText())
- gMain.state++;
- break;
+ gLinkType = 21761;
+ OpenLink();
+ }
+ break;
+ case 3:
+ if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4)
+ {
+ PlaySE(SE_PIN);
+ sub_8072044(gSystemText_LoadEventPressA);
+ gMain.state++;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
+ }
+ break;
+ case 4:
+ if (MenuUpdateWindowText())
+ gMain.state++;
+ break;
#ifdef NONMATCHING
- case 5:
- if (GetLinkPlayerCount_2() != 2)
+ case 5:
+ if (GetLinkPlayerCount_2() != 2)
+ {
+ GetEventLoadMessage(gStringVar4, 1);
+ sub_8072044(gStringVar4);
+ gMain.state = 13;
+ break;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_8007F4C();
+ MenuDrawTextWindow(6, 5, 23, 8);
+ MenuPrint(gSystemText_LoadingEvent, 7, 6);
+ gMain.state++;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
+ }
+ break;
+ case 6:
+ if (IsLinkConnectionEstablished())
+ {
+ if (!gReceivedRemoteLinkPlayers)
+ break;
+
+ if (GetLinkPlayerDataExchangeStatusTimed() == 3)
{
+ sub_800832C();
+ MenuZeroFillWindowRect(6, 5, 23, 8);
GetEventLoadMessage(gStringVar4, 1);
sub_8072044(gStringVar4);
gMain.state = 13;
break;
}
- if (gMain.newKeys & A_BUTTON)
+ else if (CheckLanguageMatch())
{
- PlaySE(SE_SELECT);
- sub_8007F4C();
- MenuDrawTextWindow(6, 5, 23, 8);
- MenuPrint(gSystemText_LoadingEvent, 7, 6);
+ sub_8072044(gSystemText_DontCutLink);
gMain.state++;
+ break;
}
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- CloseLink();
- gMain.state = 15;
- }
- break;
- case 6:
- if (IsLinkConnectionEstablished())
- {
- if (!gReceivedRemoteLinkPlayers)
- break;
-
- if (GetLinkPlayerDataExchangeStatusTimed() == 3)
- {
- sub_800832C();
- MenuZeroFillWindowRect(6, 5, 23, 8);
- GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
- gMain.state = 13;
- break;
- }
- else if (CheckLanguageMatch())
- {
- sub_8072044(gSystemText_DontCutLink);
- gMain.state++;
- break;
- }
- else
- {
- CloseLink();
- MenuZeroFillWindowRect(6, 5, 23, 8);
- GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
- gMain.state = 13;
- break;
- }
- }
- if (gMain.newKeys & B_BUTTON)
+ else
{
- PlaySE(SE_SELECT);
CloseLink();
- gMain.state = 15;
+ MenuZeroFillWindowRect(6, 5, 23, 8);
+ GetEventLoadMessage(gStringVar4, 1);
+ sub_8072044(gStringVar4);
+ gMain.state = 13;
break;
}
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
break;
+ }
+ break;
#else
- case 5:
- if (GetLinkPlayerCount_2() != 2)
- {
- goto label;
- }
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- sub_8007F4C();
- MenuDrawTextWindow(6, 5, 23, 8);
- MenuPrint(gSystemText_LoadingEvent, 7, 6);
- gMain.state++;
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(SE_SELECT);
- CloseLink();
- gMain.state = 15;
- }
- break;
- case 6:
- if (IsLinkConnectionEstablished())
- {
- register u8 *ptr asm("r0");
- register u32 offset1 asm("r2");
- register u32 offset2 asm("r1");
-
- if (!gReceivedRemoteLinkPlayers)
- break;
+ case 5:
+ if (GetLinkPlayerCount_2() != 2)
+ {
+ goto label;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_8007F4C();
+ MenuDrawTextWindow(6, 5, 23, 8);
+ MenuPrint(gSystemText_LoadingEvent, 7, 6);
+ gMain.state++;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
+ }
+ break;
+ case 6:
+ if (IsLinkConnectionEstablished())
+ {
+ register u8 *ptr asm("r0");
+ register u32 offset1 asm("r2");
+ register u32 offset2 asm("r1");
- if (GetLinkPlayerDataExchangeStatusTimed() == 3)
- {
- sub_800832C();
- MenuZeroFillWindowRect(6, 5, 23, 8);
- GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
- ptr = (u8 *)&gMain;
- offset1 = offsetof(struct Main, state);
- asm("" ::: "r1");
- ptr += offset1;
- *ptr = 13;
- }
- else if (CheckLanguageMatch())
- {
- register u8 *ptr2 asm("r1");
- register int offset3 asm("r0");
- register int dummy asm("r2");
- sub_8072044(gSystemText_DontCutLink);
- ptr2 = (u8 *)&gMain;
- offset3 = offsetof(struct Main, state);
- if (dummy)
- dummy++;
- ptr2 += offset3;
- (*ptr2)++;
- break;
- }
- else
- {
- CloseLink();
- MenuZeroFillWindowRect(6, 5, 23, 8);
- label:
- GetEventLoadMessage(gStringVar4, 1);
- sub_8072044(gStringVar4);
- ptr = (u8 *)&gMain;
- offset2 = offsetof(struct Main, state);
- ptr += offset2;
- *ptr = 13;
- }
+ if (!gReceivedRemoteLinkPlayers)
break;
+
+ if (GetLinkPlayerDataExchangeStatusTimed() == 3)
+ {
+ sub_800832C();
+ MenuZeroFillWindowRect(6, 5, 23, 8);
+ GetEventLoadMessage(gStringVar4, 1);
+ sub_8072044(gStringVar4);
+ ptr = (u8 *)&gMain;
+ offset1 = offsetof(struct Main, state);
+ asm("" ::: "r1");
+ ptr += offset1;
+ *ptr = 13;
}
- if (gMain.newKeys & B_BUTTON)
+ else if (CheckLanguageMatch())
{
- PlaySE(SE_SELECT);
- CloseLink();
- gMain.state = 15;
+ register u8 *ptr2 asm("r1");
+ register int offset3 asm("r0");
+ register int dummy asm("r2");
+ sub_8072044(gSystemText_DontCutLink);
+ ptr2 = (u8 *)&gMain;
+ offset3 = offsetof(struct Main, state);
+ if (dummy)
+ dummy++;
+ ptr2 += offset3;
+ (*ptr2)++;
break;
}
- break;
-#endif
- case 7:
- if (MenuUpdateWindowText())
- gMain.state++;
- break;
- case 8:
- if (GetBlockReceivedStatus())
+ else
{
- ResetBlockReceivedFlags();
- gMain.state++;
+ CloseLink();
+ MenuZeroFillWindowRect(6, 5, 23, 8);
+ label:
+ GetEventLoadMessage(gStringVar4, 1);
+ sub_8072044(gStringVar4);
+ ptr = (u8 *)&gMain;
+ offset2 = offsetof(struct Main, state);
+ ptr += offset2;
+ *ptr = 13;
}
break;
- case 9:
- gMain.state++;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ CloseLink();
+ gMain.state = 15;
break;
- case 10:
- sub_800832C();
+ }
+ break;
+#endif
+ case 7:
+ if (MenuUpdateWindowText())
gMain.state++;
- break;
- case 11:
- if (gReceivedRemoteLinkPlayers)
- break;
- unkVal = sub_812613C(unk_2000000);
- CpuFill32(0, unk_2000000, 0x7D4);
- if (!GetEventLoadMessage(gStringVar4, unkVal))
- TrySavingData(NORMAL_SAVE);
+ break;
+ case 8:
+ if (GetBlockReceivedStatus())
+ {
+ ResetBlockReceivedFlags();
gMain.state++;
+ }
+ break;
+ case 9:
+ gMain.state++;
+ break;
+ case 10:
+ sub_800832C();
+ gMain.state++;
+ break;
+ case 11:
+ if (gReceivedRemoteLinkPlayers)
break;
- case 12:
- sub_8072044(gStringVar4);
+ unkVal = sub_812613C(unk_2000000);
+ CpuFill32(0, unk_2000000, 0x7D4);
+ if (!GetEventLoadMessage(gStringVar4, unkVal))
+ TrySavingData(NORMAL_SAVE);
+ gMain.state++;
+ break;
+ case 12:
+ sub_8072044(gStringVar4);
+ gMain.state++;
+ break;
+ case 13:
+ MenuZeroFillWindowRect(6, 5, 23, 8);
+ if (MenuUpdateWindowText())
+ {
gMain.state++;
- break;
- case 13:
- MenuZeroFillWindowRect(6, 5, 23, 8);
- if (MenuUpdateWindowText())
- {
- gMain.state++;
- gUnknown_02039338 = 0;
- }
- break;
- case 14:
- if (gMain.newKeys & A_BUTTON)
- {
- PlaySE(SE_SELECT);
- gMain.state++;
- }
- break;
- case 15:
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gUnknown_02039338 = 0;
+ }
+ break;
+ case 14:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
gMain.state++;
- break;
- case 16:
- if (!gPaletteFade.active)
- DoSoftReset();
- break;
+ }
+ break;
+ case 15:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ gMain.state++;
+ break;
+ case 16:
+ if (!gPaletteFade.active)
+ DoSoftReset();
+ break;
}
if (gLinkStatus & 0x40)
diff --git a/src/naming_screen.c b/src/naming_screen.c
index b14c690e2..53ee5ff19 100644
--- a/src/naming_screen.c
+++ b/src/naming_screen.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "naming_screen.h"
#include "asm.h"
+#include "data2.h"
#include "main.h"
#include "menu.h"
#include "palette.h"
@@ -8,6 +9,7 @@
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings2.h"
#include "task.h"
#include "text.h"
#include "trig.h"
@@ -48,7 +50,6 @@ extern const struct SpriteTemplate gSpriteTemplate_83CE670;
extern const struct SpriteTemplate gSpriteTemplate_83CE688;
extern const struct SpriteSheet gUnknown_083CE6A0[];
extern const struct SpritePalette gUnknown_083CE708[];
-extern const u8 gOtherText_SentToPC[];
extern const u8 gNamingScreenMenu_Gfx[];
extern u16 gMenuMessageBoxContentTileOffset;
extern const u16 gNamingScreenPalettes[];
@@ -56,10 +57,6 @@ extern const u16 gUnknown_083CE748[];
extern const u16 gUnknown_083CEBF8[];
extern const u16 gUnknown_083CF0A8[];
extern const u16 gUnknown_08E86258[];
-extern const u8 gSpeciesNames[][11];
-extern const u8 OtherText_YourName[];
-extern const u8 OtherText_BoxName[];
-extern const u8 OtherText_PokeName[];
static void C2_NamingScreen(void);
static void sub_80B5AA0(void);
diff --git a/src/option_menu.c b/src/option_menu.c
index 613012972..878df16ba 100644
--- a/src/option_menu.c
+++ b/src/option_menu.c
@@ -4,6 +4,7 @@
#include "menu.h"
#include "palette.h"
#include "sprite.h"
+#include "strings2.h"
#include "task.h"
extern void SetPokemonCryStereo(u32 val);
@@ -33,28 +34,6 @@ enum {
extern u8 gUnknown_0839F63C[];
extern u8 gUnknown_0839F5FC[]; //palette
-extern u8 gSystemText_Normal[];
-extern u8 gSystemText_LR[];
-extern u8 gSystemText_LA[];
-extern u8 gSystemText_Terminator[];
-extern u8 gSystemText_Type[];
-extern u8 gSystemText_Mono[];
-extern u8 gSystemText_Stereo[];
-extern u8 gSystemText_Shift[];
-extern u8 gSystemText_Set[];
-extern u8 gSystemText_On[];
-extern u8 gSystemText_Off[];
-extern u8 gSystemText_Slow[];
-extern u8 gSystemText_Mid[];
-extern u8 gSystemText_Fast[];
-extern u8 gSystemText_OptionMenu[];
-extern u8 gSystemText_TextSpeed[];
-extern u8 gSystemText_BattleScene[];
-extern u8 gSystemText_BattleStyle[];
-extern u8 gSystemText_Sound[];
-extern u8 gSystemText_ButtonMode[];
-extern u8 gSystemText_Frame[];
-extern u8 gSystemText_Cancel[];
static void Task_OptionMenuFadeIn(u8 taskId);
static void Task_OptionMenuProcessInput(u8 taskId);
@@ -93,135 +72,135 @@ void CB2_InitOptionMenu(void)
{
switch (gMain.state)
{
- default:
- case 0:
+ default:
+ case 0:
+ {
+ u8 *addr;
+ u32 size;
+
+ SetVBlankCallback(NULL);
+ REG_DISPCNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG0CNT = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ addr = (u8 *)VRAM;
+ size = 0x18000;
+ while (1)
{
- u8 *addr;
- u32 size;
-
- SetVBlankCallback(NULL);
- REG_DISPCNT = 0;
- REG_BG2CNT = 0;
- REG_BG1CNT = 0;
- REG_BG0CNT = 0;
- REG_BG2HOFS = 0;
- REG_BG2VOFS = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- addr = (u8 *)VRAM;
- size = 0x18000;
- while (1)
+ DmaFill16(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
{
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
+ DmaFill16(3, 0, addr, size);
+ break;
}
- DmaClear32(3, OAM, OAM_SIZE);
- DmaClear16(3, PLTT, PLTT_SIZE);
- gMain.state++;
- break;
- }
- case 1:
- ResetPaletteFade();
- remove_some_task();
- ResetTasks();
- ResetSpriteData();
- gMain.state++;
- break;
- case 2:
- SetUpWindowConfig(&gWindowConfig_81E71B4);
- gMain.state++;
- break;
- case 3:
- MultistepInitMenuWindowBegin(&gWindowConfig_81E71B4);
- gMain.state++;
- break;
- case 4:
- if (!MultistepInitMenuWindowContinue())
- return;
- gMain.state++;
- break;
- case 5:
- LoadPalette(gUnknown_0839F5FC, 0x80, 0x40);
- CpuCopy16(gUnknown_0839F63C, (void *)0x0600BEE0, 0x40);
- gMain.state++;
- break;
- case 6:
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
- gMain.state++;
- break;
- case 7:
- {
- u16 savedIme;
-
- REG_WIN0H = 0;
- REG_WIN0V = 0;
- REG_WIN1H = 0;
- REG_WIN1V = 0;
- REG_WININ = 0x1111;
- REG_WINOUT = 0x31;
- REG_BLDCNT = 0xE1;
- REG_BLDALPHA = 0;
- REG_BLDY = 7;
- savedIme = REG_IME;
- REG_IME = 0;
- REG_IE |= INTR_FLAG_VBLANK;
- REG_IME = savedIme;
- REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
- SetVBlankCallback(VBlankCB);
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON |
- DISPCNT_WIN0_ON | DISPCNT_WIN1_ON;
- gMain.state++;
- break;
- }
- case 8:
- {
- u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0);
-
- gTasks[taskId].data[TD_MENUSELECTION] = 0;
- gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2.optionsTextSpeed;
- gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2.optionsBattleSceneOff;
- gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2.optionsBattleStyle;
- gTasks[taskId].data[TD_SOUND] = gSaveBlock2.optionsSound;
- gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2.optionsButtonMode;
- gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2.optionsWindowFrameType;
-
- MenuDrawTextWindow(2, 0, 27, 3);
- MenuDrawTextWindow(2, 4, 27, 19);
-
- MenuPrint(gSystemText_OptionMenu, 4, 1);
- MenuPrint(gSystemText_TextSpeed, 4, 5);
- MenuPrint(gSystemText_BattleScene, 4, 7);
- MenuPrint(gSystemText_BattleStyle, 4, 9);
- MenuPrint(gSystemText_Sound, 4, 11);
- MenuPrint(gSystemText_ButtonMode, 4, 13);
- MenuPrint(gSystemText_Frame, 4, 15);
- MenuPrint(gSystemText_Cancel, 4, 17);
-
- TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
- BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
- BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
- Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
- ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
- FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
-
- REG_WIN0H = WIN_RANGE(17, 223);
- REG_WIN0V = WIN_RANGE(1, 31);
-
- HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
- gMain.state++;
- break;
}
- case 9:
- SetMainCallback2(MainCB);
+ DmaClear32(3, OAM, OAM_SIZE);
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ gMain.state++;
+ break;
+ }
+ case 1:
+ ResetPaletteFade();
+ remove_some_task();
+ ResetTasks();
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 2:
+ SetUpWindowConfig(&gWindowConfig_81E71B4);
+ gMain.state++;
+ break;
+ case 3:
+ MultistepInitMenuWindowBegin(&gWindowConfig_81E71B4);
+ gMain.state++;
+ break;
+ case 4:
+ if (!MultistepInitMenuWindowContinue())
return;
+ gMain.state++;
+ break;
+ case 5:
+ LoadPalette(gUnknown_0839F5FC, 0x80, 0x40);
+ CpuCopy16(gUnknown_0839F63C, (void *)0x0600BEE0, 0x40);
+ gMain.state++;
+ break;
+ case 6:
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ gMain.state++;
+ break;
+ case 7:
+ {
+ u16 savedIme;
+
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1H = 0;
+ REG_WIN1V = 0;
+ REG_WININ = 0x1111;
+ REG_WINOUT = 0x31;
+ REG_BLDCNT = 0xE1;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 7;
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ SetVBlankCallback(VBlankCB);
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON |
+ DISPCNT_WIN0_ON | DISPCNT_WIN1_ON;
+ gMain.state++;
+ break;
+ }
+ case 8:
+ {
+ u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0);
+
+ gTasks[taskId].data[TD_MENUSELECTION] = 0;
+ gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2.optionsTextSpeed;
+ gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2.optionsBattleSceneOff;
+ gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2.optionsBattleStyle;
+ gTasks[taskId].data[TD_SOUND] = gSaveBlock2.optionsSound;
+ gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2.optionsButtonMode;
+ gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2.optionsWindowFrameType;
+
+ MenuDrawTextWindow(2, 0, 27, 3);
+ MenuDrawTextWindow(2, 4, 27, 19);
+
+ MenuPrint(gSystemText_OptionMenu, 4, 1);
+ MenuPrint(gSystemText_TextSpeed, 4, 5);
+ MenuPrint(gSystemText_BattleScene, 4, 7);
+ MenuPrint(gSystemText_BattleStyle, 4, 9);
+ MenuPrint(gSystemText_Sound, 4, 11);
+ MenuPrint(gSystemText_ButtonMode, 4, 13);
+ MenuPrint(gSystemText_Frame, 4, 15);
+ MenuPrint(gSystemText_Cancel, 4, 17);
+
+ TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
+ BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
+ BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
+ Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
+ ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
+ FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
+
+ REG_WIN0H = WIN_RANGE(17, 223);
+ REG_WIN0V = WIN_RANGE(1, 31);
+
+ HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
+ gMain.state++;
+ break;
+ }
+ case 9:
+ SetMainCallback2(MainCB);
+ return;
}
}
@@ -264,30 +243,30 @@ static void Task_OptionMenuProcessInput(u8 taskId)
{
switch (gTasks[taskId].data[TD_MENUSELECTION])
{
- case MENUITEM_TEXTSPEED:
- gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]);
- TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
- break;
- case MENUITEM_BATTLESCENE:
- gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]);
- BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
- break;
- case MENUITEM_BATTLESTYLE:
- gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]);
- BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
- break;
- case MENUITEM_SOUND:
- gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]);
- Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
- break;
- case MENUITEM_BUTTONMODE:
- gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]);
- ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
- break;
- case MENUITEM_FRAMETYPE:
- gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]);
- FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
- break;
+ case MENUITEM_TEXTSPEED:
+ gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]);
+ TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
+ break;
+ case MENUITEM_BATTLESCENE:
+ gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]);
+ BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
+ break;
+ case MENUITEM_BATTLESTYLE:
+ gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]);
+ BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
+ break;
+ case MENUITEM_SOUND:
+ gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]);
+ Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
+ break;
+ case MENUITEM_BUTTONMODE:
+ gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]);
+ ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
+ break;
+ case MENUITEM_FRAMETYPE:
+ gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]);
+ FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
+ break;
}
}
}
@@ -323,7 +302,7 @@ static void HighlightOptionMenuItem(u8 index)
REG_WIN1V = WIN_RANGE_(index * 16 + 40, index * 16 + 56);
}
-static void DrawOptionMenuChoice(u8 *text, u8 x, u8 y, u8 style)
+static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style)
{
u8 dst[16];
u16 i;
diff --git a/src/party_menu.c b/src/party_menu.c
index d473eae6d..b08180645 100644
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -1,52 +1,180 @@
#include "global.h"
+#include "asm.h"
+#include "data2.h"
#include "menu.h"
#include "pokemon.h"
#include "songs.h"
#include "sound.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
+#include "sprite.h"
+#include "palette.h"
+#include "event_data.h"
+#include "main.h"
+#include "item.h"
+#include "battle_interface.h"
+#include "species.h"
#define DATA_COUNT (6)
+struct Unk2001000
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+};
+
+struct Unk201B000
+{
+ u8 filler0[0x260];
+ u8 unk260;
+ u8 unk261;
+ u8 filler262[2];
+ s16 unk264[DATA_COUNT * 2];
+ u8 filler27C[2];
+ s16 unk27E;
+ s16 unk280;
+ s16 unk282;
+};
+
struct Unk201C000
{
/*0x00*/ struct Pokemon *pokemon;
- /*0x04*/ u8 var04;
- /*0x05*/ u8 var05;
- /*0x06*/ u16 var06;
- u8 pad_08[10];
- /*0x12*/ u16 var12;
+ /*0x04*/ u8 unk4;
+ /*0x05*/ u8 unk5;
+ /*0x06*/ u16 unk6;
+ /*0x08*/ u16 unk8;
+ /*0x0A*/ u8 pad_0A[2];
+ /*0x0C*/ s32 unkC;
+ /*0x10*/ TaskFunc unk10;
+ /*0x14*/ TaskFunc unk14;
+};
+
+struct Unk201F000
+{
+ u8 filler0[0xE00];
+ u8 unkE00[3]; // not sure if this is an array or struct, or how big it is
};
-struct Unk201B260
+struct UnknownStruct5
{
- /*0x00*/ u8 var00;
- /*0x01*/ u8 var01;
- u8 pad_02[2];
- /*0x04*/ s16 var04[DATA_COUNT * 2];
- u8 pad_1C[2];
- /*0x1E*/ u16 var1E;
- /*0x20*/ u16 var20;
+ u8 unk0;
+ u8 unk1;
+ u16 *unk4;
};
-extern struct Unk201B260 unk_201B260;
-extern struct Unk201C000 unk_201C000;
+extern u8 ewram[];
+#define ewram01000 (*(struct Unk2001000 *)(ewram + 0x01000))
+#define ewram1B000 (*(struct Unk201B000 *)(ewram + 0x1B000))
+#define ewram1C000 (*(struct Unk201C000 *)(ewram + 0x1C000))
+#define ewram1F000 (*(struct Unk201F000 *)(ewram + 0x1F000))
+
extern u8 gUnknown_0202E8F4;
extern u8 gUnknown_0202E8F6;
+extern u16 gUnknown_0202E8F8;
+extern u8 gUnknown_0202E8FA;
+extern u8 gLastFieldPokeMenuOpened;
+extern u8 gPlayerPartyCount;
+extern u16 gScriptItemId;
+extern s32 gBattleMoveDamage;
+
+//extern const u16 gUnknown_083769A8[][6];
+//extern const u8 gUnknown_083769A8[][12];
+extern void *const gUnknown_08376858[][6];
+extern const u8 gUnknown_083769A8[];
+extern const u8 gUnknown_08376D1C[DATA_COUNT];
+extern const u16 gUnknown_08376504[];
+extern void (*const gUnknown_08376B54[])(u8);
+extern const u8 *const gUnknown_08376D04[DATA_COUNT];
+extern const struct UnknownStruct5 gUnknown_08376BB4[][6];
+extern const u8 *const gItemEffectTable[];
-extern u8 gUnknown_083769A8[][12];
-extern u8 gUnknown_08376D1C[DATA_COUNT];
-extern u8 *gUnknown_08376D04[DATA_COUNT];
-extern u8 gOtherText_TallPlusAndRightArrow[];
+extern bool8 IsDoubleBattle(void);
+extern void SetUpBattlePokemonMenu(u8);
+extern void sub_808B0C0(u8);
+extern u8 GiveMailToMon(struct Pokemon *, u16);
+extern bool8 ItemIsMail(u16);
+extern void ClearMailStruct(struct MailStruct *);
+extern u8 GiveMailToMon2(struct Pokemon *, struct MailStruct *);
+extern void TakeMailFromMon(struct Pokemon *);
+extern u8 TakeMailFromMon2(struct Pokemon *);
+extern u32 CanMonLearnTMHM(struct Pokemon *, u8);
+extern void sub_809D9F0(struct Pokemon *, u8, u8, void *, u32);
+extern void sub_808B564();
+extern u8 sub_809FA30(void);
+extern void sub_808B508(u8);
+extern void sub_8032638();
+extern u8 sub_8094C20();
+extern bool8 ExecuteTableBasedItemEffect_();
+extern u8 GetMonStatusAndPokerus();
-void task_pc_turn_off(u8 *u8, int i);
+u8 sub_806CA38(u8);
+void task_pc_turn_off();
static void sub_806E884(u8 taskId);
void sub_806F8AC(u8 taskId);
+void sub_806FB0C(u8 taskId);
void PartyMenuUpdateLevelOrStatus(struct Pokemon *, u8);
-u8 ExecuteTableBasedItemEffect__(u8 u8, u16 u16, int i);
+bool8 ExecuteTableBasedItemEffect__(u8, u16, u8);
void sub_80701DC(u8 taskId);
+void DoRecoverPP(u8);
+void Task_RareCandy1(u8);
+void Task_RareCandy2(u8);
+void Task_RareCandy3(u8);
+void sub_806D538();
+void sub_806D5A4(void);
+void sub_806E8D0(u8 taskId, u16 b, TaskFunc c);
+void GetMedicineItemEffectMessage(u16);
+void sub_8070A20();
+void sub_8070848(u8 taskId);
+void sub_8070968();
+void party_menu_link_mon_held_item_object(u8);
+void Task_ConfirmGiveHeldItem(u8);
+void DisplayGiveHeldItemMessage(u8, u16, u8);
+void SetHeldItemIconVisibility();
+void DisplayTakeHeldItemMessage(u8, u16, u8);
+void Task_ConfirmTakeHeldMail(u8);
+void Task_TeamMonTMMove(u8);
+void Task_TeamMonTMMove2(u8);
+void Task_TeamMonTMMove3(u8);
+void Task_TeamMonTMMove4(u8);
+void sub_806F358(u8);
+void sub_806F390(u8);
+void sub_806F44C(u8);
+void TMMoveUpdateMoveSlot(u8);
+void StopTryingToTeachMove_806F614(u8);
+void StopTryingToTeachMove_806F67C(u8);
+void StopTryingToTeachMove_806F6B4(u8);
+void sub_806FB44(u8);
+void sub_8070C54();
+void SetMonIconAnim();
+u8 GetMonIconSpriteId_maybe();
+void PartyMenuDoPrintHP(u8, int, u16, u16);
+void PartyMenuClearLevelStatusTilemap();
+void PartyMenuPrintMonLevelOrStatus();
+u8 GetItemEffectType();
+bool8 IsBlueYellowRedFlute(u16);
+void TryPrintPartyMenuMonNickname();
+void sub_8070088(u8);
+
+
+/*
+void sub_806AEDC(void)
+{
+ const struct UnknownStruct5 *r5;
+ s32 i;
-u8 sub_806E834(u8 *message, u8 arg1)
+ AnimateSprites();
+ BuildOamBuffer();
+ r5 = gUnknown_08376BB4[gUnknown_0202E8FA];
+ for (i = 0; i < 6; i++)
+ sub_800142C(r5[i].unk0 * 8, r5[i].unk1 * 8, r5[i].unk4, 0, (i << 5) | 0x200);
+ RunTasks();
+ UpdatePaletteFade();
+}
+*/
+
+u8 sub_806E834(const u8 *message, u8 arg1)
{
u8 taskId;
@@ -63,227 +191,1217 @@ u8 sub_806E834(u8 *message, u8 arg1)
static void sub_806E884(u8 taskId)
{
- if (MenuUpdateWindowText() == 0)
+ if (MenuUpdateWindowText())
{
- return;
+ gUnknown_0202E8F6 = 0;
+ if (gTasks[taskId].data[0] == 0)
+ MenuZeroFillWindowRect(3, 14, 26, 19);
+ DestroyTask(taskId);
}
+}
- gUnknown_0202E8F6 = 0;
+void sub_806E8D0(u8 taskId, u16 b, TaskFunc c)
+{
+ ewram1C000.unk10 = c;
+ ewram1C000.unk4 = taskId;
+ ewram1C000.unk5 = sub_806CA38(taskId);
+ ewram1C000.unk6 = b;
+ ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5];
+}
+
+bool8 PartyMenuUpdateMonHeldItem(struct Pokemon *pkmn, u16 item)
+{
+ u8 itemData[2];
- if (gTasks[taskId].data[0] == 0)
+ if (ItemIsMail(item) == TRUE)
{
- MenuZeroFillWindowRect(3, 14, 26, 19);
+ if (GiveMailToMon(pkmn, item) == 0xFF)
+ return TRUE;
+ gUnknown_0202E8F4 = 2;
+ }
+ else
+ {
+ gUnknown_0202E8F4 = 1;
}
- DestroyTask(taskId);
+ itemData[0] = item;
+ itemData[1] = item >> 8;
+ SetMonData(pkmn, MON_DATA_HELD_ITEM, itemData);
+ return FALSE;
}
-asm(".section .text_b");
-
-#ifdef NONMATCHING
-void sub_8070088(u8 taskId)
+void PartyMenuTryGiveMonHeldItem(u8 taskId, u16 newItem, TaskFunc c)
{
- u8 dummyTaskId;
- struct Task *task2;
+ u16 currentItem;
gTasks[taskId].func = TaskDummy;
+ sub_806E8D0(taskId, newItem, c);
+ currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM);
+ gUnknown_0202E8F4 = 0;
+ gUnknown_0202E8F8 = 0;
+ if (currentItem != 0)
+ {
+ if (ItemIsMail(currentItem) == TRUE)
+ {
+ sub_806E834(gOtherText_MailMustBeRemoved, 1);
+ CreateTask(party_menu_link_mon_held_item_object, 5);
+ }
+ else
+ {
+ GetMonNickname(ewram1C000.pokemon, gStringVar1);
+ CopyItemName(currentItem, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyHolding);
+ sub_806E834(gStringVar4, 1);
+ CreateTask(Task_ConfirmGiveHeldItem, 5);
+ if (ItemIsMail(newItem) == TRUE)
+ gUnknown_0202E8F8 = currentItem;
+ }
+ }
+ else
+ {
+ PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, newItem);
+ RemoveBagItem(newItem, 1);
+ if (ItemIsMail(newItem))
+ {
+ gTasks[taskId].func = c;
+ }
+ else
+ {
+ DisplayGiveHeldItemMessage(ewram1C000.unk5, newItem, 1);
+ CreateTask(party_menu_link_mon_held_item_object, 5);
+ }
+ }
+}
- if (GetMonData(&gPlayerParty[unk_201C000.var04], MON_DATA_SPECIES) == 0)
+void party_menu_link_mon_held_item_object(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
{
- gTasks[taskId].func = sub_80701DC;
- return;
+ SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5);
+ gTasks[ewram1C000.unk4].func = ewram1C000.unk10;
+ DestroyTask(taskId);
}
+}
- dummyTaskId = CreateTask(TaskDummy, 5);
- task2 = &gTasks[dummyTaskId];
+void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId)
+{
+ s8 selection = ProcessMenuInputNoWrap_();
- task2->data[10] = GetMonData(unk_201C000.pokemon, MON_DATA_MAX_HP);
- task2->data[11] = GetMonData(unk_201C000.pokemon, MON_DATA_HP);
+ if (selection == 0)
+ {
+ u16 currentItem;
- if (ExecuteTableBasedItemEffect__(unk_201C000.var05, unk_201C000.var06, 0))
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM);
+ RemoveBagItem(ewram1C000.unk6, 1);
+ if (AddBagItem(currentItem, 1) == TRUE)
+ {
+ PartyMenuUpdateMonHeldItem(ewram1C000.pokemon, ewram1C000.unk6);
+ if (ItemIsMail(ewram1C000.unk6))
+ {
+ DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 1);
+ }
+ else
+ {
+ CopyItemName(ewram1C000.unk6, gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gOtherText_TakenAndReplaced);
+ sub_806E834(gStringVar4, 1);
+ }
+ }
+ else
+ {
+ sub_806E834(gOtherText_BagFullCannotRemoveItem, 0);
+ AddBagItem(ewram1C000.unk6, 1);
+ }
+ }
+ else
{
- DestroyTask(dummyTaskId);
- gTasks[taskId].func = sub_80701DC;
- return;
+ if (selection != 1 && selection != -1)
+ return;
+ if (selection == -1)
+ PlaySE(SE_SELECT);
+ MenuZeroFillWindowRect(23, 8, 29, 13);
}
+ gTasks[taskId].func = party_menu_link_mon_held_item_object;
+}
- gUnknown_0202E8F4 = 1;
- MenuZeroFillWindowRect(3, 14, 26, 19);
- PlaySE(SE_KAIFUKU);
- PartyMenuUpdateLevelOrStatus(unk_201C000.pokemon, unk_201C000.var05);
+void Task_ConfirmGiveHeldItem(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ DisplayYesNoMenu(23, 8, 1);
+ gTasks[taskId].func = PartyMenuTryGiveMonHeldItem_806EACC;
+ }
+}
+
+void DisplayGiveHeldItemMessage(u8 a, u16 b, u8 c)
+{
+ GetMonNickname(&gPlayerParty[a], gStringVar1);
+ CopyItemName(b, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gOtherText_WasGivenToHold);
+ sub_806E834(gStringVar4, c);
+}
- task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle()][unk_201C000.var05], 9);
- unk_201B260.var01 = 2; // u8
- task2->data[12] = GetMonData(unk_201C000.pokemon, MON_DATA_HP) - task2->data[11];
- task2->data[14] = 1;
- unk_201B260.var1E = 1; // u16
- unk_201B260.var20 = 1; // u16
+// Not sure about this one for now.
+/*
+void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func)
+{
+ u16 currentItem;
+ struct MailStruct *r4;
- unk_201C000.var12 = -0x8000;
- task2->func = sub_806F8AC;
+ gTasks[taskId].func = TaskDummy;
+ sub_806E8D0(taskId, 0, func);
+ currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM);
+ gUnknown_0202E8F4 = 0;
+ r4 = &gSaveBlock1.mail[ewram1F000.unkE00[0] + ewram1F000.unkE00[2]];
+ if (currentItem != 0)
+ {
+ sub_806E834(gOtherText_PokeHoldingItemCantMail, 1);
+ CreateTask(party_menu_link_mon_held_item_object, 5);
+ }
+ else
+ {
+ GiveMailToMon2(ewram1C000.pokemon, r4);
+ ClearMailStruct(r4);
+ sub_806E834(gOtherText_MailTransferredMailbox, 1);
+ CreateTask(party_menu_link_mon_held_item_object, 5);
+ }
}
-#else
+*/
__attribute__((naked))
-void sub_8070088(void)
+void PartyMenuTryGiveMonMail(u8 taskId, TaskFunc func)
{
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\
- sub sp, 0x4\n\
+ push {r4,r5,lr}\n\
+ adds r2, r1, 0\n\
lsls r0, 24\n\
lsrs r0, 24\n\
- ldr r1, _08070120 @ =gTasks\n\
- mov r10, r1\n\
+ ldr r3, _0806ECA0 @ =gTasks\n\
lsls r1, r0, 2\n\
adds r1, r0\n\
lsls r1, 3\n\
- mov r2, r10\n\
- adds r7, r1, r2\n\
- ldr r5, _08070124 @ =TaskDummy\n\
- str r5, [r7]\n\
- ldr r4, _08070128 @ =0x0201c000\n\
- ldrb r0, [r4, 0x5]\n\
- movs r1, 0x64\n\
- mov r9, r1\n\
- mov r2, r9\n\
- muls r2, r0\n\
- adds r0, r2, 0\n\
- ldr r1, _0807012C @ =gPlayerParty\n\
- mov r8, r1\n\
- add r0, r8\n\
- movs r1, 0xB\n\
+ adds r1, r3\n\
+ ldr r3, _0806ECA4 @ =TaskDummy\n\
+ str r3, [r1]\n\
+ movs r1, 0\n\
+ bl sub_806E8D0\n\
+ ldr r5, _0806ECA8 @ =0x0201c000\n\
+ ldr r0, [r5]\n\
+ movs r1, 0xC\n\
bl GetMonData\n\
+ lsls r0, 16\n\
+ ldr r2, _0806ECAC @ =gUnknown_0202E8F4\n\
+ movs r1, 0\n\
+ strb r1, [r2]\n\
+ movs r1, 0xF8\n\
+ lsls r1, 6\n\
+ adds r2, r5, r1\n\
+ ldrb r1, [r2]\n\
+ adds r1, 0x6\n\
+ ldrb r2, [r2, 0x2]\n\
+ adds r1, r2\n\
+ lsls r2, r1, 3\n\
+ adds r2, r1\n\
+ lsls r2, 2\n\
+ ldr r1, _0806ECB0 @ =gSaveBlock1 + 0x2B4C\n\
+ adds r4, r2, r1\n\
cmp r0, 0\n\
- beq _08070118\n\
- adds r0, r5, 0\n\
+ beq _0806ECBC\n\
+ ldr r0, _0806ECB4 @ =gOtherText_PokeHoldingItemCantMail\n\
+ movs r1, 0x1\n\
+ bl sub_806E834\n\
+ ldr r0, _0806ECB8 @ =party_menu_link_mon_held_item_object\n\
movs r1, 0x5\n\
bl CreateTask\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- lsls r0, r5, 2\n\
- adds r0, r5\n\
- lsls r0, 3\n\
- str r0, [sp]\n\
- mov r0, r10\n\
- adds r0, 0x8\n\
- ldr r2, [sp]\n\
- adds r6, r2, r0\n\
- ldrb r0, [r4, 0x5]\n\
- mov r1, r9\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- add r0, r8\n\
- str r0, [r4]\n\
- movs r1, 0x3A\n\
- bl GetMonData\n\
- strh r0, [r6, 0x14]\n\
- ldr r0, [r4]\n\
- movs r1, 0x39\n\
- bl GetMonData\n\
- strh r0, [r6, 0x16]\n\
- ldrb r0, [r4, 0x5]\n\
- ldrh r1, [r4, 0x6]\n\
- movs r2, 0\n\
- bl ExecuteTableBasedItemEffect__\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _08070134\n\
- adds r0, r5, 0\n\
- bl DestroyTask\n\
-_08070118:\n\
- ldr r0, _08070130 @ =sub_80701DC\n\
- str r0, [r7]\n\
- b _080701B0\n\
+ b _0806ECDA\n\
.align 2, 0\n\
-_08070120: .4byte gTasks\n\
-_08070124: .4byte TaskDummy\n\
-_08070128: .4byte 0x0201c000\n\
-_0807012C: .4byte gPlayerParty\n\
-_08070130: .4byte sub_80701DC\n\
-_08070134:\n\
- ldr r1, _080701C0 @ =gUnknown_0202E8F4\n\
- movs r0, 0x1\n\
- strb r0, [r1]\n\
- movs r0, 0x3\n\
- movs r1, 0xE\n\
- movs r2, 0x1A\n\
- movs r3, 0x13\n\
- bl MenuZeroFillWindowRect\n\
- movs r0, 0x1\n\
- bl PlaySE\n\
- ldr r0, [r4]\n\
- ldrb r1, [r4, 0x5]\n\
- bl PartyMenuUpdateLevelOrStatus\n\
- bl IsDoubleBattle\n\
- adds r1, r0, 0\n\
- lsls r1, 24\n\
- lsrs r1, 24\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- ldrb r1, [r4, 0x5]\n\
- lsls r1, 1\n\
- adds r0, r1\n\
- ldr r1, _080701C4 @ =gUnknown_083769A8\n\
- adds r0, r1\n\
- movs r1, 0x9\n\
- bl task_pc_turn_off\n\
- ldr r2, _080701C8 @ =0xfffff261\n\
- adds r1, r4, r2\n\
- movs r0, 0x2\n\
- strb r0, [r1]\n\
- ldr r0, [r4]\n\
- movs r1, 0x39\n\
- bl GetMonData\n\
- ldrh r1, [r6, 0x16]\n\
- subs r0, r1\n\
- strh r0, [r6, 0x18]\n\
- movs r0, 0x1\n\
- strh r0, [r6, 0x1C]\n\
- ldr r1, _080701CC @ =0xfffff27e\n\
- adds r0, r4, r1\n\
+_0806ECA0: .4byte gTasks\n\
+_0806ECA4: .4byte TaskDummy\n\
+_0806ECA8: .4byte 0x0201c000\n\
+_0806ECAC: .4byte gUnknown_0202E8F4\n\
+_0806ECB0: .4byte gSaveBlock1 + 0x2B4C\n\
+_0806ECB4: .4byte gOtherText_PokeHoldingItemCantMail\n\
+_0806ECB8: .4byte party_menu_link_mon_held_item_object\n\
+_0806ECBC:\n\
+ ldr r0, [r5]\n\
+ adds r1, r4, 0\n\
+ bl GiveMailToMon2\n\
+ adds r0, r4, 0\n\
+ bl ClearMailStruct\n\
+ ldr r0, _0806ECE0 @ =gOtherText_MailTransferredMailbox\n\
movs r1, 0x1\n\
- strh r1, [r0]\n\
- ldr r2, _080701D0 @ =0xfffff280\n\
- adds r0, r4, r2\n\
- strh r1, [r0]\n\
- ldrh r1, [r6, 0x16]\n\
- adds r2, 0x2\n\
- adds r0, r4, r2\n\
- strh r1, [r0]\n\
- ldr r0, _080701D4 @ =0xffff8000\n\
- str r0, [r4, 0xC]\n\
- ldr r1, [sp]\n\
- add r1, r10\n\
- ldr r0, _080701D8 @ =sub_806F8AC\n\
- str r0, [r1]\n\
-_080701B0:\n\
- add sp, 0x4\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
+ bl sub_806E834\n\
+ ldr r0, _0806ECE4 @ =party_menu_link_mon_held_item_object\n\
+ movs r1, 0x5\n\
+ bl CreateTask\n\
+_0806ECDA:\n\
+ pop {r4,r5}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
-_080701C0: .4byte gUnknown_0202E8F4\n\
-_080701C4: .4byte gUnknown_083769A8\n\
-_080701C8: .4byte 0xfffff261\n\
-_080701CC: .4byte 0xfffff27e\n\
-_080701D0: .4byte 0xfffff280\n\
-_080701D4: .4byte 0xffff8000\n\
-_080701D8: .4byte sub_806F8AC\n\
+_0806ECE0: .4byte gOtherText_MailTransferredMailbox\n\
+_0806ECE4: .4byte party_menu_link_mon_held_item_object\n\
.syntax divided\n");
}
-#endif
+void PartyMenuTryGiveMonHeldItem_806ECE8(u8 taskId, TaskFunc func)
+{
+ u16 currentItem;
+
+ gTasks[taskId].func = TaskDummy;
+ sub_806E8D0(taskId, 0, func);
+ currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM);
+ if (currentItem == 0)
+ {
+ StringExpandPlaceholders(gStringVar4, gOtherText_NotHoldingAnything);
+ sub_806E834(gStringVar4, 0);
+ CreateTask(party_menu_link_mon_held_item_object, 5);
+ }
+ else
+ {
+ u8 itemData[2];
+
+ itemData[0] = 0;
+ itemData[1] = 0;
+ if (AddBagItem(currentItem, 1) == TRUE)
+ {
+ if (ItemIsMail(currentItem) == TRUE)
+ TakeMailFromMon(ewram1C000.pokemon);
+ DisplayTakeHeldItemMessage(ewram1C000.unk5, currentItem, 0);
+ SetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM, itemData);
+ }
+ else
+ {
+ sub_806E834(gOtherText_BagFullCannotRemoveItem, 0);
+ }
+ CreateTask(party_menu_link_mon_held_item_object, 5);
+ }
+}
+
+void DisplayTakeHeldItemMessage(u8 a, u16 b, u8 c)
+{
+ GetMonNickname(&gPlayerParty[a], gStringVar1);
+ CopyItemName(b, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gOtherText_ReceivedTheThingFrom);
+ sub_806E834(gStringVar4, c);
+}
+
+void DoTakeMail(u8 taskId, TaskFunc func)
+{
+ gTasks[taskId].func = TaskDummy;
+ sub_806E8D0(taskId, 0, func);
+ ewram1C000.unk6 = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM);
+ sub_806E834(gOtherText_SendRemovedMailPrompt, 1);
+ CreateTask(Task_ConfirmTakeHeldMail, 5);
+}
+
+void Task_LoseMailMessage(u8 taskId)
+{
+ s8 selection = ProcessMenuInputNoWrap_();
+
+ if (selection == 0)
+ {
+ if (AddBagItem(ewram1C000.unk6, 1) == TRUE)
+ {
+ TakeMailFromMon(ewram1C000.pokemon);
+ sub_806E834(gOtherText_MailTaken, 0);
+ }
+ else
+ {
+ sub_806E834(gOtherText_BagFullCannotRemoveItem, 0);
+ }
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ gTasks[taskId].func = party_menu_link_mon_held_item_object;
+ }
+ else
+ {
+ if (selection != 1 && selection != -1)
+ return;
+ if (selection == -1)
+ PlaySE(SE_SELECT);
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ MenuZeroFillWindowRect(0, 14, 29, 19);
+ gTasks[taskId].func = party_menu_link_mon_held_item_object;
+ }
+}
+
+void Task_ConfirmLoseMailMessage(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ DisplayYesNoMenu(23, 8, 1);
+ gTasks[taskId].func = Task_LoseMailMessage;
+ }
+}
+
+void Task_TakeHeldMail(u8 taskId)
+{
+ s8 selection = ProcessMenuInputNoWrap_();
+
+ if (selection == 0)
+ {
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF)
+ sub_806E834(gOtherText_MailWasSent, 0);
+ else
+ sub_806E834(gOtherText_MailboxIsFull, 0);
+ gTasks[taskId].func = party_menu_link_mon_held_item_object;
+ }
+ else
+ {
+ if (selection != 1 && selection != -1)
+ return;
+ if (selection == -1)
+ PlaySE(SE_SELECT);
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ sub_806E834(gOtherText_MailRemovedMessageLost, 1);
+ gTasks[taskId].func = Task_ConfirmLoseMailMessage;
+ }
+}
+
+void Task_ConfirmTakeHeldMail(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ DisplayYesNoMenu(23, 8, 1);
+ gTasks[taskId].func = Task_TakeHeldMail;
+ }
+}
+
+u16 ItemIdToBattleMoveId(u16 item)
+{
+ u16 moveId = item - 289;
-asm(".section .text_c");
+ return gUnknown_08376504[moveId];
+}
+
+bool8 pokemon_has_move(struct Pokemon *pkmn, u16 move)
+{
+ u8 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ if (GetMonData(pkmn, MON_DATA_MOVE1 + i) == move)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func)
+{
+ PlaySE(SE_SELECT);
+ gTasks[taskId].func = TaskDummy;
+ sub_806E8D0(taskId, move, func);
+ CreateTask(Task_TeamMonTMMove, 5);
+}
+
+void Task_TeamMonTMMove(u8 taskId)
+{
+ GetMonNickname(ewram1C000.pokemon, gStringVar1);
+ ewram1C000.unk8 = ItemIdToBattleMoveId(ewram1C000.unk6);
+ StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
+ ewram1B000.unk282 = 0;
+ if (pokemon_has_move(ewram1C000.pokemon, ewram1C000.unk8))
+ {
+ StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyKnows);
+ sub_806E834(gStringVar4, 1);
+ gTasks[taskId].func = party_menu_link_mon_held_item_object;
+ }
+ else
+ {
+ if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33))
+ {
+ StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible);
+ sub_806E834(gStringVar4, 1);
+ gTasks[taskId].func = party_menu_link_mon_held_item_object;
+ }
+ else
+ {
+ if (GiveMoveToMon(ewram1C000.pokemon, ewram1C000.unk8) != 0xFFFF)
+ {
+ Task_TeamMonTMMove2(taskId);
+ }
+ else
+ {
+ StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn);
+ sub_806E834(gStringVar4, 1);
+ gTasks[taskId].func = sub_806F358;
+ }
+ }
+ }
+}
+
+void Task_TeamMonTMMove2(u8 taskId)
+{
+ StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
+ StringExpandPlaceholders(gStringVar4, gOtherText_LearnedMove);
+ sub_806E834(gStringVar4, 1);
+ AdjustFriendship(ewram1C000.pokemon, 4);
+ if (ewram1B000.unk282 == 0 && ewram1C000.unk6 <= 0x152)
+ RemoveBagItem(ewram1C000.unk6, 1);
+ gTasks[taskId].func = Task_TeamMonTMMove3;
+}
+
+void Task_TeamMonTMMove3(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ PlayFanfare(BGM_FANFA1);
+ gTasks[taskId].func = Task_TeamMonTMMove4;
+ }
+}
+
+void Task_TeamMonTMMove4(u8 taskId)
+{
+ if (IsFanfareTaskInactive())
+ {
+ if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
+ {
+ SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5);
+ if (ewram1B000.unk282 == 1)
+ {
+ sub_8070C54(taskId);
+ }
+ else
+ {
+ gTasks[ewram1C000.unk4].func = ewram1C000.unk10;
+ DestroyTask(taskId);
+ }
+ }
+ }
+}
+
+void sub_806F2FC(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ SetHeldItemIconVisibility(ewram1C000.unk4, ewram1C000.unk5);
+ if (ewram1B000.unk282 == 1)
+ {
+ sub_8070C54(taskId);
+ }
+ else
+ {
+ gTasks[ewram1C000.unk4].func = ewram1C000.unk10;
+ DestroyTask(taskId);
+ }
+ }
+}
+
+void sub_806F358(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ DisplayYesNoMenu(23, 8, 1);
+ gTasks[taskId].func = sub_806F390;
+ }
+}
+
+void sub_806F390(u8 taskId)
+{
+ s8 selection = ProcessMenuInputNoWrap_();
+
+ if (selection == 0)
+ {
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ sub_806E834(gOtherText_WhichMoveToForget2, 1);
+ gTasks[taskId].func = sub_806F44C;
+ }
+ else
+ {
+ if (selection != 1 && selection != -1)
+ return;
+ if (selection == -1)
+ PlaySE(SE_SELECT);
+ StopTryingToTeachMove_806F614(taskId);
+ }
+}
+
+void sub_806F3FC(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_809D9F0(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8);
+ DestroyTask(taskId);
+ }
+}
+
+void sub_806F44C(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_806F3FC;
+ }
+}
+
+void TaughtMove(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ u8 moveIndex;
+ u16 r4;
+
+ gTasks[taskId].func = TaskDummy;
+ sub_806E8D0(taskId, gScriptItemId, sub_808B508);
+ moveIndex = sub_809FA30();
+ r4 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + moveIndex);
+ GetMonNickname(ewram1C000.pokemon, gStringVar1);
+ StringCopy(gStringVar2, gMoveNames[r4]);
+ StringExpandPlaceholders(gStringVar4, gOtherText_ForgetMove123_2);
+ sub_806E834(gStringVar4, 1);
+ CreateTask(TMMoveUpdateMoveSlot, 5);
+ }
+}
+
+void TMMoveUpdateMoveSlot(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ RemoveMonPPBonus(ewram1C000.pokemon, sub_809FA30());
+ SetMonMoveSlot(ewram1C000.pokemon, ewram1C000.unk8, sub_809FA30());
+ Task_TeamMonTMMove2(taskId);
+ }
+}
+
+void StopTryingToTeachMove_806F588(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ gTasks[taskId].func = TaskDummy;
+ sub_806E8D0(taskId, gScriptItemId, sub_808B508);
+ StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
+ StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo);
+ sub_806E834(gStringVar4, 1);
+ CreateTask(StopTryingToTeachMove_806F67C, 5);
+ }
+}
+
+void StopTryingToTeachMove_806F614(u8 taskId)
+{
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
+ StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo);
+ sub_806E834(gStringVar4, 1);
+ gTasks[taskId].func = StopTryingToTeachMove_806F67C;
+}
+
+void StopTryingToTeachMove_806F67C(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ DisplayYesNoMenu(23, 8, 1);
+ gTasks[taskId].func = StopTryingToTeachMove_806F6B4;
+ }
+}
+
+void StopTryingToTeachMove_806F6B4(u8 taskId)
+{
+ s8 selection = ProcessMenuInputNoWrap_();
+
+ if (selection == 0)
+ {
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ GetMonNickname(ewram1C000.pokemon, gStringVar1);
+ StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
+ StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2);
+ sub_806E834(gStringVar4, 1);
+ gTasks[taskId].func = sub_806F2FC;
+ }
+ else
+ {
+ if (selection != 1 && selection != -1)
+ return;
+ if (selection == -1)
+ PlaySE(SE_SELECT);
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ GetMonNickname(ewram1C000.pokemon, gStringVar1);
+ StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]);
+ StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn);
+ sub_806E834(gStringVar4, 1);
+ gTasks[taskId].func = sub_806F358;
+ }
+}
+
+bool8 IsHMMove(u16 move)
+{
+ u8 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (gUnknown_08376504[50 + i] == move)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+s16 sub_806F7E8(u8 taskId, struct BattleInterfaceStruct1 *b, s8 c)
+{
+ s16 *taskData;
+ u8 hpBarLevel;
+ void *vramPtr;
+
+ taskData = gTasks[taskId].data;
+
+ b->unk0 = taskData[10];
+ b->unk4 = taskData[11];
+ b->unk8 = taskData[12] * c;
+ b->unk10 = 0x100;
+ hpBarLevel = GetHPBarLevel(ewram1B000.unk282, b->unk0);
+ if (hpBarLevel > 2)
+ b->unkC_0 = 4;
+ if (hpBarLevel == 2)
+ b->unkC_0 = 5;
+ if (hpBarLevel < 2)
+ b->unkC_0 = 6;
+ vramPtr = gUnknown_08376858[IsDoubleBattle()][ewram1C000.unk5];
+ return sub_80460C8(b, &ewram1C000.unkC, vramPtr, 0);
+}
+
+void sub_806F8AC(u8 taskId)
+{
+ struct BattleInterfaceStruct1 sp0;
+ u16 sp14;
+
+ ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, -1);
+ if (ewram1B000.unk282 == -1)
+ {
+ ewram1C000.unkC = 0;
+ if (-sp0.unk8 + sp0.unk4 > sp0.unk0)
+ sp14 = sp0.unk0 - sp0.unk4;
+ else
+ sp14 = -sp0.unk8;
+ gBattleMoveDamage = -sp14;
+ GetMonNickname(ewram1C000.pokemon, gStringVar1);
+ ConvertIntToDecimalStringN(gStringVar2, sp14, 0, 3);
+ if (gTasks[taskId].data[14] == 0)
+ StringExpandPlaceholders(gStringVar4, gOtherText_HPRestoredBy);
+ else
+ StringExpandPlaceholders(gStringVar4, gOtherText_RegainedHealth);
+ SetMonIconAnim(GetMonIconSpriteId_maybe(ewram1C000.unk4, ewram1C000.unk5), ewram1C000.pokemon);
+ task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 7);
+ ewram1B000.unk261 = 2;
+ sub_806E834(gStringVar4, 1);
+ sp14 += sp0.unk4;
+ SetMonData(ewram1C000.pokemon, MON_DATA_HP, (u8 *)&sp14);
+ RemoveBagItem(ewram1C000.unk6, 1);
+ sub_8032638();
+ gTasks[taskId].func = sub_806FB44;
+ }
+ else
+ {
+ PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0);
+ }
+}
+
+void sub_806FA18(u8 taskId)
+{
+ struct BattleInterfaceStruct1 sp0;
+
+ ewram1B000.unk282 = sub_806F7E8(taskId, &sp0, 1);
+ if (ewram1B000.unk282 == -1)
+ {
+ PlaySE(SE_KAIFUKU);
+ ewram1C000.unkC = 0;
+ gTasks[taskId].data[11] -= gTasks[taskId].data[12];
+ SetMonData(ewram1C000.pokemon, MON_DATA_HP, (u8 *)&gTasks[taskId].data[11]);
+ SetMonIconAnim(GetMonIconSpriteId_maybe(ewram1C000.unk4, ewram01000.unk1), ewram1C000.pokemon);
+ ewram1C000.unk5 = gSprites[ewram01000.unk2].data0;
+ ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5];
+ gTasks[taskId].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP);
+ gTasks[taskId].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP);
+ ewram1C000.unkC = -32768;
+ ewram1C000.unk14 = ewram1C000.unk10;
+ gTasks[taskId].func = sub_806F8AC;
+ ewram1B000.unk282 = gTasks[taskId].data[11];
+ }
+ else
+ {
+ PartyMenuDoPrintHP(ewram1C000.unk5, IsDoubleBattle(), ewram1B000.unk282, sp0.unk0);
+ }
+}
+
+void sub_806FB0C(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ gTasks[ewram1C000.unk4].func = ewram1C000.unk10;
+ DestroyTask(taskId);
+ }
+}
+
+void sub_806FB44(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ {
+ gTasks[ewram1C000.unk4].func = ewram1C000.unk14;
+ DestroyTask(taskId);
+ }
+}
+
+bool8 IsHPRecoveryItem(u16 item)
+{
+ const u8 *itemEffect;
+
+ if (item == 0xAF)
+ itemEffect = gSaveBlock1.enigmaBerry.itemEffect;
+ else
+ itemEffect = gItemEffectTable[item - 13];
+
+ if (itemEffect[4] & 4)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void PartyMenuUpdateLevelOrStatus(struct Pokemon *pkmn, u8 b)
+{
+ PartyMenuClearLevelStatusTilemap(b);
+ PartyMenuPrintMonLevelOrStatus(b, pkmn);
+}
+
+void GetMedicineItemEffectMessage(u16 item)
+{
+ switch (GetItemEffectType(item))
+ {
+ case 3:
+ StringExpandPlaceholders(gStringVar4, gOtherText_CuredPoisoning);
+ break;
+ case 4:
+ StringExpandPlaceholders(gStringVar4, gOtherText_WokeUp);
+ break;
+ case 5:
+ StringExpandPlaceholders(gStringVar4, gOtherText_BurnHealed);
+ break;
+ case 6:
+ StringExpandPlaceholders(gStringVar4, gOtherText_ThawedOut);
+ break;
+ case 7:
+ StringExpandPlaceholders(gStringVar4, gOtherText_CuredParalysis);
+ break;
+ case 8:
+ StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion);
+ break;
+ case 9:
+ StringExpandPlaceholders(gStringVar4, gOtherText_GotOverLove);
+ break;
+ case 11:
+ StringExpandPlaceholders(gStringVar4, gOtherText_BecameHealthy);
+ break;
+ case 13:
+ StringCopy(gStringVar2, gOtherText_Hp2);
+ StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised);
+ break;
+ case 12:
+ StringCopy(gStringVar2, gOtherText_Attack);
+ StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised);
+ break;
+ case 17:
+ StringCopy(gStringVar2, gOtherText_Defense);
+ StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised);
+ break;
+ case 16:
+ StringCopy(gStringVar2, gOtherText_Speed);
+ StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised);
+ break;
+ case 14:
+ StringCopy(gStringVar2, gOtherText_SpAtk2);
+ StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised);
+ break;
+ case 15:
+ StringCopy(gStringVar2, gOtherText_SpDef2);
+ StringExpandPlaceholders(gStringVar4, gOtherText_WasRaised);
+ break;
+ case 19:
+ case 20:
+ StringExpandPlaceholders(gStringVar4, gOtherText_PPIncreased);
+ break;
+ case 21:
+ StringExpandPlaceholders(gStringVar4, gOtherText_PPRestored);
+ break;
+ default:
+ StringExpandPlaceholders(gStringVar4, gOtherText_WontHaveAnyEffect);
+ break;
+ }
+}
+
+bool8 IsMedicineIneffective(struct Pokemon *pkmn, u16 item)
+{
+ if (GetItemEffectType(item) == 13
+ && GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 ExecuteTableBasedItemEffect__(u8 a, u16 b, u8 c)
+{
+ if (gMain.inBattle)
+ return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, sub_8094C20(a), c);
+ else
+ return ExecuteTableBasedItemEffect_(&gPlayerParty[a], b, a, c);
+}
+
+void UseMedicine(u8 taskId, u16 item, TaskFunc func)
+{
+ u8 r7;
+ bool8 r9 = FALSE;
+ bool8 r0;
+
+ gTasks[taskId].func = TaskDummy;
+ r7 = CreateTask(TaskDummy, 5);
+ sub_806E8D0(taskId, item, func);
+ if (!IsMedicineIneffective(ewram1C000.pokemon, item))
+ {
+ r9 = IsHPRecoveryItem(item);
+ if (r9 == TRUE)
+ {
+ gTasks[r7].data[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP);
+ gTasks[r7].data[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP);
+ if (gTasks[r7].data[10] == gTasks[r7].data[11])
+ {
+ r9 = FALSE;
+ gTasks[r7].data[10] = 0;
+ gTasks[r7].data[11] = 0;
+ }
+ }
+ r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, item, 0);
+ }
+ else
+ {
+ r0 = TRUE;
+ }
+
+ if (r0)
+ {
+ gUnknown_0202E8F4 = 0;
+ PlaySE(SE_SELECT);
+ sub_806E834(gOtherText_WontHaveAnyEffect, 1);
+ gTasks[r7].func = sub_806FB0C;
+ }
+ else
+ {
+ u8 statusAndPkrs;
+
+ gUnknown_0202E8F4 = 1;
+ if (!IsBlueYellowRedFlute(item))
+ PlaySE(SE_KAIFUKU);
+ else
+ PlaySE(SE_BIDORO);
+ statusAndPkrs = GetMonStatusAndPokerus(ewram1C000.pokemon);
+ if (statusAndPkrs == 6 || statusAndPkrs == 0)
+ PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5);
+ if (r9 == TRUE)
+ {
+ gTasks[r7].data[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - gTasks[r7].data[11];
+ ewram1C000.unkC = -32768;
+ if (gTasks[r7].data[11] == 0)
+ gTasks[r7].data[14] = 1;
+ else
+ gTasks[r7].data[14] = 0;
+ ewram1C000.unk14 = ewram1C000.unk10;
+ gTasks[r7].func = sub_806F8AC;
+ ewram1B000.unk282 = gTasks[r7].data[11];
+ }
+ else
+ {
+ GetMonNickname(ewram1C000.pokemon, gStringVar1);
+ if (!IsBlueYellowRedFlute(item))
+ RemoveBagItem(item, 1);
+ GetMedicineItemEffectMessage(item);
+ TryPrintPartyMenuMonNickname(ewram1C000.unk5, ewram1C000.pokemon);
+ sub_806E834(gStringVar4, 1);
+ gTasks[r7].func = sub_806FB0C;
+ }
+ }
+}
+
+bool8 IsBlueYellowRedFlute(u16 item)
+{
+ if (item == 0x27
+ || item == 0x29
+ || item == 0x28)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void sub_8070048(u8 taskId, u16 item, TaskFunc func)
+{
+ ewram1C000.unk10 = func;
+ ewram1C000.unk4 = taskId;
+ ewram1C000.unk6 = item;
+ ewram1C000.unk5 = 0;
+ ewram1C000.unk14 = sub_80701DC;
+ ewram1B000.unk27E = 0;
+ ewram1B000.unk280 = 0;
+ sub_8070088(taskId);
+}
+
+void sub_8070088(u8 taskId)
+{
+ u8 taskId2;
+
+ gTasks[taskId].func = TaskDummy;
+ if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) == 0)
+ {
+ gTasks[taskId].func = sub_80701DC;
+ }
+ else
+ {
+ s16 *taskData;
+
+ taskId2 = CreateTask(TaskDummy, 5);
+ taskData = gTasks[taskId2].data;
+ ewram1C000.pokemon = &gPlayerParty[ewram1C000.unk5];
+ taskData[10] = GetMonData(ewram1C000.pokemon, MON_DATA_MAX_HP);
+ taskData[11] = GetMonData(ewram1C000.pokemon, MON_DATA_HP);
+ if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, 0))
+ {
+ DestroyTask(taskId2);
+ gTasks[taskId].func = sub_80701DC;
+ }
+ else
+ {
+ gUnknown_0202E8F4 = 1;
+ MenuZeroFillWindowRect(3, 14, 26, 19);
+ PlaySE(SE_KAIFUKU);
+ PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5);
+ task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9);
+ ewram1B000.unk261 = 2;
+ taskData[12] = GetMonData(ewram1C000.pokemon, MON_DATA_HP) - taskData[11];
+ taskData[14] = 1;
+ ewram1B000.unk27E = 1;
+ ewram1B000.unk280 = 1;
+ ewram1B000.unk282 = taskData[11];
+ ewram1C000.unkC = -32768;
+ gTasks[taskId2].func = sub_806F8AC;
+ }
+ }
+}
+
+void sub_80701DC(u8 taskId)
+{
+ if (ewram1B000.unk27E == 1)
+ {
+ AddBagItem(ewram1C000.unk6, 1);
+ if (GetMonData(&gPlayerParty[ewram1C000.unk5], MON_DATA_SPECIES) != 0)
+ {
+ task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 3);
+ ewram1B000.unk261 = 2;
+ }
+ ewram1B000.unk27E = 0;
+ }
+ ewram1C000.unk5++;
+ if (ewram1C000.unk5 == 6)
+ {
+ gUnknown_0202E8F4 = 0;
+ if (ewram1B000.unk280 == 0)
+ {
+ gTasks[taskId].func = TaskDummy;
+ sub_806E834(gOtherText_WontHaveAnyEffect, 1);
+ CreateTask(sub_806FB0C, 8);
+ }
+ else
+ {
+ RemoveBagItem(ewram1C000.unk6, 1);
+ gTasks[taskId].func = ewram1C000.unk10;
+ }
+ gLastFieldPokeMenuOpened = 0;
+ }
+ else
+ {
+ sub_8070088(taskId);
+ }
+}
+
+void CreateItemUseMoveMenu(u8 partyMonIndex)
+{
+ u8 r6;
+ u8 i;
+
+ r6 = 0;
+ MenuDrawTextWindow(19, 10, 29, 19);
+ for (i = 0; i < 4; i++)
+ {
+ u16 move = GetMonData(&gPlayerParty[partyMonIndex], MON_DATA_MOVE1 + i);
+
+ MenuPrint(gMoveNames[move], 20, i * 2 + 11);
+ if (move != 0)
+ r6++;
+ }
+ InitMenu(0, 20, 11, r6, 0, 9);
+}
+
+void Task_HandleItemUseMoveMenuInput(u8 taskId)
+{
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ MoveMenuCursor(-1);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ MoveMenuCursor(1);
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ gUnknown_08376B54[0](taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gUnknown_08376B54[1](taskId);
+ }
+}
+
+void DoPPRecoveryItemEffect(u8 taskId, u16 b, TaskFunc c)
+{
+ const u8 *itemEffect;
+ u8 taskId2;
+
+ if (b == 0xAF)
+ itemEffect = gSaveBlock1.enigmaBerry.itemEffect;
+ else
+ itemEffect = gItemEffectTable[b - 13];
+ gTasks[taskId].func = TaskDummy;
+ taskId2 = CreateTask(TaskDummy, 5);
+ sub_806E8D0(taskId, b, c);
+ if (!(itemEffect[4] & 0x10))
+ {
+ gTasks[taskId2].data[11] = 0;
+ DoRecoverPP(taskId2);
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ sub_806D538(10, 3);
+ CreateItemUseMoveMenu(ewram1C000.unk5);
+ gTasks[taskId2].func = Task_HandleItemUseMoveMenuInput;
+ gMain.newKeys = 0;
+ }
+}
+
+void ItemUseMoveMenu_HandleMoveSelection(u8 taskId)
+{
+ HandleDestroyMenuCursors();
+ MenuZeroFillWindowRect(19, 10, 29, 19);
+ sub_806D5A4();
+ gTasks[taskId].data[11] = GetMenuCursorPos();
+ DoRecoverPP(taskId);
+}
+
+void ItemUseMoveMenu_HandleCancel(u8 taskId)
+{
+ HandleDestroyMenuCursors();
+ MenuZeroFillWindowRect(19, 10, 29, 19);
+ if (gMain.inBattle)
+ gTasks[ewram1C000.unk4].func = SetUpBattlePokemonMenu;
+ else
+ gTasks[ewram1C000.unk4].func = sub_808B0C0;
+ sub_806D538(3, 0);
+ DestroyTask(taskId);
+}
+
+void DoRecoverPP(u8 taskId)
+{
+ u16 r5 = 0;
+
+ if (ExecuteTableBasedItemEffect__(ewram1C000.unk5, ewram1C000.unk6, gTasks[taskId].data[11]))
+ {
+ gUnknown_0202E8F4 = r5;
+ PlaySE(SE_SELECT);
+ sub_806E834(gOtherText_WontHaveAnyEffect, 1);
+ }
+ else
+ {
+ gUnknown_0202E8F4 = 1;
+ PlaySE(SE_KAIFUKU);
+ RemoveBagItem(ewram1C000.unk6, 1);
+ r5 = GetMonData(ewram1C000.pokemon, MON_DATA_MOVE1 + gTasks[taskId].data[11]);
+ StringCopy(gStringVar1, gMoveNames[r5]);
+ GetMedicineItemEffectMessage(ewram1C000.unk6);
+ sub_806E834(gStringVar4, 1);
+ }
+ gTasks[taskId].func = sub_806FB0C;
+}
+
+void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c)
+{
+ gTasks[taskId].func = TaskDummy;
+ sub_806E8D0(taskId, b, c);
+ PlaySE(SE_SELECT);
+ sub_806D538(11, 3);
+ CreateItemUseMoveMenu(ewram1C000.unk5);
+ CreateTask(Task_HandleItemUseMoveMenuInput, 5);
+ gMain.newKeys = 0;
+}
+
+void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c)
+{
+ u8 i;
+ bool8 r0;
+
+ gTasks[taskId].func = TaskDummy;
+ sub_806E8D0(taskId, b, c);
+
+ if (GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL) != 100)
+ {
+ for (i = 0; i < 6; i++)
+ ewram1B000.unk264[i] = GetMonData(ewram1C000.pokemon, gUnknown_08376D1C[i]);
+ r0 = ExecuteTableBasedItemEffect__(ewram1C000.unk5, b, 0);
+ }
+ else
+ r0 = TRUE;
+
+ if (r0)
+ {
+ gUnknown_0202E8F4 = 0;
+ PlaySE(SE_SELECT);
+ sub_806E834(gOtherText_WontHaveAnyEffect, 1);
+ CreateTask(sub_806FB0C, 5);
+ }
+ else
+ {
+ u8 level;
+
+ gUnknown_0202E8F4 = 1;
+ PlayFanfareByFanfareNum(0);
+ sub_8070A20(ewram1C000.unk5, ewram1C000.pokemon);
+ RemoveBagItem(b, 1);
+ GetMonNickname(ewram1C000.pokemon, gStringVar1);
+ level = GetMonData(ewram1C000.pokemon, MON_DATA_LEVEL);
+ ConvertIntToDecimalStringN(gStringVar2, level, 0, 3);
+ StringExpandPlaceholders(gStringVar4, gOtherText_ElevatedTo);
+ sub_806E834(gStringVar4, 1);
+ CreateTask(Task_RareCandy1, 5);
+ }
+}
+
+void Task_RareCandy1(u8 taskId)
+{
+ if (WaitFanfare(0) && gUnknown_0202E8F6 == 0)
+ {
+ if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ sub_8070848(taskId);
+ gTasks[taskId].func = Task_RareCandy2;
+ }
+ }
+}
+
+void Task_RareCandy2(u8 taskId)
+{
+ if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON))
+ {
+ PlaySE(SE_SELECT);
+ sub_8070968(taskId);
+ gTasks[taskId].func = Task_RareCandy3;
+ }
+}
void sub_8070848(u8 taskId)
{
@@ -296,35 +1414,27 @@ void sub_8070848(u8 taskId)
u8 x;
u8 y;
u32 stat;
- struct Pokemon **pokemon;
- pokemon = &unk_201C000.pokemon;
- asm("" ::: "r0");
- stat = GetMonData(*pokemon, gUnknown_08376D1C[i]);
+ stat = GetMonData(ewram1C000.pokemon, gUnknown_08376D1C[i]);
- unk_201B260.var04[i + DATA_COUNT] = stat;
- unk_201B260.var04[i] = stat - unk_201B260.var04[i];
+ ewram1B000.unk264[i + DATA_COUNT] = stat;
+ ewram1B000.unk264[i] = stat - ewram1B000.unk264[i];
x = (i / 3) * 9 + 11;
y = ((i % 3) << 1) + 1;
MenuPrint_PixelCoords(gUnknown_08376D04[i], (x + 1) * 8, y * 8, 1);
-
if (i == 2)
- {
MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0);
- }
else
- {
MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1);
- }
- gStringVar1[0] = 0xFC;
+ gStringVar1[0] = EXT_CTRL_CODE_BEGIN;
gStringVar1[1] = 0x14;
gStringVar1[2] = 0x06;
- ConvertIntToDecimalStringN(gStringVar1 + 3, unk_201B260.var04[i], 1, 2);
+ ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.unk264[i], 1, 2);
MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0);
}
diff --git a/src/player_pc.c b/src/player_pc.c
index db23bb803..4c321ba46 100644
--- a/src/player_pc.c
+++ b/src/player_pc.c
@@ -10,8 +10,12 @@
#include "script.h"
#include "sound.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
#include "songs.h"
+#include "name_string_util.h"
+#include "mail.h"
+#include "rom4.h"
// task defines
#define PAGE_INDEX data[0]
@@ -68,21 +72,18 @@ enum
struct MailboxStruct
{
- u8 unk0;
- u8 pageItems;
- u8 unk2;
- u8 count;
+ /*0x00*/ u8 cursorPos;
+ /*0x01*/ u8 pageItems; // number of items (not including Cancel) on the current page.
+ /*0x02*/ u8 itemsAbove; // number of items above the top item on the page.
+ /*0x03*/ u8 count; // total number of items in mailbox storage.
};
extern struct MailboxStruct gMailboxInfo;
-extern void DisplayItemMessageOnField(u8, u8*, TaskFunc, u16);
+extern void DisplayItemMessageOnField(u8, const u8*, TaskFunc, u16);
extern void DoPlayerPCDecoration(u8);
extern void BuyMenuFreeMemory(void);
extern void DestroyVerticalScrollIndicator(u8);
-extern void sub_813AF78(void);
-extern void sub_813B108(u8);
-extern void sub_813B174(u8);
extern void sub_80A6A30(void);
extern u8 sub_807D770(void);
extern void sub_80F996C(u8);
@@ -92,15 +93,12 @@ extern void sub_80A4164(u8 *, u16, enum StringConvertMode, u8);
extern void CreateVerticalScrollIndicators(u32, u32, u32); // unknown args
extern void sub_80F944C(void);
extern void LoadScrollIndicatorPalette(void);
-
-extern u8 gOtherText_NoItems[];
+extern void ClearMailStruct(struct MailStruct *);
+extern void sub_808B020(void);
extern u16 gNewGamePCItems[];
extern u16 gUnknown_08406334[3];
-extern u8 gOtherText_WhatWillYouDo[];
-extern u8 gOtherText_NoMailHere[];
-
extern u8 *gPcItemMenuOptionOrder;
extern struct MenuAction gPCText_PlayerPCOptionsText[];
@@ -111,25 +109,21 @@ extern u8 gUnknown_08406327[];
extern u8 gUnknown_08406330[];
extern u8 gUnknown_0840631E[];
extern u8 gUnknown_08406318[];
-extern u8 gMenuText_GoBackToPrev[];
-extern u8 gOtherText_CancelNoTerminator[];
-extern u8 gOtherText_HowManyToWithdraw[];
-extern u8 gOtherText_WithdrewThing[];
-extern u8 gOtherText_HowManyToToss[];
-extern u8 gOtherText_ThrewAwayItem[];
-extern u8 gOtherText_NoMoreRoom[];
-extern u8 gOtherText_TooImportant[];
-extern u8 gOtherText_OkayToThrowAwayPrompt[];
-extern u8 gOtherText_SwitchWhichItem[];
+extern u8 gUnknown_0840633A[];
extern u8 gPcItemMenuOptionsNum;
+extern u8 gUnknown_02038561;
extern u8 gUnknown_08152850;
extern u8 gUnknown_08152C75;
+extern void (*gUnknown_0300485C)(void);
+
extern u32 gPCText_OptionDescList[];
extern const struct MenuAction gPCText_ItemPCOptionsText[];
+extern const struct MenuAction gUnknown_084062F8[];
extern const struct YesNoFuncTable gUnknown_084062E0;
+extern const struct YesNoFuncTable gUnknown_084062E8;
void InitPlayerPCMenu(u8 taskId);
void PlayerPCProcessMenuInput(u8 taskId);
@@ -153,6 +147,21 @@ void ItemStorage_DrawBothListAndDescription(u8);
void ItemStorage_GoBackToItemPCMenu(u8, u8);
void ItemStorage_LoadPalette(void);
u8 GetMailboxMailCount(void);
+void Mailbox_UpdateMailList(void);
+void Mailbox_DrawMailboxMenu(u8);
+void Mailbox_ProcessInput(u8);
+void sub_813B27C(void);
+void sub_813B294(u8);
+void sub_813B320(u8);
+void sub_813B348(u8);
+void sub_813B3A0(u8);
+void sub_813B454(u8);
+void sub_813B4F0(void);
+void sub_813B554(u8);
+void sub_813B66C(u8);
+void sub_813B718(u8);
+void Mailbox_Cancel(u8);
+void sub_813B758(u8);
void NewGameInitPCItems(void)
{
@@ -232,12 +241,12 @@ void PlayerPC_Mailbox(u8 taskId)
DisplayItemMessageOnField(taskId, gOtherText_NoMailHere, ReshowPlayerPC, 0);
else
{
- gMailboxInfo.unk0 = 0;
- gMailboxInfo.unk2 = 0;
- sub_813AF78();
+ gMailboxInfo.cursorPos = 0;
+ gMailboxInfo.itemsAbove = 0;
+ Mailbox_UpdateMailList();
ItemStorage_SetItemAndMailCount(taskId);
- sub_813B108(taskId);
- gTasks[taskId].func = sub_813B174;
+ Mailbox_DrawMailboxMenu(taskId);
+ gTasks[taskId].func = Mailbox_ProcessInput;
}
}
@@ -869,15 +878,15 @@ beforeLabel:
switch(ITEMS_ABOVE_TOP)
{
- default:
- CreateVerticalScrollIndicators(0, 0xB8, 8);
- break;
+ default:
+ CreateVerticalScrollIndicators(0, 0xB8, 8);
+ break;
weirdCase:
- sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1);
- goto beforeLabel;
- case 0:
- DestroyVerticalScrollIndicator(0);
- break;
+ sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1);
+ goto beforeLabel;
+ case 0:
+ DestroyVerticalScrollIndicator(0);
+ break;
}
if(ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS)
@@ -893,31 +902,31 @@ void ItemStorage_PrintItemPcResponse(u16 itemId)
switch(itemId)
{
case ITEMPC_GO_BACK_TO_PREV:
- string = gMenuText_GoBackToPrev;
+ string = (u8 *)gMenuText_GoBackToPrev;
break;
case ITEMPC_HOW_MANY_TO_WITHDRAW:
- string = gOtherText_HowManyToWithdraw;
+ string = (u8 *)gOtherText_HowManyToWithdraw;
break;
case ITEMPC_WITHDREW_THING:
- string = gOtherText_WithdrewThing;
+ string = (u8 *)gOtherText_WithdrewThing;
break;
case ITEMPC_HOW_MANY_TO_TOSS:
- string = gOtherText_HowManyToToss;
+ string = (u8 *)gOtherText_HowManyToToss;
break;
case ITEMPC_THREW_AWAY_ITEM:
- string = gOtherText_ThrewAwayItem;
+ string = (u8 *)gOtherText_ThrewAwayItem;
break;
case ITEMPC_NO_MORE_ROOM:
- string = gOtherText_NoMoreRoom;
+ string = (u8 *)gOtherText_NoMoreRoom;
break;
case ITEMPC_TOO_IMPORTANT:
- string = gOtherText_TooImportant;
+ string = (u8 *)gOtherText_TooImportant;
break;
case ITEMPC_OKAY_TO_THROW_AWAY:
- string = gOtherText_OkayToThrowAwayPrompt;
+ string = (u8 *)gOtherText_OkayToThrowAwayPrompt;
break;
case ITEMPC_SWITCH_WHICH_ITEM:
- string = gOtherText_SwitchWhichItem;
+ string = (u8 *)gOtherText_SwitchWhichItem;
break;
default:
string = ItemId_GetDescription(itemId);
@@ -979,3 +988,344 @@ u8 GetMailboxMailCount(void)
return i;
}
+
+void Mailbox_UpdateMailList(void)
+{
+ struct MailStruct mailBuffer;
+ u8 i, j;
+
+ for (i=6; i<15; i++)
+ {
+ for (j=i+1; j<16; j++)
+ {
+ if (gSaveBlock1.mail[i].itemId == 0)
+ {
+ mailBuffer = gSaveBlock1.mail[i];
+ gSaveBlock1.mail[i] = gSaveBlock1.mail[j];
+ gSaveBlock1.mail[j] = mailBuffer;
+ }
+ }
+ }
+}
+
+// WWHHHHHYYYYYYYY SOMEBODY PLEASE FIX THIS
+void Mailbox_DrawMailList(u8 taskId) // taskId is unused
+{
+ u16 yCoord = 0;
+ u16 i = gMailboxInfo.itemsAbove;
+ register struct MailboxStruct *tempMailbox asm("r1") = &gMailboxInfo;
+ register struct MailboxStruct *mailbox asm("r6");
+
+ if(i < i + tempMailbox->pageItems)
+ {
+ mailbox = tempMailbox;
+ goto forJump;
+ for(; i < mailbox->itemsAbove + mailbox->pageItems; i++)
+ {
+ forJump:
+ yCoord = (i - mailbox->itemsAbove) * 2;
+ MenuFillWindowRectWithBlankTile(0x15, yCoord + 2, 0x1C, yCoord + 3);
+
+ if(i != mailbox->count)
+ {
+ StringCopy(gStringVar1, (u8 *)gSaveBlock1.mail[i + 6].playerName);
+ SanitizeNameString(gStringVar1);
+ MenuPrint(gStringVar1, 0x15, yCoord + 2);
+ }
+ else
+ {
+ goto weirdCase; // again, what???
+ }
+ }
+ }
+
+beforeLabel:
+ if(i - gMailboxInfo.itemsAbove != 8)
+ MenuFillWindowRectWithBlankTile(0x15, yCoord + 4, 0x1C, 0x12);
+
+ switch(gMailboxInfo.itemsAbove)
+ {
+ default:
+ CreateVerticalScrollIndicators(0, 0xC8, 8);
+ break;
+weirdCase:
+ MenuPrint(gOtherText_CancelNoTerminator, 0x15, yCoord + 2);
+ goto beforeLabel;
+ case 0:
+ DestroyVerticalScrollIndicator(0);
+ break;
+ }
+
+ if(gMailboxInfo.itemsAbove + gMailboxInfo.pageItems <= gMailboxInfo.count)
+ CreateVerticalScrollIndicators(1, 0xC8, 0x98);
+ else
+ DestroyVerticalScrollIndicator(1);
+}
+
+void Mailbox_DrawMailboxMenu(u8 taskId)
+{
+ sub_80F944C();
+ LoadScrollIndicatorPalette();
+ MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
+ MenuDrawTextWindow(0, 0, 0x8, 0x3);
+ MenuPrint(gPCText_Mailbox, 1, 1);
+ MenuDrawTextWindow(0x14, 0, 0x1D, 0x13);
+ Mailbox_DrawMailList(taskId);
+ InitMenu(0, 0x15, 2, gMailboxInfo.pageItems, gMailboxInfo.cursorPos, 8);
+}
+
+// Mailbox_ProcessInput
+void Mailbox_ProcessInput(u8 taskId)
+{
+ if(!gPaletteFade.active)
+ {
+ if(gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if(gMailboxInfo.cursorPos != 0)
+ {
+ PlaySE(5);
+ gMailboxInfo.cursorPos = MoveMenuCursor(-1);
+ }
+ else if(gMailboxInfo.itemsAbove != 0)
+ {
+ PlaySE(5);
+ gMailboxInfo.itemsAbove--;
+ Mailbox_DrawMailList(taskId);
+ }
+ }
+ else if(gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if(gMailboxInfo.cursorPos != gMailboxInfo.pageItems - 1)
+ {
+ PlaySE(5);
+ gMailboxInfo.cursorPos = MoveMenuCursor(1);
+ }
+ else if(gMailboxInfo.itemsAbove + gMailboxInfo.cursorPos != gMailboxInfo.count)
+ {
+ PlaySE(5);
+ gMailboxInfo.itemsAbove++;
+ Mailbox_DrawMailList(taskId);
+ }
+ }
+ else if(gMain.newKeys & A_BUTTON)
+ {
+ HandleDestroyMenuCursors();
+ PlaySE(5);
+
+ if(gMailboxInfo.itemsAbove + gMailboxInfo.cursorPos == gMailboxInfo.count)
+ {
+ sub_813B320(taskId);
+ }
+ else
+ {
+ sub_813B27C();
+ gTasks[taskId].func = sub_813B294;
+ }
+ }
+ else if(gMain.newKeys & B_BUTTON)
+ {
+ HandleDestroyMenuCursors();
+ PlaySE(5);
+ sub_813B320(taskId);
+ }
+ }
+}
+
+void sub_813B27C(void)
+{
+ BuyMenuFreeMemory();
+ DestroyVerticalScrollIndicator(0);
+ DestroyVerticalScrollIndicator(1);
+}
+
+void sub_813B294(u8 taskId)
+{
+ MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
+ StringCopy(gStringVar1, gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos].playerName);
+ SanitizeNameString(gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gOtherText_WhatWillYouDoMail);
+ DisplayItemMessageOnField(taskId, gStringVar4, sub_813B348, 0);
+}
+
+void sub_813B300(u8 taskId)
+{
+ MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
+ ReshowPlayerPC(taskId);
+}
+
+void sub_813B320(u8 taskId)
+{
+ sub_813B27C();
+ gTasks[taskId].func = sub_813B300;
+}
+
+void sub_813B348(u8 taskId)
+{
+ MenuDrawTextWindow(0, 0, 0xC, 0x9);
+ PrintMenuItems(1, 1, 4, gUnknown_084062F8);
+ InitMenu(0, 1, 1, 4, 0, 0xB);
+ gTasks[taskId].func = sub_813B3A0;
+}
+
+void sub_813B3A0(u8 taskId)
+{
+ if(gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ PlaySE(5);
+ MoveMenuCursor(-1);
+ }
+ else if(gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ PlaySE(5);
+ MoveMenuCursor(1);
+ }
+ else if(gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(5);
+ gUnknown_084062F8[GetMenuCursorPos()].func(taskId);
+ }
+ else if(gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(5);
+ Mailbox_Cancel(taskId);
+ }
+}
+
+void Mailbox_Read(u8 taskId)
+{
+ fade_screen(1, 0);
+ gTasks[taskId].func = sub_813B454;
+}
+
+void sub_813B454(u8 taskId)
+{
+ if(!gPaletteFade.active)
+ {
+ HandleReadMail(&gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos], sub_813B4F0, 1);
+ DestroyTask(taskId);
+ }
+}
+
+void sub_813B4A0(u8 taskId)
+{
+ if(sub_807D770() == TRUE)
+ gTasks[taskId].func = Mailbox_ProcessInput;
+}
+
+void sub_813B4D0(void)
+{
+ Mailbox_DrawMailboxMenu(CreateTask(sub_813B4A0, 0));
+ pal_fill_black();
+}
+
+void sub_813B4F0(void)
+{
+ gUnknown_0300485C = sub_813B4D0;
+ SetMainCallback2(c2_exit_to_overworld_2_switch);
+}
+
+void Mailbox_MoveToBag(u8 taskId)
+{
+ HandleDestroyMenuCursors();
+ StringCopy(gStringVar1, gOtherText_MoveToBag);
+ MenuPrint(gUnknown_0840633A, 1, 3);
+ DisplayItemMessageOnField(taskId, gOtherText_MessageWillBeLost, sub_813B554, 0);
+}
+
+void sub_813B554(u8 taskId)
+{
+ DisplayYesNoMenu(0x14, 0x8, 0x1);
+ sub_80F914C(taskId, &gUnknown_084062E8);
+}
+
+void sub_813B578(u8 taskId)
+{
+ struct MailStruct *mail = &gSaveBlock1.mail[gMailboxInfo.itemsAbove + 6 + gMailboxInfo.cursorPos];
+
+ MenuZeroFillWindowRect(0x14, 8, 0x1A, 0xD);
+
+ if(AddBagItem(mail->itemId, 1) == FALSE)
+ {
+ DisplayItemMessageOnField(taskId, gOtherText_BagIsFull, sub_813B758, 0);
+ }
+ else
+ {
+ DisplayItemMessageOnField(taskId, gOtherText_MailWasReturned, sub_813B758, 0);
+ ClearMailStruct(mail);
+ Mailbox_UpdateMailList();
+
+ gMailboxInfo.count--;
+
+ if(gMailboxInfo.count < gMailboxInfo.pageItems + gMailboxInfo.itemsAbove && gMailboxInfo.itemsAbove != 0)
+ gMailboxInfo.itemsAbove--;
+
+ ItemStorage_SetItemAndMailCount(taskId);
+ }
+}
+
+void sub_813B610(u8 taskId)
+{
+ MenuZeroFillWindowRect(0x14, 0x8, 0x1A, 0xD);
+ sub_813B758(taskId);
+}
+
+void Mailbox_Give(u8 taskId)
+{
+ if(CalculatePlayerPartyCount() == 0)
+ sub_813B718(taskId);
+ else
+ {
+ fade_screen(1, 0);
+ gTasks[taskId].func = sub_813B66C;
+ }
+}
+
+void sub_813B66C(u8 taskId)
+{
+ if(!gPaletteFade.active)
+ {
+ SetMainCallback2(sub_808B020);
+ gUnknown_02038561 = 3;
+ DestroyTask(taskId);
+ }
+}
+
+void sub_813B6A4(void)
+{
+ u8 taskId = CreateTask(sub_813B4A0, 0);
+ u8 oldCount = gMailboxInfo.count;
+
+ gMailboxInfo.count = GetMailboxMailCount();
+ Mailbox_UpdateMailList();
+
+ if(oldCount != gMailboxInfo.count && gMailboxInfo.count < gMailboxInfo.pageItems + gMailboxInfo.itemsAbove && gMailboxInfo.itemsAbove != 0) // did the count update?
+ gMailboxInfo.itemsAbove--;
+
+ ItemStorage_SetItemAndMailCount(taskId);
+ Mailbox_DrawMailboxMenu(taskId);
+ pal_fill_black();
+}
+
+void sub_813B6F8(void)
+{
+ gUnknown_0300485C = sub_813B6A4;
+ SetMainCallback2(c2_exit_to_overworld_2_switch);
+}
+
+void sub_813B718(u8 taskId)
+{
+ DisplayItemMessageOnField(taskId, gOtherText_NoPokemon, sub_813B758, 0);
+}
+
+void Mailbox_Cancel(u8 taskId)
+{
+ HandleDestroyMenuCursors();
+ MenuZeroFillWindowRect(0, 0, 0xC, 0x9);
+ sub_813B758(taskId);
+}
+
+void sub_813B758(u8 taskId)
+{
+ Mailbox_DrawMailboxMenu(taskId);
+ gTasks[taskId].func = Mailbox_ProcessInput;
+}
diff --git a/src/pokedex.c b/src/pokedex.c
index 83b87906d..3d8b152ae 100644
--- a/src/pokedex.c
+++ b/src/pokedex.c
@@ -12,7 +12,9 @@
#include "songs.h"
#include "sound.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
+#include "trig.h"
// I'm #define-ing these just for now so I can keep using the old unkXXX member names
#define unk60E selectedPokemon
@@ -77,7 +79,6 @@ extern struct SpriteTemplate gSpriteTemplate_83A056C;
extern struct SpriteTemplate gSpriteTemplate_83A0584;
extern struct SpriteTemplate gSpriteTemplate_83A059C;
extern struct SpriteTemplate gSpriteTemplate_83A05B4;
-extern s16 gSineTable[];
extern struct PokedexListItem *gUnknown_0202FFBC;
extern IntrCallback gUnknown_03005CEC;
extern u8 gUnknown_08E96BD4[];
@@ -90,12 +91,6 @@ extern u8 gUnknown_08E96ACC[];
extern u8 gUnknown_08E96B58[];
extern struct PokedexEntry gPokedexEntries[];
-extern u8 gDexText_UnknownPoke[];
-extern u8 gDexText_UnknownHeight[];
-extern u8 gDexText_UnknownWeight[];
-extern u8 gDexText_CryOf[];
-extern u8 gDexText_SizeComparedTo[];
-extern u8 gDexText_RegisterComplete[];
extern void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
extern bool8 BeginNormalPaletteFade(u32, s8, u8, u8, u16);
@@ -108,7 +103,6 @@ extern u16 NationalToHoennOrder(u16);
extern u16 gPokedexOrder_Alphabetical[];
extern u16 gPokedexOrder_Weight[];
extern u16 gPokedexOrder_Height[];
-extern u8 gSpeciesNames[][11];
u16 NationalPokedexNumToSpecies(u16);
@@ -207,97 +201,97 @@ void CB2_InitPokedex(void)
{
switch (gMain.state)
{
- case 0:
- default:
- {
- u8 *addr;
- u32 size;
+ case 0:
+ default:
+ {
+ u8 *addr;
+ u32 size;
- SetVBlankCallback(NULL);
- sub_8091060(0);
- addr = (u8 *)VRAM;
- size = VRAM_SIZE;
- while (1)
+ SetVBlankCallback(NULL);
+ sub_8091060(0);
+ addr = (u8 *)VRAM;
+ size = VRAM_SIZE;
+ while (1)
+ {
+ DmaFill16(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
{
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
+ DmaFill16(3, 0, addr, size);
+ break;
}
- DmaClear32(3, OAM, OAM_SIZE);
- DmaClear16(3, PLTT, PLTT_SIZE);
- gMain.state = 1;
- break;
}
+ DmaClear32(3, OAM, OAM_SIZE);
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ gMain.state = 1;
+ break;
+ }
+ case 1:
+ remove_some_task();
+ ResetTasks();
+ ResetSpriteData();
+ ResetPaletteFade();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 8;
+ SetUpWindowConfig(&gWindowConfig_81E7048);
+ InitMenuWindow(&gWindowConfig_81E7048);
+ gMain.state++;
+ break;
+ case 2:
+ switch (Random() & 3)
+ {
+ case 0:
+ default:
+ gPokedexView = (struct PokedexView *)0x02018000;
+ break;
case 1:
- remove_some_task();
- ResetTasks();
- ResetSpriteData();
- ResetPaletteFade();
- FreeAllSpritePalettes();
- gReservedSpritePaletteCount = 8;
- SetUpWindowConfig(&gWindowConfig_81E7048);
- InitMenuWindow(&gWindowConfig_81E7048);
- gMain.state++;
+ gPokedexView = (struct PokedexView *)0x02018800;
break;
case 2:
- switch (Random() & 3)
- {
- case 0:
- default:
- gPokedexView = (struct PokedexView *)0x02018000;
- break;
- case 1:
- gPokedexView = (struct PokedexView *)0x02018800;
- break;
- case 2:
- gPokedexView = (struct PokedexView *)0x02019000;
- break;
- case 3:
- gPokedexView = (struct PokedexView *)0x02019800;
- break;
- }
- ClearPokedexView(gPokedexView);
- CreateTask(Task_PokedexShowMainScreen, 0);
- gPokedexView->dexMode = gSaveBlock2.pokedex.unknown1;
- if (!IsNationalPokedexEnabled())
- gPokedexView->dexMode = DEX_MODE_HOENN;
- gPokedexView->dexOrder = gSaveBlock2.pokedex.order;
- gPokedexView->selectedPokemon = gUnknown_0202FFB8;
- gPokedexView->unk62C = gUnknown_0202FFBA;
- gPokedexView->selectedScreen = PAGE_SCREEN;
- gPokedexView->unk64E = 0;
- if (!IsNationalPokedexEnabled())
- {
- gPokedexView->unk61A = GetHoennPokedexCount(0);
- gPokedexView->unk61C = GetHoennPokedexCount(1);
- }
- else
- {
- gPokedexView->unk61A = GetNationalPokedexCount(0);
- gPokedexView->unk61C = GetNationalPokedexCount(1);
- }
- gPokedexView->unk62D = 8;
- gMain.state++;
+ gPokedexView = (struct PokedexView *)0x02019000;
break;
case 3:
+ gPokedexView = (struct PokedexView *)0x02019800;
+ break;
+ }
+ ClearPokedexView(gPokedexView);
+ CreateTask(Task_PokedexShowMainScreen, 0);
+ gPokedexView->dexMode = gSaveBlock2.pokedex.unknown1;
+ if (!IsNationalPokedexEnabled())
+ gPokedexView->dexMode = DEX_MODE_HOENN;
+ gPokedexView->dexOrder = gSaveBlock2.pokedex.order;
+ gPokedexView->selectedPokemon = gUnknown_0202FFB8;
+ gPokedexView->unk62C = gUnknown_0202FFBA;
+ gPokedexView->selectedScreen = PAGE_SCREEN;
+ gPokedexView->unk64E = 0;
+ if (!IsNationalPokedexEnabled())
{
- u16 savedIme;
-
- savedIme = REG_IME;
- REG_IME = 0;
- REG_IE |= 1;
- REG_IME = savedIme;
- REG_DISPSTAT |= 8;
- SetVBlankCallback(sub_808C0B8);
- SetMainCallback2(MainCB);
- SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder);
- m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x80);
+ gPokedexView->unk61A = GetHoennPokedexCount(0);
+ gPokedexView->unk61C = GetHoennPokedexCount(1);
+ }
+ else
+ {
+ gPokedexView->unk61A = GetNationalPokedexCount(0);
+ gPokedexView->unk61C = GetNationalPokedexCount(1);
}
+ gPokedexView->unk62D = 8;
+ gMain.state++;
+ break;
+ case 3:
+ {
+ u16 savedIme;
+
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= 1;
+ REG_IME = savedIme;
+ REG_DISPSTAT |= 8;
+ SetVBlankCallback(sub_808C0B8);
+ SetMainCallback2(MainCB);
+ SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder);
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x80);
+ }
}
}
@@ -423,29 +417,29 @@ void Task_PokedexMainScreenMenu(u8 taskId)
{
switch (gPokedexView->menuCursorPos)
{
- case 0: //BACK TO LIST
- default:
- gMain.newKeys |= START_BUTTON; //Exit menu
- break;
- case 1: //LIST TOP
- gPokedexView->selectedPokemon = 0;
- gPokedexView->unk62C = 0x40;
- sub_808E82C();
- sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
- gMain.newKeys |= START_BUTTON; //Exit menu
- break;
- case 2: //LIST BOTTOM
- gPokedexView->selectedPokemon = gPokedexView->unk60C - 1;
- gPokedexView->unk62C = gPokedexView->unk60C * 16 + 0x30;
- sub_808E82C();
- sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
- gMain.newKeys |= START_BUTTON; //Exit menu
- break;
- case 3: //CLOSE POKEDEX
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
- gTasks[taskId].func = Task_ClosePokedex;
- PlaySE(SE_PC_OFF);
- break;
+ case 0: //BACK TO LIST
+ default:
+ gMain.newKeys |= START_BUTTON; //Exit menu
+ break;
+ case 1: //LIST TOP
+ gPokedexView->selectedPokemon = 0;
+ gPokedexView->unk62C = 0x40;
+ sub_808E82C();
+ sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
+ gMain.newKeys |= START_BUTTON; //Exit menu
+ break;
+ case 2: //LIST BOTTOM
+ gPokedexView->selectedPokemon = gPokedexView->unk60C - 1;
+ gPokedexView->unk62C = gPokedexView->unk60C * 16 + 0x30;
+ sub_808E82C();
+ sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
+ gMain.newKeys |= START_BUTTON; //Exit menu
+ break;
+ case 3: //CLOSE POKEDEX
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_ClosePokedex;
+ PlaySE(SE_PC_OFF);
+ break;
}
}
@@ -614,34 +608,34 @@ void Task_PokedexResultsScreenMenu(u8 taskId)
{
switch (gPokedexView->menuCursorPos)
{
- case 0: //BACK TO LIST
- default:
- gMain.newKeys |= START_BUTTON;
- break;
- case 1: //LIST TOP
- gPokedexView->selectedPokemon = 0;
- gPokedexView->unk62C = 0x40;
- sub_808E82C();
- sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
- gMain.newKeys |= START_BUTTON;
- break;
- case 2: //LIST BOTTOM
- gPokedexView->selectedPokemon = gPokedexView->unk60C - 1;
- gPokedexView->unk62C = gPokedexView->unk60C * 16 + 0x30;
- sub_808E82C();
- sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
- gMain.newKeys |= START_BUTTON;
- break;
- case 3: //BACK TO POKEDEX
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
- gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen;
- PlaySE(SE_TRACK_DOOR);
- break;
- case 4: //CLOSE POKEDEX
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
- gTasks[taskId].func = Task_PokedexResultsScreenExitPokedex;
- PlaySE(SE_PC_OFF);
- break;
+ case 0: //BACK TO LIST
+ default:
+ gMain.newKeys |= START_BUTTON;
+ break;
+ case 1: //LIST TOP
+ gPokedexView->selectedPokemon = 0;
+ gPokedexView->unk62C = 0x40;
+ sub_808E82C();
+ sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
+ gMain.newKeys |= START_BUTTON;
+ break;
+ case 2: //LIST BOTTOM
+ gPokedexView->selectedPokemon = gPokedexView->unk60C - 1;
+ gPokedexView->unk62C = gPokedexView->unk60C * 16 + 0x30;
+ sub_808E82C();
+ sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
+ gMain.newKeys |= START_BUTTON;
+ break;
+ case 3: //BACK TO POKEDEX
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen;
+ PlaySE(SE_TRACK_DOOR);
+ break;
+ case 4: //CLOSE POKEDEX
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ gTasks[taskId].func = Task_PokedexResultsScreenExitPokedex;
+ PlaySE(SE_PC_OFF);
+ break;
}
}
@@ -726,83 +720,83 @@ bool8 sub_808D344(u8 a)
{
switch (gMain.state)
{
- case 0:
- default:
- if (gPaletteFade.active)
- return 0;
- //_0808D39E
- SetVBlankCallback(NULL);
- gPokedexView->unk64A = a;
- sub_8091060(0);
- REG_BG2VOFS = gPokedexView->unk62D;
- LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM));
- LZ77UnCompVram(gUnknown_08E96738, (void *)(VRAM + 0x6800));
- LZ77UnCompVram(gUnknown_08E9C6DC, (void *)(VRAM + 0x7800));
- DmaClear16(3, VRAM + 0x6000, 0x500);
- if (a == 0)
- LZ77UnCompVram(gUnknown_08E96888, (void *)(VRAM + 0x6500));
- else
- LZ77UnCompVram(gUnknown_08E96994, (void *)(VRAM + 0x6500));
- ResetPaletteFade();
- if (a == 0)
- gPokedexView->unk64C_1 = 0;
- else
- gPokedexView->unk64C_1 = 1;
- sub_808D640();
- gMain.state = 1;
- break;
- case 1:
- ResetSpriteData();
- FreeAllSpritePalettes();
- gReservedSpritePaletteCount = 8;
- LoadCompressedObjectPic(&gUnknown_083A05CC);
- LoadSpritePalettes(gUnknown_083A05DC);
- sub_808E978(a);
- gMain.state++;
- break;
- case 2:
- SetUpWindowConfig(&gWindowConfig_81E7048);
- InitMenuWindow(&gWindowConfig_81E7048);
- LZ77UnCompVram(gUnknown_0839FA7C, (void *)(VRAM + 0xFF80));
- gMain.state++;
- break;
- case 3:
- if (a == 0)
- SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder);
- sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
- gPokedexView->menuIsOpen = 0;
- gPokedexView->menuY = 0;
- gMain.state++;
- break;
- case 4:
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
- SetVBlankCallback(sub_808C0B8);
- gMain.state++;
- break;
- case 5:
- REG_WININ = 0x3F3F;
- REG_WINOUT = 0x1D3F;
- REG_WIN0H = 0;
- REG_WIN0V = 0;
- REG_WIN1H = 0;
- REG_WIN1V = 0;
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BLDY = 0;
- REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_OBJWIN_ON;
- gMain.state++;
- break;
- case 6:
- if (!gPaletteFade.active)
- {
- gMain.state = 0;
- return 1;
- }
- else
- return 0;
+ case 0:
+ default:
+ if (gPaletteFade.active)
+ return 0;
+ //_0808D39E
+ SetVBlankCallback(NULL);
+ gPokedexView->unk64A = a;
+ sub_8091060(0);
+ REG_BG2VOFS = gPokedexView->unk62D;
+ LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM));
+ LZ77UnCompVram(gUnknown_08E96738, (void *)(VRAM + 0x6800));
+ LZ77UnCompVram(gUnknown_08E9C6DC, (void *)(VRAM + 0x7800));
+ DmaClear16(3, VRAM + 0x6000, 0x500);
+ if (a == 0)
+ LZ77UnCompVram(gUnknown_08E96888, (void *)(VRAM + 0x6500));
+ else
+ LZ77UnCompVram(gUnknown_08E96994, (void *)(VRAM + 0x6500));
+ ResetPaletteFade();
+ if (a == 0)
+ gPokedexView->unk64C_1 = 0;
+ else
+ gPokedexView->unk64C_1 = 1;
+ sub_808D640();
+ gMain.state = 1;
+ break;
+ case 1:
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 8;
+ LoadCompressedObjectPic(&gUnknown_083A05CC);
+ LoadSpritePalettes(gUnknown_083A05DC);
+ sub_808E978(a);
+ gMain.state++;
+ break;
+ case 2:
+ SetUpWindowConfig(&gWindowConfig_81E7048);
+ InitMenuWindow(&gWindowConfig_81E7048);
+ LZ77UnCompVram(gUnknown_0839FA7C, (void *)(VRAM + 0xFF80));
+ gMain.state++;
+ break;
+ case 3:
+ if (a == 0)
+ SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder);
+ sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
+ gPokedexView->menuIsOpen = 0;
+ gPokedexView->menuY = 0;
+ gMain.state++;
+ break;
+ case 4:
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ SetVBlankCallback(sub_808C0B8);
+ gMain.state++;
+ break;
+ case 5:
+ REG_WININ = 0x3F3F;
+ REG_WINOUT = 0x1D3F;
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1H = 0;
+ REG_WIN1V = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_OBJWIN_ON;
+ gMain.state++;
+ break;
+ case 6:
+ if (!gPaletteFade.active)
+ {
+ gMain.state = 0;
+ return 1;
+ }
+ else
+ return 0;
}
return 0;
}
@@ -826,136 +820,136 @@ void SortPokedex(u8 dexMode, u8 sortMode)
switch (dexMode)
{
- default:
- case DEX_MODE_HOENN:
+ default:
+ case DEX_MODE_HOENN:
+ vars[0] = 202;
+ vars[1] = 1;
+ break;
+ case DEX_MODE_NATIONAL:
+ if (IsNationalPokedexEnabled())
+ {
+ vars[0] = 386;
+ vars[1] = 0;
+ }
+ else
+ {
vars[0] = 202;
vars[1] = 1;
- break;
- case DEX_MODE_NATIONAL:
- if (IsNationalPokedexEnabled())
- {
- vars[0] = 386;
- vars[1] = 0;
- }
- else
- {
- vars[0] = 202;
- vars[1] = 1;
- }
- break;
+ }
+ break;
}
switch (sortMode)
{
- case 0:
+ case 0:
+ {
+ if (vars[1])
{
- if (vars[1])
+ for (i = 0; i < vars[0]; i++)
{
- for (i = 0; i < vars[0]; i++)
- {
- vars[2] = HoennToNationalOrder(i + 1);
- gPokedexView->unk0[i].dexNum = vars[2];
- gPokedexView->unk0[i].seen = GetNationalPokedexFlag(vars[2], 0);
- gPokedexView->unk0[i].owned = GetNationalPokedexFlag(vars[2], 1);
- if (gPokedexView->unk0[i].seen)
- gPokedexView->unk60C = i + 1;
- }
+ vars[2] = HoennToNationalOrder(i + 1);
+ gPokedexView->unk0[i].dexNum = vars[2];
+ gPokedexView->unk0[i].seen = GetNationalPokedexFlag(vars[2], 0);
+ gPokedexView->unk0[i].owned = GetNationalPokedexFlag(vars[2], 1);
+ if (gPokedexView->unk0[i].seen)
+ gPokedexView->unk60C = i + 1;
}
- else
- {
- bool32 r10;
- s16 r5;
+ }
+ else
+ {
+ bool32 r10;
+ s16 r5;
- r10 = r5 = i = 0;
- for (i = 0; i < vars[0]; i++)
+ r10 = r5 = i = 0;
+ for (i = 0; i < vars[0]; i++)
+ {
+ vars[2] = i + 1;
+ if (GetNationalPokedexFlag(vars[2], 0))
+ r10 = 1;
+ if (r10)
{
- vars[2] = i + 1;
- if (GetNationalPokedexFlag(vars[2], 0))
- r10 = 1;
- if (r10)
- {
- asm(""); //Needed to match for some reason
- gPokedexView->unk0[r5].dexNum = vars[2];
- gPokedexView->unk0[r5].seen = GetNationalPokedexFlag(vars[2], 0);
- gPokedexView->unk0[r5].owned = GetNationalPokedexFlag(vars[2], 1);
- if (gPokedexView->unk0[r5].seen)
- gPokedexView->unk60C = r5 + 1;
- r5++;
- }
+ asm(""); //Needed to match for some reason
+ gPokedexView->unk0[r5].dexNum = vars[2];
+ gPokedexView->unk0[r5].seen = GetNationalPokedexFlag(vars[2], 0);
+ gPokedexView->unk0[r5].owned = GetNationalPokedexFlag(vars[2], 1);
+ if (gPokedexView->unk0[r5].seen)
+ gPokedexView->unk60C = r5 + 1;
+ r5++;
}
}
- break;
}
- case 1:
- for (i = 0; i < 411; i++)
- {
- vars[2] = gPokedexOrder_Alphabetical[i];
+ break;
+ }
+ case 1:
+ for (i = 0; i < 411; i++)
+ {
+ vars[2] = gPokedexOrder_Alphabetical[i];
- if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 0))
- {
- gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
- gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
- gPokedexView->unk0[gPokedexView->unk60C].owned = GetNationalPokedexFlag(vars[2], 1);
- gPokedexView->unk60C++;
- }
- }
- break;
- case 2:
- for (i = 385; i >= 0; i--)
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 0))
{
- vars[2] = gPokedexOrder_Weight[i];
-
- if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1))
- {
- gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
- gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
- gPokedexView->unk0[gPokedexView->unk60C].owned = 1;
- gPokedexView->unk60C++;
- }
+ gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
+ gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
+ gPokedexView->unk0[gPokedexView->unk60C].owned = GetNationalPokedexFlag(vars[2], 1);
+ gPokedexView->unk60C++;
}
- break;
- case 3:
- for (i = 0; i < 386; i++)
- {
- vars[2] = gPokedexOrder_Weight[i];
+ }
+ break;
+ case 2:
+ for (i = 385; i >= 0; i--)
+ {
+ vars[2] = gPokedexOrder_Weight[i];
- if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1))
- {
- gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
- gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
- gPokedexView->unk0[gPokedexView->unk60C].owned = 1;
- gPokedexView->unk60C++;
- }
- }
- break;
- case 4:
- for (i = 385; i >=0; i--)
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1))
{
- vars[2] = gPokedexOrder_Height[i];
+ gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
+ gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
+ gPokedexView->unk0[gPokedexView->unk60C].owned = 1;
+ gPokedexView->unk60C++;
+ }
+ }
+ break;
+ case 3:
+ for (i = 0; i < 386; i++)
+ {
+ vars[2] = gPokedexOrder_Weight[i];
- if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1))
- {
- gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
- gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
- gPokedexView->unk0[gPokedexView->unk60C].owned = 1;
- gPokedexView->unk60C++;
- }
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1))
+ {
+ gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
+ gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
+ gPokedexView->unk0[gPokedexView->unk60C].owned = 1;
+ gPokedexView->unk60C++;
}
- break;
- case 5:
- for (i = 0; i < 386; i++)
+ }
+ break;
+ case 4:
+ for (i = 385; i >=0; i--)
+ {
+ vars[2] = gPokedexOrder_Height[i];
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1))
{
- vars[2] = gPokedexOrder_Height[i];
+ gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
+ gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
+ gPokedexView->unk0[gPokedexView->unk60C].owned = 1;
+ gPokedexView->unk60C++;
+ }
+ }
+ break;
+ case 5:
+ for (i = 0; i < 386; i++)
+ {
+ vars[2] = gPokedexOrder_Height[i];
- if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1))
- {
- gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
- gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
- gPokedexView->unk0[gPokedexView->unk60C].owned = 1;
- gPokedexView->unk60C++;
- }
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && GetNationalPokedexFlag(vars[2], 1))
+ {
+ gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
+ gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
+ gPokedexView->unk0[gPokedexView->unk60C].owned = 1;
+ gPokedexView->unk60C++;
}
- break;
+ }
+ break;
}
for (i = gPokedexView->unk60C; i < 386; i++)
{
@@ -969,87 +963,87 @@ void sub_808DBE8(u8 a, u16 b, u16 c)
{
switch (a)
{
- case 0:
- default:
- {
- u16 i;
- s16 _b = b - 5;
+ case 0:
+ default:
+ {
+ u16 i;
+ s16 _b = b - 5;
- for (i = 0; i <= 10; i++)
- {
- if ((u16)_b > 385 || gPokedexView->unk0[_b].dexNum == 0xFFFF)
- sub_808E090(0x11, i * 2, c);
- else
- {
- sub_808E090(0x11, i * 2, c);
- if (gPokedexView->unk0[_b].seen)
- {
- sub_808DEB0(_b, 0x12, i * 2, c);
- sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, i * 2, c);
- sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, i * 2);
- }
- else
- {
- sub_808DEB0(_b, 0x12, i * 2, c);
- sub_808DF88(0, 0x11, i * 2, c);
- sub_808DFE4(0, 0x17, i * 2);
- }
- }
- _b++;
- }
- break;
- }
- case 1:
+ for (i = 0; i <= 10; i++)
{
- s16 _b = b - 5;
-
if ((u16)_b > 385 || gPokedexView->unk0[_b].dexNum == 0xFFFF)
- sub_808E090(0x11, gPokedexView->unk630 * 2, c);
+ sub_808E090(0x11, i * 2, c);
else
{
- sub_808E090(0x11, gPokedexView->unk630 * 2, c);
+ sub_808E090(0x11, i * 2, c);
if (gPokedexView->unk0[_b].seen)
{
- sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c);
- sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, gPokedexView->unk630 * 2, c);
- sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, gPokedexView->unk630 * 2);
+ sub_808DEB0(_b, 0x12, i * 2, c);
+ sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, i * 2, c);
+ sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, i * 2);
}
else
{
- sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c);
- sub_808DF88(0, 0x11, gPokedexView->unk630 * 2, c);
- sub_808DFE4(0, 0x17, gPokedexView->unk630 * 2);
+ sub_808DEB0(_b, 0x12, i * 2, c);
+ sub_808DF88(0, 0x11, i * 2, c);
+ sub_808DFE4(0, 0x17, i * 2);
}
}
- break;
+ _b++;
}
- case 2:
+ break;
+ }
+ case 1:
+ {
+ s16 _b = b - 5;
+
+ if ((u16)_b > 385 || gPokedexView->unk0[_b].dexNum == 0xFFFF)
+ sub_808E090(0x11, gPokedexView->unk630 * 2, c);
+ else
{
- s16 _b = b + 5;
- u16 r2 = gPokedexView->unk630 + 10;
+ sub_808E090(0x11, gPokedexView->unk630 * 2, c);
+ if (gPokedexView->unk0[_b].seen)
+ {
+ sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c);
+ sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, gPokedexView->unk630 * 2, c);
+ sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, gPokedexView->unk630 * 2);
+ }
+ else
+ {
+ sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c);
+ sub_808DF88(0, 0x11, gPokedexView->unk630 * 2, c);
+ sub_808DFE4(0, 0x17, gPokedexView->unk630 * 2);
+ }
+ }
+ break;
+ }
+ case 2:
+ {
+ s16 _b = b + 5;
+ u16 r2 = gPokedexView->unk630 + 10;
- if (r2 > 15)
- r2 -= 16;
- if ((u16)_b > 385 || gPokedexView->unk0[_b].dexNum == 0xFFFF)
- sub_808E090(0x11, r2 * 2, c);
+ if (r2 > 15)
+ r2 -= 16;
+ if ((u16)_b > 385 || gPokedexView->unk0[_b].dexNum == 0xFFFF)
+ sub_808E090(0x11, r2 * 2, c);
+ else
+ {
+ sub_808E090(0x11, r2 * 2, c);
+ if (gPokedexView->unk0[_b].seen)
+ {
+ sub_808DEB0(_b, 0x12, r2 * 2, c);
+ sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, r2 * 2, c);
+ sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, r2 * 2);
+ }
else
{
- sub_808E090(0x11, r2 * 2, c);
- if (gPokedexView->unk0[_b].seen)
- {
- sub_808DEB0(_b, 0x12, r2 * 2, c);
- sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, r2 * 2, c);
- sub_808DFE4(gPokedexView->unk0[_b].dexNum, 0x17, r2 * 2);
- }
- else
- {
- sub_808DEB0(_b, 0x12, r2 * 2, c);
- sub_808DF88(0, 0x11, r2 * 2, c);
- sub_808DFE4(0, 0x17, r2 * 2);
- }
+ sub_808DEB0(_b, 0x12, r2 * 2, c);
+ sub_808DF88(0, 0x11, r2 * 2, c);
+ sub_808DFE4(0, 0x17, r2 * 2);
}
- break;
}
+ break;
+ }
}
}
@@ -1268,26 +1262,26 @@ bool8 sub_808E208(u8 a, u8 b, u8 c)
gPokedexView->unk62E--;
switch (a)
{
- case 1:
- for (i = 0; i < 4; i++)
- {
- if (gPokedexView->unk61E[i] != 0xFFFF)
- gSprites[gPokedexView->unk61E[i]].data5 += b;
- }
- foo = 16 * (c - gPokedexView->unk62E) / c;
- REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 - foo;
- gPokedexView->unk62C -= gPokedexView->unk628;
- break;
- case 2:
- for (i = 0; i < 4; i++)
- {
- if (gPokedexView->unk61E[i] != 0xFFFF)
- gSprites[gPokedexView->unk61E[i]].data5 -= b;
- }
- foo = 16 * (c - gPokedexView->unk62E) / c;
- REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 + foo;
- gPokedexView->unk62C += gPokedexView->unk628;
- break;
+ case 1:
+ for (i = 0; i < 4; i++)
+ {
+ if (gPokedexView->unk61E[i] != 0xFFFF)
+ gSprites[gPokedexView->unk61E[i]].data5 += b;
+ }
+ foo = 16 * (c - gPokedexView->unk62E) / c;
+ REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 - foo;
+ gPokedexView->unk62C -= gPokedexView->unk628;
+ break;
+ case 2:
+ for (i = 0; i < 4; i++)
+ {
+ if (gPokedexView->unk61E[i] != 0xFFFF)
+ gSprites[gPokedexView->unk61E[i]].data5 -= b;
+ }
+ foo = 16 * (c - gPokedexView->unk62E) / c;
+ REG_BG2VOFS = gPokedexView->unk62D + gPokedexView->unk632 * 16 + foo;
+ gPokedexView->unk62C += gPokedexView->unk628;
+ break;
}
return 0;
}
@@ -1307,36 +1301,36 @@ void sub_808E398(u8 a, u16 b)
gPokedexView->unk632 = gPokedexView->unk630;
switch (a)
{
- case 1:
+ case 1:
+ {
+ unk = sub_808E888(b - 1);
+ if (unk != 0xFFFF)
{
- unk = sub_808E888(b - 1);
- if (unk != 0xFFFF)
- {
- spriteId = sub_808E8C8(unk, 0x60, 0x50);
- gSprites[spriteId].callback = sub_808EE28;
- gSprites[spriteId].data5 = 0xFFC0;
- }
- if (gPokedexView->unk630 > 0)
- gPokedexView->unk630--;
- else
- gPokedexView->unk630 = 0xF;
- break;
+ spriteId = sub_808E8C8(unk, 0x60, 0x50);
+ gSprites[spriteId].callback = sub_808EE28;
+ gSprites[spriteId].data5 = 0xFFC0;
}
- case 2:
+ if (gPokedexView->unk630 > 0)
+ gPokedexView->unk630--;
+ else
+ gPokedexView->unk630 = 0xF;
+ break;
+ }
+ case 2:
+ {
+ unk = sub_808E888(b + 1);
+ if (unk != 0xFFFF)
{
- unk = sub_808E888(b + 1);
- if (unk != 0xFFFF)
- {
- spriteId = sub_808E8C8(unk, 0x60, 0x50);
- gSprites[spriteId].callback = sub_808EE28;
- gSprites[spriteId].data5 = 0x40;
- }
- if (gPokedexView->unk630 <= 0xE)
- gPokedexView->unk630++;
- else
- gPokedexView->unk630 = 0;
- break;
+ spriteId = sub_808E8C8(unk, 0x60, 0x50);
+ gSprites[spriteId].callback = sub_808EE28;
+ gSprites[spriteId].data5 = 0x40;
}
+ if (gPokedexView->unk630 <= 0xE)
+ gPokedexView->unk630++;
+ else
+ gPokedexView->unk630 = 0;
+ break;
+ }
}
}
#ifdef NONMATCHING
@@ -2206,126 +2200,126 @@ void Task_InitPageScreenMultistep(u8 taskId)
{
switch (gMain.state)
{
- case 0:
- default:
- if (!gPaletteFade.active)
- {
- u16 r2;
-
- gPokedexView->unk64A = 1;
- gPokedexView->unk64E = 0;
- gUnknown_03005CEC = gMain.vblankCallback;
- SetVBlankCallback(NULL);
- r2 = 0;
- if (gTasks[taskId].data[1] != 0)
- r2 += 0x1000;
- if (gTasks[taskId].data[2] != 0)
- r2 |= 0x200;
- sub_8091060(r2);
- gMain.state = 1;
- }
- break;
- case 1:
- LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM);
- LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800));
- sub_8091738(gUnknown_0202FFBC->dexNum, 2, 0x3FC);
- gMain.state++;
- break;
- case 2:
- sub_80904FC(0xD);
- sub_8090584(gPokedexView->selectedScreen, 0xD);
- sub_808D640();
- gMain.state++;
- break;
- case 3:
- SetUpWindowConfig(&gWindowConfig_81E7064);
- InitMenuWindow(&gWindowConfig_81E7064);
- gMain.state++;
- break;
- case 4:
- if (gPokedexView->dexMode == DEX_MODE_HOENN)
- sub_8091154(NationalToHoennOrder(gUnknown_0202FFBC->dexNum), 0xD, 3);
- else
- sub_8091154(gUnknown_0202FFBC->dexNum, 0xD, 3);
- //_0808F45A
- sub_80911C8(gUnknown_0202FFBC->dexNum, 0x10, 3);
- MenuPrint(gDexText_UnknownPoke, 11, 5);
- MenuPrint(gDexText_UnknownHeight, 16, 7);
- MenuPrint(gDexText_UnknownWeight, 16, 9);
- if (gUnknown_0202FFBC->owned)
- {
- sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, 11, 5);
- sub_8091458(gPokedexEntries[gUnknown_0202FFBC->dexNum].height, 16, 7);
- sub_8091564(gPokedexEntries[gUnknown_0202FFBC->dexNum].weight, 16, 9);
- MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13);
- sub_80917CC(14, 0x3FC);
- }
- //_0808F50C
- else
- {
- MenuPrint(gUnknown_083A05F8, 2, 13);
- LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E);
- }
- gMain.state++;
- break;
- case 5:
- if (gTasks[taskId].data[1] == 0)
- {
- //_0808F540
- gTasks[taskId].data[4] = (u16)sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0);
- gSprites[gTasks[taskId].data[4]].oam.priority = 0;
- }
- gMain.state++;
- break;
- case 6:
+ case 0:
+ default:
+ if (!gPaletteFade.active)
{
- u32 r3 = 0;
+ u16 r2;
- if (gTasks[taskId].data[2] != 0)
- r3 = 0x14;
+ gPokedexView->unk64A = 1;
+ gPokedexView->unk64E = 0;
+ gUnknown_03005CEC = gMain.vblankCallback;
+ SetVBlankCallback(NULL);
+ r2 = 0;
if (gTasks[taskId].data[1] != 0)
- {
- r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 0x10));
- }
- BeginNormalPaletteFade(~r3, 0, 0x10, 0, 0);
- SetVBlankCallback(gUnknown_03005CEC);
- gMain.state++;
- break;
+ r2 += 0x1000;
+ if (gTasks[taskId].data[2] != 0)
+ r2 |= 0x200;
+ sub_8091060(r2);
+ gMain.state = 1;
}
- case 7:
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BLDY = 0;
- REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
+ break;
+ case 1:
+ LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM);
+ LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800));
+ sub_8091738(gUnknown_0202FFBC->dexNum, 2, 0x3FC);
+ gMain.state++;
+ break;
+ case 2:
+ sub_80904FC(0xD);
+ sub_8090584(gPokedexView->selectedScreen, 0xD);
+ sub_808D640();
+ gMain.state++;
+ break;
+ case 3:
+ SetUpWindowConfig(&gWindowConfig_81E7064);
+ InitMenuWindow(&gWindowConfig_81E7064);
+ gMain.state++;
+ break;
+ case 4:
+ if (gPokedexView->dexMode == DEX_MODE_HOENN)
+ sub_8091154(NationalToHoennOrder(gUnknown_0202FFBC->dexNum), 0xD, 3);
+ else
+ sub_8091154(gUnknown_0202FFBC->dexNum, 0xD, 3);
+ //_0808F45A
+ sub_80911C8(gUnknown_0202FFBC->dexNum, 0x10, 3);
+ MenuPrint(gDexText_UnknownPoke, 11, 5);
+ MenuPrint(gDexText_UnknownHeight, 16, 7);
+ MenuPrint(gDexText_UnknownWeight, 16, 9);
+ if (gUnknown_0202FFBC->owned)
+ {
+ sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, 11, 5);
+ sub_8091458(gPokedexEntries[gUnknown_0202FFBC->dexNum].height, 16, 7);
+ sub_8091564(gPokedexEntries[gUnknown_0202FFBC->dexNum].weight, 16, 9);
+ MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13);
+ sub_80917CC(14, 0x3FC);
+ }
+ //_0808F50C
+ else
+ {
+ MenuPrint(gUnknown_083A05F8, 2, 13);
+ LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E);
+ }
+ gMain.state++;
+ break;
+ case 5:
+ if (gTasks[taskId].data[1] == 0)
+ {
+ //_0808F540
+ gTasks[taskId].data[4] = (u16)sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0);
+ gSprites[gTasks[taskId].data[4]].oam.priority = 0;
+ }
+ gMain.state++;
+ break;
+ case 6:
+ {
+ u32 r3 = 0;
+
+ if (gTasks[taskId].data[2] != 0)
+ r3 = 0x14;
+ if (gTasks[taskId].data[1] != 0)
+ {
+ r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 0x10));
+ }
+ BeginNormalPaletteFade(~r3, 0, 0x10, 0, 0);
+ SetVBlankCallback(gUnknown_03005CEC);
+ gMain.state++;
+ break;
+ }
+ case 7:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
+ gMain.state++;
+ break;
+ case 8:
+ if (!gPaletteFade.active)
+ {
gMain.state++;
- break;
- case 8:
- if (!gPaletteFade.active)
+ if (gTasks[taskId].data[3] == 0)
{
- gMain.state++;
- if (gTasks[taskId].data[3] == 0)
- {
- StopCryAndClearCrySongs();
- PlayCry2(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), 0, 0x7D, 0xA);
- }
- else
- gMain.state++;
+ StopCryAndClearCrySongs();
+ PlayCry2(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), 0, 0x7D, 0xA);
}
- break;
- case 9:
- if (!IsCryPlayingOrClearCrySongs())
+ else
gMain.state++;
- break;
- case 10:
- gTasks[taskId].data[0] = 0;
- gTasks[taskId].data[1] = 0;
- gTasks[taskId].data[2] = 1;
- gTasks[taskId].data[3] = 1;
- gTasks[taskId].func = Task_PageScreenProcessInput;
- gMain.state = 0;
- break;
+ }
+ break;
+ case 9:
+ if (!IsCryPlayingOrClearCrySongs())
+ gMain.state++;
+ break;
+ case 10:
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 1;
+ gTasks[taskId].data[3] = 1;
+ gTasks[taskId].func = Task_PageScreenProcessInput;
+ gMain.state = 0;
+ break;
}
}
@@ -2462,99 +2456,99 @@ void Task_InitCryScreenMultistep(u8 taskId)
{
switch (gMain.state)
{
- case 0:
- default:
- if (!gPaletteFade.active)
- {
- m4aMPlayStop(&gMPlay_BGM);
- gPokedexView->unk64A = 6;
- gUnknown_03005CEC = gMain.vblankCallback;
- SetVBlankCallback(NULL);
- sub_8091060(0x200);
- gPokedexView->selectedScreen = CRY_SCREEN;
- gMain.state = 1;
- }
- break;
- case 1:
- LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM);
- LZ77UnCompVram(gUnknown_0839F8A0, (void *)(VRAM + 0x7000));
- gMain.state++;
- break;
- case 2:
- sub_8090540(0xD);
- sub_8090644(2, 0xD);
- sub_808D640();
- DmaClear16(3, (void *)(VRAM + 0xF800), 0x500);
- gMain.state++;
- break;
- case 3:
- SetUpWindowConfig(&gWindowConfig_81E702C);
- InitMenuWindow(&gWindowConfig_81E702C);
- ResetPaletteFade();
- gMain.state++;
- break;
- case 4:
- MenuPrint(gDexText_CryOf, 10, 4);
- sub_8091260(gUnknown_0202FFBC->dexNum, 10, 6, 2);
- gMain.state++;
- break;
- case 5:
- gTasks[taskId].data[4] = sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0);
- gSprites[gTasks[taskId].data[4]].oam.priority = 0;
- gUnknown_03005E98 = 0;
- gMain.state++;
- break;
- case 6:
+ case 0:
+ default:
+ if (!gPaletteFade.active)
{
- struct CryRelatedStruct sp8;
-
- sp8.unk0 = 0x4020;
- sp8.unk2 = 0x1F;
- sp8.paletteNo = 8;
- sp8.yPos = 0x1E;
- sp8.xPos = 0xC;
- if (sub_8119E3C(&sp8, 0) != 0)
- {
- gMain.state++;
- gUnknown_03005E98 = 0;
- }
- break;
+ m4aMPlayStop(&gMPlay_BGM);
+ gPokedexView->unk64A = 6;
+ gUnknown_03005CEC = gMain.vblankCallback;
+ SetVBlankCallback(NULL);
+ sub_8091060(0x200);
+ gPokedexView->selectedScreen = CRY_SCREEN;
+ gMain.state = 1;
}
- case 7:
- {
- struct CryRelatedStruct sp10;
+ break;
+ case 1:
+ LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM);
+ LZ77UnCompVram(gUnknown_0839F8A0, (void *)(VRAM + 0x7000));
+ gMain.state++;
+ break;
+ case 2:
+ sub_8090540(0xD);
+ sub_8090644(2, 0xD);
+ sub_808D640();
+ DmaClear16(3, (void *)(VRAM + 0xF800), 0x500);
+ gMain.state++;
+ break;
+ case 3:
+ SetUpWindowConfig(&gWindowConfig_81E702C);
+ InitMenuWindow(&gWindowConfig_81E702C);
+ ResetPaletteFade();
+ gMain.state++;
+ break;
+ case 4:
+ MenuPrint(gDexText_CryOf, 10, 4);
+ sub_8091260(gUnknown_0202FFBC->dexNum, 10, 6, 2);
+ gMain.state++;
+ break;
+ case 5:
+ gTasks[taskId].data[4] = sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0);
+ gSprites[gTasks[taskId].data[4]].oam.priority = 0;
+ gUnknown_03005E98 = 0;
+ gMain.state++;
+ break;
+ case 6:
+ {
+ struct CryRelatedStruct sp8;
- sp10.unk0 = 0x3000;
- sp10.unk2 = 0xE;
- sp10.paletteNo = 9;
- sp10.xPos = 0x12;
- sp10.yPos = 3;
- if (ShowPokedexCryScreen(&sp10, 1) != 0)
- {
- gMain.state++;
- }
- break;
- }
- case 8:
- BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0);
- SetVBlankCallback(gUnknown_03005CEC);
+ sp8.unk0 = 0x4020;
+ sp8.unk2 = 0x1F;
+ sp8.paletteNo = 8;
+ sp8.yPos = 0x1E;
+ sp8.xPos = 0xC;
+ if (sub_8119E3C(&sp8, 0) != 0)
+ {
gMain.state++;
- break;
- case 9:
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BLDY = 0;
- REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+ gUnknown_03005E98 = 0;
+ }
+ break;
+ }
+ case 7:
+ {
+ struct CryRelatedStruct sp10;
+
+ sp10.unk0 = 0x3000;
+ sp10.unk2 = 0xE;
+ sp10.paletteNo = 9;
+ sp10.xPos = 0x12;
+ sp10.yPos = 3;
+ if (ShowPokedexCryScreen(&sp10, 1) != 0)
+ {
gMain.state++;
- break;
- case 10:
- gPokedexView->unk64F = 0;
- gMain.state = 0;
- gTasks[taskId].func = Task_CryScreenProcessInput;
- break;
+ }
+ break;
+ }
+ case 8:
+ BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0);
+ SetVBlankCallback(gUnknown_03005CEC);
+ gMain.state++;
+ break;
+ case 9:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG1CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+ gMain.state++;
+ break;
+ case 10:
+ gPokedexView->unk64F = 0;
+ gMain.state = 0;
+ gTasks[taskId].func = Task_CryScreenProcessInput;
+ break;
}
}
@@ -2616,15 +2610,15 @@ void sub_808FFBC(u8 taskId)
DestroyCryMeterNeedleSprite();
switch (gPokedexView->unk64F)
{
- default:
- case 1:
- gTasks[taskId].func = Task_InitPageScreenMultistep;
- break;
- case 2:
- gTasks[taskId].func = Task_InitAreaScreenMultistep;
- break;
- case 3:
- gTasks[taskId].func = Task_InitSizeScreenMultistep;
+ default:
+ case 1:
+ gTasks[taskId].func = Task_InitPageScreenMultistep;
+ break;
+ case 2:
+ gTasks[taskId].func = Task_InitAreaScreenMultistep;
+ break;
+ case 3:
+ gTasks[taskId].func = Task_InitSizeScreenMultistep;
}
}
}
@@ -2646,87 +2640,87 @@ void Task_InitSizeScreenMultistep(u8 taskId)
switch (gMain.state)
{
- default:
- case 0:
- if (!gPaletteFade.active)
- {
- gPokedexView->unk64A = 7;
- gUnknown_03005CEC = gMain.vblankCallback;
- SetVBlankCallback(NULL);
- sub_8091060(0x200);
- gPokedexView->selectedScreen = SIZE_SCREEN;
- gMain.state = 1;
- }
- break;
- case 1:
- LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM);
- LZ77UnCompVram(gUnknown_0839F988, (void *)(VRAM + 0x7000));
- gMain.state++;
- break;
- case 2:
- sub_8090540(0xD);
- sub_8090644(3, 0xD);
- sub_808D640();
- gMain.state++;
- break;
- case 3:
+ default:
+ case 0:
+ if (!gPaletteFade.active)
{
- u8 string[40]; //I hope this is the correct size
+ gPokedexView->unk64A = 7;
+ gUnknown_03005CEC = gMain.vblankCallback;
+ SetVBlankCallback(NULL);
+ sub_8091060(0x200);
+ gPokedexView->selectedScreen = SIZE_SCREEN;
+ gMain.state = 1;
+ }
+ break;
+ case 1:
+ LZ77UnCompVram(gPokedexMenu_Gfx, (void *)VRAM);
+ LZ77UnCompVram(gUnknown_0839F988, (void *)(VRAM + 0x7000));
+ gMain.state++;
+ break;
+ case 2:
+ sub_8090540(0xD);
+ sub_8090644(3, 0xD);
+ sub_808D640();
+ gMain.state++;
+ break;
+ case 3:
+ {
+ u8 string[40]; //I hope this is the correct size
- SetUpWindowConfig(&gWindowConfig_81E702C);
- InitMenuWindow(&gWindowConfig_81E702C);
- string[0] = EOS;
- StringAppend(string, gDexText_SizeComparedTo);
- StringAppend(string, gSaveBlock2.playerName);
- sub_8072BD8(string, 3, 15, 0xC0);
- gMain.state++;
- break;
+ SetUpWindowConfig(&gWindowConfig_81E702C);
+ InitMenuWindow(&gWindowConfig_81E702C);
+ string[0] = EOS;
+ StringAppend(string, gDexText_SizeComparedTo);
+ StringAppend(string, gSaveBlock2.playerName);
+ sub_8072BD8(string, 3, 15, 0xC0);
+ gMain.state++;
+ break;
+ }
+ case 4:
+ ResetPaletteFade();
+ gMain.state++;
+ break;
+ case 5:
+ spriteId = sub_8091A4C(gSaveBlock2.playerGender, 0x98, 0x38, 0);
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].oam.matrixNum = 1;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerOffset;
+ SetOamMatrix(1, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale);
+ LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20);
+ gMain.state++;
+ break;
+ case 6:
+ spriteId = sub_80918EC(gUnknown_0202FFBC->dexNum, 0x58, 0x38, 1);
+ gSprites[spriteId].oam.affineMode = 1;
+ gSprites[spriteId].oam.matrixNum = 2;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonOffset;
+ SetOamMatrix(2, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale);
+ LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20);
+ gMain.state++;
+ break;
+ case 7:
+ BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0);
+ SetVBlankCallback(gUnknown_03005CEC);
+ gMain.state++;
+ break;
+ case 8:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
+ gMain.state++;
+ break;
+ case 9:
+ if (!gPaletteFade.active)
+ {
+ gPokedexView->unk64F = 0;
+ gMain.state = 0;
+ gTasks[taskId].func = Task_SizeScreenProcessInput;
}
- case 4:
- ResetPaletteFade();
- gMain.state++;
- break;
- case 5:
- spriteId = sub_8091A4C(gSaveBlock2.playerGender, 0x98, 0x38, 0);
- gSprites[spriteId].oam.affineMode = 1;
- gSprites[spriteId].oam.matrixNum = 1;
- gSprites[spriteId].oam.priority = 0;
- gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerOffset;
- SetOamMatrix(1, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].trainerScale);
- LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20);
- gMain.state++;
- break;
- case 6:
- spriteId = sub_80918EC(gUnknown_0202FFBC->dexNum, 0x58, 0x38, 1);
- gSprites[spriteId].oam.affineMode = 1;
- gSprites[spriteId].oam.matrixNum = 2;
- gSprites[spriteId].oam.priority = 0;
- gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonOffset;
- SetOamMatrix(2, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale, 0, 0, gPokedexEntries[gUnknown_0202FFBC->dexNum].pokemonScale);
- LoadPalette(gUnknown_083B4EC4, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20);
- gMain.state++;
- break;
- case 7:
- BeginNormalPaletteFade(-0x15, 0, 0x10, 0, 0);
- SetVBlankCallback(gUnknown_03005CEC);
- gMain.state++;
- break;
- case 8:
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BLDY = 0;
- REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
- gMain.state++;
- break;
- case 9:
- if (!gPaletteFade.active)
- {
- gPokedexView->unk64F = 0;
- gMain.state = 0;
- gTasks[taskId].func = Task_SizeScreenProcessInput;
- }
- break;
+ break;
}
}
@@ -3094,81 +3088,81 @@ void sub_8090750(u8 taskId)
switch (gTasks[taskId].data[0])
{
- default:
- case 0:
- if (!gPaletteFade.active)
- {
- gUnknown_03005CEC = gMain.vblankCallback;
- SetVBlankCallback(NULL);
- sub_8091060(0x100);
- gTasks[taskId].data[0] = 1;
- }
- break;
- case 1:
+ default:
+ case 0:
+ if (!gPaletteFade.active)
{
- u16 i;
-
- LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM + 0x4000));
- LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800));
- for (i = 0; i < 0x280; i++)
- ((u16 *)(VRAM + 0x7800))[i] += 0x2000;
- sub_8091738(gTasks[taskId].data[1], 2, 0x3FC);
- ResetPaletteFade();
- LoadPalette(gPokedexMenu_Pal + 2, 0x21, 0x9E);
- gTasks[taskId].data[0]++;
- break;
+ gUnknown_03005CEC = gMain.vblankCallback;
+ SetVBlankCallback(NULL);
+ sub_8091060(0x100);
+ gTasks[taskId].data[0] = 1;
}
- case 2:
- SetUpWindowConfig(&gWindowConfig_81E7064);
- InitMenuWindow(&gWindowConfig_81E7064);
- DmaClear16(3, (void *)(VRAM + 0xC000), 0x200);
- gTasks[taskId].data[0]++;
- break;
- case 3:
- sub_8072BD8(gDexText_RegisterComplete, 2, 0, 0xD0);
- if (!IsNationalPokedexEnabled())
- sub_8091154(NationalToHoennOrder(dexNum), 13, 3);
- else
- sub_8091154(dexNum, 13, 3);
- sub_80911C8(dexNum, 16, 3);
- MenuPrint(gDexText_UnknownPoke, 11, 5);
- MenuPrint(gDexText_UnknownHeight, 16, 7);
- MenuPrint(gDexText_UnknownWeight, 16, 9);
- sub_8091304(&gPokedexEntries[dexNum], 11, 5);
- sub_8091458(gPokedexEntries[dexNum].height, 16, 7);
- sub_8091564(gPokedexEntries[dexNum].weight, 16, 9);
- MenuPrint(gPokedexEntries[dexNum].descriptionPage1, 2, 13);
- sub_80917CC(14, 0x3FC);
- gTasks[taskId].data[0]++;
- break;
- case 4:
- {
- u8 spriteId = sub_80918EC(dexNum, 0x30, 0x38, 0);
+ break;
+ case 1:
+ {
+ u16 i;
- gSprites[spriteId].oam.priority = 0;
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
- SetVBlankCallback(gUnknown_03005CEC);
- gTasks[taskId].data[3] = spriteId;
- gTasks[taskId].data[0]++;
- break;
+ LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM + 0x4000));
+ LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800));
+ for (i = 0; i < 0x280; i++)
+ ((u16 *)(VRAM + 0x7800))[i] += 0x2000;
+ sub_8091738(gTasks[taskId].data[1], 2, 0x3FC);
+ ResetPaletteFade();
+ LoadPalette(gPokedexMenu_Pal + 2, 0x21, 0x9E);
+ gTasks[taskId].data[0]++;
+ break;
+ }
+ case 2:
+ SetUpWindowConfig(&gWindowConfig_81E7064);
+ InitMenuWindow(&gWindowConfig_81E7064);
+ DmaClear16(3, (void *)(VRAM + 0xC000), 0x200);
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ sub_8072BD8(gDexText_RegisterComplete, 2, 0, 0xD0);
+ if (!IsNationalPokedexEnabled())
+ sub_8091154(NationalToHoennOrder(dexNum), 13, 3);
+ else
+ sub_8091154(dexNum, 13, 3);
+ sub_80911C8(dexNum, 16, 3);
+ MenuPrint(gDexText_UnknownPoke, 11, 5);
+ MenuPrint(gDexText_UnknownHeight, 16, 7);
+ MenuPrint(gDexText_UnknownWeight, 16, 9);
+ sub_8091304(&gPokedexEntries[dexNum], 11, 5);
+ sub_8091458(gPokedexEntries[dexNum].height, 16, 7);
+ sub_8091564(gPokedexEntries[dexNum].weight, 16, 9);
+ MenuPrint(gPokedexEntries[dexNum].descriptionPage1, 2, 13);
+ sub_80917CC(14, 0x3FC);
+ gTasks[taskId].data[0]++;
+ break;
+ case 4:
+ {
+ u8 spriteId = sub_80918EC(dexNum, 0x30, 0x38, 0);
+
+ gSprites[spriteId].oam.priority = 0;
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ SetVBlankCallback(gUnknown_03005CEC);
+ gTasks[taskId].data[3] = spriteId;
+ gTasks[taskId].data[0]++;
+ break;
+ }
+ case 5:
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
+ gTasks[taskId].data[0]++;
+ break;
+ case 6:
+ if (!gPaletteFade.active)
+ {
+ PlayCry1(NationalPokedexNumToSpecies(dexNum), 0);
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[4] = 0;
+ gTasks[taskId].func = sub_8090A3C;
}
- case 5:
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- REG_BLDY = 0;
- REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(15) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
- gTasks[taskId].data[0]++;
- break;
- case 6:
- if (!gPaletteFade.active)
- {
- PlayCry1(NationalPokedexNumToSpecies(dexNum), 0);
- gTasks[taskId].data[2] = 0;
- gTasks[taskId].data[4] = 0;
- gTasks[taskId].func = sub_8090A3C;
- }
- break;
+ break;
}
}
*/
diff --git a/src/pokemon_1.c b/src/pokemon_1.c
index 204fa7b9a..dacbb81c3 100644
--- a/src/pokemon_1.c
+++ b/src/pokemon_1.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "asm.h"
+#include "data2.h"
#include "items.h"
#include "main.h"
#include "pokemon.h"
@@ -25,7 +26,6 @@ extern u8 byte_2024E88;
extern u32 gExperienceTables[8][101];
extern struct BaseStats gBaseStats[];
-extern struct BattleMove gBattleMoves[];
extern const u16 *gLevelUpLearnsets[];
void ZeroBoxMonData(struct BoxPokemon *boxMon)
diff --git a/src/pokemon_2.c b/src/pokemon_2.c
index 3be11f453..7fbfc1271 100644
--- a/src/pokemon_2.c
+++ b/src/pokemon_2.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "asm.h"
+#include "data2.h"
#include "event_data.h"
#include "main.h"
#include "pokemon.h"
@@ -8,6 +9,7 @@
#include "sprite.h"
#include "string_util.h"
#include "text.h"
+#include "strings2.h"
extern u8 gPlayerPartyCount;
extern struct Pokemon gPlayerParty[6];
@@ -34,16 +36,10 @@ extern u16 gTrainerBattleOpponent;
extern struct PokemonStorage gPokemonStorage;
extern u8 gBadEggNickname[];
-extern u8 gEggNickname[];
extern u32 gBitTable[];
extern struct BaseStats gBaseStats[];
-extern u8 gSpeciesNames[][11];
-extern struct BattleMove gBattleMoves[];
extern const struct SpriteTemplate gSpriteTemplate_8208288[];
-extern const union AmimCmd *const gSpriteAnimTable_81E7C64[];
//array of pointers to arrays of pointers to union AnimCmd (We probably need to typedef this.)
-extern const union AnimCmd *const *const gUnknown_081EC2A4[];
-extern const union AnimCmd *const *const gUnknown_081ECACC[];
extern u8 gTrainerClassToPicIndex[];
extern u8 gTrainerClassToNameIndex[];
extern u8 gSecretBaseTrainerClasses[];
@@ -417,307 +413,307 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data)
switch (field)
{
- case MON_DATA_PERSONALITY:
- retVal = boxMon->personality;
- break;
- case MON_DATA_OT_ID:
- retVal = boxMon->otId;
- break;
- case MON_DATA_NICKNAME:
+ case MON_DATA_PERSONALITY:
+ retVal = boxMon->personality;
+ break;
+ case MON_DATA_OT_ID:
+ retVal = boxMon->otId;
+ break;
+ case MON_DATA_NICKNAME:
+ {
+ if (boxMon->isBadEgg)
{
- if (boxMon->isBadEgg)
- {
- StringCopy(data, gBadEggNickname);
- retVal = StringLength(data);
- }
- else if (boxMon->isEgg)
- {
- StringCopy(data, gEggNickname);
- retVal = StringLength(data);
- }
- else
- {
- retVal = 0;
-
- while (retVal < POKEMON_NAME_LENGTH && boxMon->nickname[retVal] != EOS)
- {
- data[retVal] = boxMon->nickname[retVal];
- retVal++;
- }
-
- data[retVal] = EOS;
- ConvertInternationalString(data, boxMon->language);
- retVal = StringLength(data);
- }
- break;
+ StringCopy(data, gBadEggNickname);
+ retVal = StringLength(data);
}
- case MON_DATA_LANGUAGE:
- retVal = boxMon->language;
- break;
- case MON_DATA_SANITY_BIT1:
- retVal = boxMon->isBadEgg;
- break;
- case MON_DATA_SANITY_BIT2:
- retVal = boxMon->hasSpecies;
- break;
- case MON_DATA_SANITY_BIT3:
- retVal = boxMon->isEgg;
- break;
- case MON_DATA_OT_NAME:
+ else if (boxMon->isEgg)
+ {
+ StringCopy(data, gEggNickname);
+ retVal = StringLength(data);
+ }
+ else
{
retVal = 0;
- while (retVal < OT_NAME_LENGTH && boxMon->otName[retVal] != EOS)
+ while (retVal < POKEMON_NAME_LENGTH && boxMon->nickname[retVal] != EOS)
{
- data[retVal] = boxMon->otName[retVal];
+ data[retVal] = boxMon->nickname[retVal];
retVal++;
}
data[retVal] = EOS;
- break;
+ ConvertInternationalString(data, boxMon->language);
+ retVal = StringLength(data);
}
- case MON_DATA_MARKINGS:
- retVal = boxMon->markings;
- break;
- case MON_DATA_CHECKSUM:
- retVal = boxMon->checksum;
- break;
- case MON_DATA_10:
- retVal = boxMon->unknown;
- break;
- case MON_DATA_SPECIES:
- retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species;
- break;
- case MON_DATA_HELD_ITEM:
- retVal = substruct0->heldItem;
- break;
- case MON_DATA_EXP:
- retVal = substruct0->experience;
- break;
- case MON_DATA_PP_BONUSES:
- retVal = substruct0->ppBonuses;
- break;
- case MON_DATA_FRIENDSHIP:
- retVal = substruct0->friendship;
- break;
- case MON_DATA_MOVE1:
- case MON_DATA_MOVE2:
- case MON_DATA_MOVE3:
- case MON_DATA_MOVE4:
- retVal = substruct1->moves[field - MON_DATA_MOVE1];
- break;
- case MON_DATA_PP1:
- case MON_DATA_PP2:
- case MON_DATA_PP3:
- case MON_DATA_PP4:
- retVal = substruct1->pp[field - MON_DATA_PP1];
- break;
- case MON_DATA_HP_EV:
- retVal = substruct2->hpEV;
- break;
- case MON_DATA_ATK_EV:
- retVal = substruct2->attackEV;
- break;
- case MON_DATA_DEF_EV:
- retVal = substruct2->defenseEV;
- break;
- case MON_DATA_SPD_EV:
- retVal = substruct2->speedEV;
- break;
- case MON_DATA_SPATK_EV:
- retVal = substruct2->spAttackEV;
- break;
- case MON_DATA_SPDEF_EV:
- retVal = substruct2->spDefenseEV;
- break;
- case MON_DATA_COOL:
- retVal = substruct2->cool;
- break;
- case MON_DATA_BEAUTY:
- retVal = substruct2->beauty;
- break;
- case MON_DATA_CUTE:
- retVal = substruct2->cute;
- break;
- case MON_DATA_SMART:
- retVal = substruct2->smart;
- break;
- case MON_DATA_TOUGH:
- retVal = substruct2->tough;
- break;
- case MON_DATA_SHEEN:
- retVal = substruct2->sheen;
- break;
- case MON_DATA_POKERUS:
- retVal = substruct3->pokerus;
- break;
- case MON_DATA_MET_LOCATION:
- retVal = substruct3->metLocation;
- break;
- case MON_DATA_MET_LEVEL:
- retVal = substruct3->metLevel;
- break;
- case MON_DATA_MET_GAME:
- retVal = substruct3->metGame;
- break;
- case MON_DATA_POKEBALL:
- retVal = substruct3->pokeball;
- break;
- case MON_DATA_OT_GENDER:
- retVal = substruct3->otGender;
- break;
- case MON_DATA_HP_IV:
- retVal = substruct3->hpIV;
- break;
- case MON_DATA_ATK_IV:
- retVal = substruct3->attackIV;
- break;
- case MON_DATA_DEF_IV:
- retVal = substruct3->defenseIV;
- break;
- case MON_DATA_SPD_IV:
- retVal = substruct3->speedIV;
- break;
- case MON_DATA_SPATK_IV:
- retVal = substruct3->spAttackIV;
- break;
- case MON_DATA_SPDEF_IV:
- retVal = substruct3->spDefenseIV;
- break;
- case MON_DATA_IS_EGG:
- retVal = substruct3->isEgg;
- break;
- case MON_DATA_ALT_ABILITY:
- retVal = substruct3->altAbility;
- break;
- case MON_DATA_COOL_RIBBON:
- retVal = substruct3->coolRibbon;
- break;
- case MON_DATA_BEAUTY_RIBBON:
- retVal = substruct3->beautyRibbon;
- break;
- case MON_DATA_CUTE_RIBBON:
- retVal = substruct3->cuteRibbon;
- break;
- case MON_DATA_SMART_RIBBON:
- retVal = substruct3->smartRibbon;
- break;
- case MON_DATA_TOUGH_RIBBON:
- retVal = substruct3->toughRibbon;
- break;
- case MON_DATA_CHAMPION_RIBBON:
- retVal = substruct3->championRibbon;
- break;
- case MON_DATA_WINNING_RIBBON:
- retVal = substruct3->winningRibbon;
- break;
- case MON_DATA_VICTORY_RIBBON:
- retVal = substruct3->victoryRibbon;
- break;
- case MON_DATA_ARTIST_RIBBON:
- retVal = substruct3->artistRibbon;
- break;
- case MON_DATA_EFFORT_RIBBON:
- retVal = substruct3->effortRibbon;
- break;
- case MON_DATA_GIFT_RIBBON_1:
- retVal = substruct3->giftRibbon1;
- break;
- case MON_DATA_GIFT_RIBBON_2:
- retVal = substruct3->giftRibbon2;
- break;
- case MON_DATA_GIFT_RIBBON_3:
- retVal = substruct3->giftRibbon3;
- break;
- case MON_DATA_GIFT_RIBBON_4:
- retVal = substruct3->giftRibbon4;
- break;
- case MON_DATA_GIFT_RIBBON_5:
- retVal = substruct3->giftRibbon5;
- break;
- case MON_DATA_GIFT_RIBBON_6:
- retVal = substruct3->giftRibbon6;
- break;
- case MON_DATA_GIFT_RIBBON_7:
- retVal = substruct3->giftRibbon7;
- break;
- case MON_DATA_FATEFUL_ENCOUNTER:
- retVal = substruct3->fatefulEncounter;
- break;
- case MON_DATA_SPECIES2:
- retVal = substruct0->species;
- if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg))
- retVal = SPECIES_EGG;
- break;
- case MON_DATA_IVS:
- retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) | (substruct3->speedIV << 15) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25);
- break;
- case MON_DATA_KNOWN_MOVES:
- if (substruct0->species && !substruct3->isEgg)
- {
- u16 *moves = (u16 *)data;
- s32 i = 0;
-
- while (moves[i] != 355)
- {
- u16 move = moves[i];
- if (substruct1->moves[0] == move
- || substruct1->moves[1] == move
- || substruct1->moves[2] == move
- || substruct1->moves[3] == move)
- retVal |= gBitTable[i];
- i++;
- }
- }
- break;
- case MON_DATA_RIBBON_COUNT:
- retVal = 0;
- if (substruct0->species && !substruct3->isEgg)
- {
- retVal += substruct3->coolRibbon;
- retVal += substruct3->beautyRibbon;
- retVal += substruct3->cuteRibbon;
- retVal += substruct3->smartRibbon;
- retVal += substruct3->toughRibbon;
- retVal += substruct3->championRibbon;
- retVal += substruct3->winningRibbon;
- retVal += substruct3->victoryRibbon;
- retVal += substruct3->artistRibbon;
- retVal += substruct3->effortRibbon;
- retVal += substruct3->giftRibbon1;
- retVal += substruct3->giftRibbon2;
- retVal += substruct3->giftRibbon3;
- retVal += substruct3->giftRibbon4;
- retVal += substruct3->giftRibbon5;
- retVal += substruct3->giftRibbon6;
- retVal += substruct3->giftRibbon7;
- }
- break;
- case MON_DATA_RIBBONS:
- retVal = 0;
- if (substruct0->species && !substruct3->isEgg)
+ break;
+ }
+ case MON_DATA_LANGUAGE:
+ retVal = boxMon->language;
+ break;
+ case MON_DATA_SANITY_BIT1:
+ retVal = boxMon->isBadEgg;
+ break;
+ case MON_DATA_SANITY_BIT2:
+ retVal = boxMon->hasSpecies;
+ break;
+ case MON_DATA_SANITY_BIT3:
+ retVal = boxMon->isEgg;
+ break;
+ case MON_DATA_OT_NAME:
+ {
+ retVal = 0;
+
+ while (retVal < OT_NAME_LENGTH && boxMon->otName[retVal] != EOS)
+ {
+ data[retVal] = boxMon->otName[retVal];
+ retVal++;
+ }
+
+ data[retVal] = EOS;
+ break;
+ }
+ case MON_DATA_MARKINGS:
+ retVal = boxMon->markings;
+ break;
+ case MON_DATA_CHECKSUM:
+ retVal = boxMon->checksum;
+ break;
+ case MON_DATA_10:
+ retVal = boxMon->unknown;
+ break;
+ case MON_DATA_SPECIES:
+ retVal = boxMon->isBadEgg ? SPECIES_EGG : substruct0->species;
+ break;
+ case MON_DATA_HELD_ITEM:
+ retVal = substruct0->heldItem;
+ break;
+ case MON_DATA_EXP:
+ retVal = substruct0->experience;
+ break;
+ case MON_DATA_PP_BONUSES:
+ retVal = substruct0->ppBonuses;
+ break;
+ case MON_DATA_FRIENDSHIP:
+ retVal = substruct0->friendship;
+ break;
+ case MON_DATA_MOVE1:
+ case MON_DATA_MOVE2:
+ case MON_DATA_MOVE3:
+ case MON_DATA_MOVE4:
+ retVal = substruct1->moves[field - MON_DATA_MOVE1];
+ break;
+ case MON_DATA_PP1:
+ case MON_DATA_PP2:
+ case MON_DATA_PP3:
+ case MON_DATA_PP4:
+ retVal = substruct1->pp[field - MON_DATA_PP1];
+ break;
+ case MON_DATA_HP_EV:
+ retVal = substruct2->hpEV;
+ break;
+ case MON_DATA_ATK_EV:
+ retVal = substruct2->attackEV;
+ break;
+ case MON_DATA_DEF_EV:
+ retVal = substruct2->defenseEV;
+ break;
+ case MON_DATA_SPD_EV:
+ retVal = substruct2->speedEV;
+ break;
+ case MON_DATA_SPATK_EV:
+ retVal = substruct2->spAttackEV;
+ break;
+ case MON_DATA_SPDEF_EV:
+ retVal = substruct2->spDefenseEV;
+ break;
+ case MON_DATA_COOL:
+ retVal = substruct2->cool;
+ break;
+ case MON_DATA_BEAUTY:
+ retVal = substruct2->beauty;
+ break;
+ case MON_DATA_CUTE:
+ retVal = substruct2->cute;
+ break;
+ case MON_DATA_SMART:
+ retVal = substruct2->smart;
+ break;
+ case MON_DATA_TOUGH:
+ retVal = substruct2->tough;
+ break;
+ case MON_DATA_SHEEN:
+ retVal = substruct2->sheen;
+ break;
+ case MON_DATA_POKERUS:
+ retVal = substruct3->pokerus;
+ break;
+ case MON_DATA_MET_LOCATION:
+ retVal = substruct3->metLocation;
+ break;
+ case MON_DATA_MET_LEVEL:
+ retVal = substruct3->metLevel;
+ break;
+ case MON_DATA_MET_GAME:
+ retVal = substruct3->metGame;
+ break;
+ case MON_DATA_POKEBALL:
+ retVal = substruct3->pokeball;
+ break;
+ case MON_DATA_OT_GENDER:
+ retVal = substruct3->otGender;
+ break;
+ case MON_DATA_HP_IV:
+ retVal = substruct3->hpIV;
+ break;
+ case MON_DATA_ATK_IV:
+ retVal = substruct3->attackIV;
+ break;
+ case MON_DATA_DEF_IV:
+ retVal = substruct3->defenseIV;
+ break;
+ case MON_DATA_SPD_IV:
+ retVal = substruct3->speedIV;
+ break;
+ case MON_DATA_SPATK_IV:
+ retVal = substruct3->spAttackIV;
+ break;
+ case MON_DATA_SPDEF_IV:
+ retVal = substruct3->spDefenseIV;
+ break;
+ case MON_DATA_IS_EGG:
+ retVal = substruct3->isEgg;
+ break;
+ case MON_DATA_ALT_ABILITY:
+ retVal = substruct3->altAbility;
+ break;
+ case MON_DATA_COOL_RIBBON:
+ retVal = substruct3->coolRibbon;
+ break;
+ case MON_DATA_BEAUTY_RIBBON:
+ retVal = substruct3->beautyRibbon;
+ break;
+ case MON_DATA_CUTE_RIBBON:
+ retVal = substruct3->cuteRibbon;
+ break;
+ case MON_DATA_SMART_RIBBON:
+ retVal = substruct3->smartRibbon;
+ break;
+ case MON_DATA_TOUGH_RIBBON:
+ retVal = substruct3->toughRibbon;
+ break;
+ case MON_DATA_CHAMPION_RIBBON:
+ retVal = substruct3->championRibbon;
+ break;
+ case MON_DATA_WINNING_RIBBON:
+ retVal = substruct3->winningRibbon;
+ break;
+ case MON_DATA_VICTORY_RIBBON:
+ retVal = substruct3->victoryRibbon;
+ break;
+ case MON_DATA_ARTIST_RIBBON:
+ retVal = substruct3->artistRibbon;
+ break;
+ case MON_DATA_EFFORT_RIBBON:
+ retVal = substruct3->effortRibbon;
+ break;
+ case MON_DATA_GIFT_RIBBON_1:
+ retVal = substruct3->giftRibbon1;
+ break;
+ case MON_DATA_GIFT_RIBBON_2:
+ retVal = substruct3->giftRibbon2;
+ break;
+ case MON_DATA_GIFT_RIBBON_3:
+ retVal = substruct3->giftRibbon3;
+ break;
+ case MON_DATA_GIFT_RIBBON_4:
+ retVal = substruct3->giftRibbon4;
+ break;
+ case MON_DATA_GIFT_RIBBON_5:
+ retVal = substruct3->giftRibbon5;
+ break;
+ case MON_DATA_GIFT_RIBBON_6:
+ retVal = substruct3->giftRibbon6;
+ break;
+ case MON_DATA_GIFT_RIBBON_7:
+ retVal = substruct3->giftRibbon7;
+ break;
+ case MON_DATA_FATEFUL_ENCOUNTER:
+ retVal = substruct3->fatefulEncounter;
+ break;
+ case MON_DATA_SPECIES2:
+ retVal = substruct0->species;
+ if (substruct0->species && (substruct3->isEgg || boxMon->isBadEgg))
+ retVal = SPECIES_EGG;
+ break;
+ case MON_DATA_IVS:
+ retVal = substruct3->hpIV | (substruct3->attackIV << 5) | (substruct3->defenseIV << 10) | (substruct3->speedIV << 15) | (substruct3->spAttackIV << 20) | (substruct3->spDefenseIV << 25);
+ break;
+ case MON_DATA_KNOWN_MOVES:
+ if (substruct0->species && !substruct3->isEgg)
+ {
+ u16 *moves = (u16 *)data;
+ s32 i = 0;
+
+ while (moves[i] != 355)
{
- retVal = substruct3->championRibbon
- | (substruct3->coolRibbon << 1)
- | (substruct3->beautyRibbon << 4)
- | (substruct3->cuteRibbon << 7)
- | (substruct3->smartRibbon << 10)
- | (substruct3->toughRibbon << 13)
- | (substruct3->winningRibbon << 16)
- | (substruct3->victoryRibbon << 17)
- | (substruct3->artistRibbon << 18)
- | (substruct3->effortRibbon << 19)
- | (substruct3->giftRibbon1 << 20)
- | (substruct3->giftRibbon2 << 21)
- | (substruct3->giftRibbon3 << 22)
- | (substruct3->giftRibbon4 << 23)
- | (substruct3->giftRibbon5 << 24)
- | (substruct3->giftRibbon6 << 25)
- | (substruct3->giftRibbon7 << 26);
+ u16 move = moves[i];
+ if (substruct1->moves[0] == move
+ || substruct1->moves[1] == move
+ || substruct1->moves[2] == move
+ || substruct1->moves[3] == move)
+ retVal |= gBitTable[i];
+ i++;
}
- break;
- default:
- break;
+ }
+ break;
+ case MON_DATA_RIBBON_COUNT:
+ retVal = 0;
+ if (substruct0->species && !substruct3->isEgg)
+ {
+ retVal += substruct3->coolRibbon;
+ retVal += substruct3->beautyRibbon;
+ retVal += substruct3->cuteRibbon;
+ retVal += substruct3->smartRibbon;
+ retVal += substruct3->toughRibbon;
+ retVal += substruct3->championRibbon;
+ retVal += substruct3->winningRibbon;
+ retVal += substruct3->victoryRibbon;
+ retVal += substruct3->artistRibbon;
+ retVal += substruct3->effortRibbon;
+ retVal += substruct3->giftRibbon1;
+ retVal += substruct3->giftRibbon2;
+ retVal += substruct3->giftRibbon3;
+ retVal += substruct3->giftRibbon4;
+ retVal += substruct3->giftRibbon5;
+ retVal += substruct3->giftRibbon6;
+ retVal += substruct3->giftRibbon7;
+ }
+ break;
+ case MON_DATA_RIBBONS:
+ retVal = 0;
+ if (substruct0->species && !substruct3->isEgg)
+ {
+ retVal = substruct3->championRibbon
+ | (substruct3->coolRibbon << 1)
+ | (substruct3->beautyRibbon << 4)
+ | (substruct3->cuteRibbon << 7)
+ | (substruct3->smartRibbon << 10)
+ | (substruct3->toughRibbon << 13)
+ | (substruct3->winningRibbon << 16)
+ | (substruct3->victoryRibbon << 17)
+ | (substruct3->artistRibbon << 18)
+ | (substruct3->effortRibbon << 19)
+ | (substruct3->giftRibbon1 << 20)
+ | (substruct3->giftRibbon2 << 21)
+ | (substruct3->giftRibbon3 << 22)
+ | (substruct3->giftRibbon4 << 23)
+ | (substruct3->giftRibbon5 << 24)
+ | (substruct3->giftRibbon6 << 25)
+ | (substruct3->giftRibbon7 << 26);
+ }
+ break;
+ default:
+ break;
}
if (field > MON_DATA_10)
@@ -800,239 +796,239 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const u8 *data)
switch (field)
{
- case MON_DATA_PERSONALITY:
- SET32(boxMon->personality);
- break;
- case MON_DATA_OT_ID:
- SET32(boxMon->otId);
- break;
- case MON_DATA_NICKNAME:
- {
- s32 i;
- for (i = 0; i < POKEMON_NAME_LENGTH; i++)
- boxMon->nickname[i] = data[i];
- break;
- }
- case MON_DATA_LANGUAGE:
- SET8(boxMon->language);
- break;
- case MON_DATA_SANITY_BIT1:
- SET8(boxMon->isBadEgg);
- break;
- case MON_DATA_SANITY_BIT2:
- SET8(boxMon->hasSpecies);
- break;
- case MON_DATA_SANITY_BIT3:
- SET8(boxMon->isEgg);
- break;
- case MON_DATA_OT_NAME:
- {
- s32 i;
- for (i = 0; i < OT_NAME_LENGTH; i++)
- boxMon->otName[i] = data[i];
- break;
- }
- case MON_DATA_MARKINGS:
- SET8(boxMon->markings);
- break;
- case MON_DATA_CHECKSUM:
- SET16(boxMon->checksum);
- break;
- case MON_DATA_10:
- SET16(boxMon->unknown);
- break;
- case MON_DATA_SPECIES:
- {
- SET16(substruct0->species);
- if (substruct0->species)
- boxMon->hasSpecies = 1;
- else
- boxMon->hasSpecies = 0;
- break;
- }
- case MON_DATA_HELD_ITEM:
- SET16(substruct0->heldItem);
- break;
- case MON_DATA_EXP:
- SET32(substruct0->experience);
- break;
- case MON_DATA_PP_BONUSES:
- SET8(substruct0->ppBonuses);
- break;
- case MON_DATA_FRIENDSHIP:
- SET8(substruct0->friendship);
- break;
- case MON_DATA_MOVE1:
- case MON_DATA_MOVE2:
- case MON_DATA_MOVE3:
- case MON_DATA_MOVE4:
- SET16(substruct1->moves[field - MON_DATA_MOVE1]);
- break;
- case MON_DATA_PP1:
- case MON_DATA_PP2:
- case MON_DATA_PP3:
- case MON_DATA_PP4:
- SET8(substruct1->pp[field - MON_DATA_PP1]);
- break;
- case MON_DATA_HP_EV:
- SET8(substruct2->hpEV);
- break;
- case MON_DATA_ATK_EV:
- SET8(substruct2->attackEV);
- break;
- case MON_DATA_DEF_EV:
- SET8(substruct2->defenseEV);
- break;
- case MON_DATA_SPD_EV:
- SET8(substruct2->speedEV);
- break;
- case MON_DATA_SPATK_EV:
- SET8(substruct2->spAttackEV);
- break;
- case MON_DATA_SPDEF_EV:
- SET8(substruct2->spDefenseEV);
- break;
- case MON_DATA_COOL:
- SET8(substruct2->cool);
- break;
- case MON_DATA_BEAUTY:
- SET8(substruct2->beauty);
- break;
- case MON_DATA_CUTE:
- SET8(substruct2->cute);
- break;
- case MON_DATA_SMART:
- SET8(substruct2->smart);
- break;
- case MON_DATA_TOUGH:
- SET8(substruct2->tough);
- break;
- case MON_DATA_SHEEN:
- SET8(substruct2->sheen);
- break;
- case MON_DATA_POKERUS:
- SET8(substruct3->pokerus);
- break;
- case MON_DATA_MET_LOCATION:
- SET8(substruct3->metLocation);
- break;
- case MON_DATA_MET_LEVEL:
- {
- u8 metLevel = *data;
- substruct3->metLevel = metLevel;
- break;
- }
- case MON_DATA_MET_GAME:
- SET8(substruct3->metGame);
- break;
- case MON_DATA_POKEBALL:
- {
- u8 pokeball = *data;
- substruct3->pokeball = pokeball;
- break;
- }
- case MON_DATA_OT_GENDER:
- SET8(substruct3->otGender);
- break;
- case MON_DATA_HP_IV:
- SET8(substruct3->hpIV);
- break;
- case MON_DATA_ATK_IV:
- SET8(substruct3->attackIV);
- break;
- case MON_DATA_DEF_IV:
- SET8(substruct3->defenseIV);
- break;
- case MON_DATA_SPD_IV:
- SET8(substruct3->speedIV);
- break;
- case MON_DATA_SPATK_IV:
- SET8(substruct3->spAttackIV);
- break;
- case MON_DATA_SPDEF_IV:
- SET8(substruct3->spDefenseIV);
- break;
- case MON_DATA_IS_EGG:
- SET8(substruct3->isEgg);
- if (substruct3->isEgg)
- boxMon->isEgg = 1;
- else
- boxMon->isEgg = 0;
- break;
- case MON_DATA_ALT_ABILITY:
- SET8(substruct3->altAbility);
- break;
- case MON_DATA_COOL_RIBBON:
- SET8(substruct3->coolRibbon);
- break;
- case MON_DATA_BEAUTY_RIBBON:
- SET8(substruct3->beautyRibbon);
- break;
- case MON_DATA_CUTE_RIBBON:
- SET8(substruct3->cuteRibbon);
- break;
- case MON_DATA_SMART_RIBBON:
- SET8(substruct3->smartRibbon);
- break;
- case MON_DATA_TOUGH_RIBBON:
- SET8(substruct3->toughRibbon);
- break;
- case MON_DATA_CHAMPION_RIBBON:
- SET8(substruct3->championRibbon);
- break;
- case MON_DATA_WINNING_RIBBON:
- SET8(substruct3->winningRibbon);
- break;
- case MON_DATA_VICTORY_RIBBON:
- SET8(substruct3->victoryRibbon);
- break;
- case MON_DATA_ARTIST_RIBBON:
- SET8(substruct3->artistRibbon);
- break;
- case MON_DATA_EFFORT_RIBBON:
- SET8(substruct3->effortRibbon);
- break;
- case MON_DATA_GIFT_RIBBON_1:
- SET8(substruct3->giftRibbon1);
- break;
- case MON_DATA_GIFT_RIBBON_2:
- SET8(substruct3->giftRibbon2);
- break;
- case MON_DATA_GIFT_RIBBON_3:
- SET8(substruct3->giftRibbon3);
- break;
- case MON_DATA_GIFT_RIBBON_4:
- SET8(substruct3->giftRibbon4);
- break;
- case MON_DATA_GIFT_RIBBON_5:
- SET8(substruct3->giftRibbon5);
- break;
- case MON_DATA_GIFT_RIBBON_6:
- SET8(substruct3->giftRibbon6);
- break;
- case MON_DATA_GIFT_RIBBON_7:
- SET8(substruct3->giftRibbon7);
- break;
- case MON_DATA_FATEFUL_ENCOUNTER:
- SET8(substruct3->fatefulEncounter);
- break;
- case MON_DATA_IVS:
- {
+ case MON_DATA_PERSONALITY:
+ SET32(boxMon->personality);
+ break;
+ case MON_DATA_OT_ID:
+ SET32(boxMon->otId);
+ break;
+ case MON_DATA_NICKNAME:
+ {
+ s32 i;
+ for (i = 0; i < POKEMON_NAME_LENGTH; i++)
+ boxMon->nickname[i] = data[i];
+ break;
+ }
+ case MON_DATA_LANGUAGE:
+ SET8(boxMon->language);
+ break;
+ case MON_DATA_SANITY_BIT1:
+ SET8(boxMon->isBadEgg);
+ break;
+ case MON_DATA_SANITY_BIT2:
+ SET8(boxMon->hasSpecies);
+ break;
+ case MON_DATA_SANITY_BIT3:
+ SET8(boxMon->isEgg);
+ break;
+ case MON_DATA_OT_NAME:
+ {
+ s32 i;
+ for (i = 0; i < OT_NAME_LENGTH; i++)
+ boxMon->otName[i] = data[i];
+ break;
+ }
+ case MON_DATA_MARKINGS:
+ SET8(boxMon->markings);
+ break;
+ case MON_DATA_CHECKSUM:
+ SET16(boxMon->checksum);
+ break;
+ case MON_DATA_10:
+ SET16(boxMon->unknown);
+ break;
+ case MON_DATA_SPECIES:
+ {
+ SET16(substruct0->species);
+ if (substruct0->species)
+ boxMon->hasSpecies = 1;
+ else
+ boxMon->hasSpecies = 0;
+ break;
+ }
+ case MON_DATA_HELD_ITEM:
+ SET16(substruct0->heldItem);
+ break;
+ case MON_DATA_EXP:
+ SET32(substruct0->experience);
+ break;
+ case MON_DATA_PP_BONUSES:
+ SET8(substruct0->ppBonuses);
+ break;
+ case MON_DATA_FRIENDSHIP:
+ SET8(substruct0->friendship);
+ break;
+ case MON_DATA_MOVE1:
+ case MON_DATA_MOVE2:
+ case MON_DATA_MOVE3:
+ case MON_DATA_MOVE4:
+ SET16(substruct1->moves[field - MON_DATA_MOVE1]);
+ break;
+ case MON_DATA_PP1:
+ case MON_DATA_PP2:
+ case MON_DATA_PP3:
+ case MON_DATA_PP4:
+ SET8(substruct1->pp[field - MON_DATA_PP1]);
+ break;
+ case MON_DATA_HP_EV:
+ SET8(substruct2->hpEV);
+ break;
+ case MON_DATA_ATK_EV:
+ SET8(substruct2->attackEV);
+ break;
+ case MON_DATA_DEF_EV:
+ SET8(substruct2->defenseEV);
+ break;
+ case MON_DATA_SPD_EV:
+ SET8(substruct2->speedEV);
+ break;
+ case MON_DATA_SPATK_EV:
+ SET8(substruct2->spAttackEV);
+ break;
+ case MON_DATA_SPDEF_EV:
+ SET8(substruct2->spDefenseEV);
+ break;
+ case MON_DATA_COOL:
+ SET8(substruct2->cool);
+ break;
+ case MON_DATA_BEAUTY:
+ SET8(substruct2->beauty);
+ break;
+ case MON_DATA_CUTE:
+ SET8(substruct2->cute);
+ break;
+ case MON_DATA_SMART:
+ SET8(substruct2->smart);
+ break;
+ case MON_DATA_TOUGH:
+ SET8(substruct2->tough);
+ break;
+ case MON_DATA_SHEEN:
+ SET8(substruct2->sheen);
+ break;
+ case MON_DATA_POKERUS:
+ SET8(substruct3->pokerus);
+ break;
+ case MON_DATA_MET_LOCATION:
+ SET8(substruct3->metLocation);
+ break;
+ case MON_DATA_MET_LEVEL:
+ {
+ u8 metLevel = *data;
+ substruct3->metLevel = metLevel;
+ break;
+ }
+ case MON_DATA_MET_GAME:
+ SET8(substruct3->metGame);
+ break;
+ case MON_DATA_POKEBALL:
+ {
+ u8 pokeball = *data;
+ substruct3->pokeball = pokeball;
+ break;
+ }
+ case MON_DATA_OT_GENDER:
+ SET8(substruct3->otGender);
+ break;
+ case MON_DATA_HP_IV:
+ SET8(substruct3->hpIV);
+ break;
+ case MON_DATA_ATK_IV:
+ SET8(substruct3->attackIV);
+ break;
+ case MON_DATA_DEF_IV:
+ SET8(substruct3->defenseIV);
+ break;
+ case MON_DATA_SPD_IV:
+ SET8(substruct3->speedIV);
+ break;
+ case MON_DATA_SPATK_IV:
+ SET8(substruct3->spAttackIV);
+ break;
+ case MON_DATA_SPDEF_IV:
+ SET8(substruct3->spDefenseIV);
+ break;
+ case MON_DATA_IS_EGG:
+ SET8(substruct3->isEgg);
+ if (substruct3->isEgg)
+ boxMon->isEgg = 1;
+ else
+ boxMon->isEgg = 0;
+ break;
+ case MON_DATA_ALT_ABILITY:
+ SET8(substruct3->altAbility);
+ break;
+ case MON_DATA_COOL_RIBBON:
+ SET8(substruct3->coolRibbon);
+ break;
+ case MON_DATA_BEAUTY_RIBBON:
+ SET8(substruct3->beautyRibbon);
+ break;
+ case MON_DATA_CUTE_RIBBON:
+ SET8(substruct3->cuteRibbon);
+ break;
+ case MON_DATA_SMART_RIBBON:
+ SET8(substruct3->smartRibbon);
+ break;
+ case MON_DATA_TOUGH_RIBBON:
+ SET8(substruct3->toughRibbon);
+ break;
+ case MON_DATA_CHAMPION_RIBBON:
+ SET8(substruct3->championRibbon);
+ break;
+ case MON_DATA_WINNING_RIBBON:
+ SET8(substruct3->winningRibbon);
+ break;
+ case MON_DATA_VICTORY_RIBBON:
+ SET8(substruct3->victoryRibbon);
+ break;
+ case MON_DATA_ARTIST_RIBBON:
+ SET8(substruct3->artistRibbon);
+ break;
+ case MON_DATA_EFFORT_RIBBON:
+ SET8(substruct3->effortRibbon);
+ break;
+ case MON_DATA_GIFT_RIBBON_1:
+ SET8(substruct3->giftRibbon1);
+ break;
+ case MON_DATA_GIFT_RIBBON_2:
+ SET8(substruct3->giftRibbon2);
+ break;
+ case MON_DATA_GIFT_RIBBON_3:
+ SET8(substruct3->giftRibbon3);
+ break;
+ case MON_DATA_GIFT_RIBBON_4:
+ SET8(substruct3->giftRibbon4);
+ break;
+ case MON_DATA_GIFT_RIBBON_5:
+ SET8(substruct3->giftRibbon5);
+ break;
+ case MON_DATA_GIFT_RIBBON_6:
+ SET8(substruct3->giftRibbon6);
+ break;
+ case MON_DATA_GIFT_RIBBON_7:
+ SET8(substruct3->giftRibbon7);
+ break;
+ case MON_DATA_FATEFUL_ENCOUNTER:
+ SET8(substruct3->fatefulEncounter);
+ break;
+ case MON_DATA_IVS:
+ {
#ifdef BUGFIX_SETMONIVS
- u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
+ u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
#else
- u32 ivs = *data; // Bug: Only the HP IV and the lower 3 bits of the Attack IV are read. The rest become 0.
+ u32 ivs = *data; // Bug: Only the HP IV and the lower 3 bits of the Attack IV are read. The rest become 0.
#endif
- substruct3->hpIV = ivs & 0x1F;
- substruct3->attackIV = (ivs >> 5) & 0x1F;
- substruct3->defenseIV = (ivs >> 10) & 0x1F;
- substruct3->speedIV = (ivs >> 15) & 0x1F;
- substruct3->spAttackIV = (ivs >> 20) & 0x1F;
- substruct3->spDefenseIV = (ivs >> 25) & 0x1F;
- break;
- }
- default:
- break;
+ substruct3->hpIV = ivs & 0x1F;
+ substruct3->attackIV = (ivs >> 5) & 0x1F;
+ substruct3->defenseIV = (ivs >> 10) & 0x1F;
+ substruct3->speedIV = (ivs >> 15) & 0x1F;
+ substruct3->spAttackIV = (ivs >> 20) & 0x1F;
+ substruct3->spDefenseIV = (ivs >> 25) & 0x1F;
+ break;
+ }
+ default:
+ break;
}
if (field > MON_DATA_10)
diff --git a/src/pokemon_3.c b/src/pokemon_3.c
index 270a52ad5..f9eb3a7e9 100644
--- a/src/pokemon_3.c
+++ b/src/pokemon_3.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "asm.h"
#include "battle.h"
+#include "data2.h"
#include "event_data.h"
#include "hold_effects.h"
#include "item.h"
@@ -74,9 +75,6 @@ extern u8 gEnemyMonIndex;
extern u8 gUnknown_02024C0B;
extern u8 gUnknown_02024E6C;
extern struct SpindaSpot gSpindaSpotGraphics[];
-extern void *gUnknown_081FAF4C[];
-extern u8 gSpeciesNames[][11];
-extern struct Trainer gTrainers[];
extern s8 gNatureStatTable[][5];
extern s8 gUnknown_082082FE[][3];
extern u16 gTrainerBattleOpponent;
@@ -88,8 +86,6 @@ extern u32 gTMHMLearnsets[][2];
extern const u16 *gLevelUpLearnsets[];
extern u8 gBattleMonForms[];
extern const u8 BattleText_Wally[];
-extern const struct SpritePalette gMonPaletteTable[];
-extern const struct SpritePalette gMonShinyPaletteTable[];
extern const u16 gHMMoves[];
extern s8 gUnknown_083F7E28[];
extern u8 byte_2024C06;
@@ -169,28 +165,28 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
{
switch (j)
{
- case 2:
- if (val & 0x10)
- val &= 0xEF;
- case 0:
- if (i == effectByte && (val & effectBit))
- return offset;
- offset++;
- break;
- case 1:
- if (i == effectByte && (val & effectBit))
- return offset;
- offset++;
- break;
- case 3:
- if (i == effectByte && (val & effectBit))
- return offset;
- offset++;
- break;
- case 7:
- if (i == effectByte)
- return 0;
- break;
+ case 2:
+ if (val & 0x10)
+ val &= 0xEF;
+ case 0:
+ if (i == effectByte && (val & effectBit))
+ return offset;
+ offset++;
+ break;
+ case 1:
+ if (i == effectByte && (val & effectBit))
+ return offset;
+ offset++;
+ break;
+ case 3:
+ if (i == effectByte && (val & effectBit))
+ return offset;
+ offset++;
+ break;
+ case 7:
+ if (i == effectByte)
+ return 0;
+ break;
}
}
j++;
@@ -208,21 +204,21 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
{
switch (j)
{
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- if (i == effectByte && (val & effectBit))
- return offset;
- offset++;
- break;
- case 7:
- if (i == effectByte)
- return 0;
- break;
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ if (i == effectByte && (val & effectBit))
+ return offset;
+ offset++;
+ break;
+ case 7:
+ if (i == effectByte)
+ return 0;
+ break;
}
}
j++;
@@ -1153,26 +1149,26 @@ u16 sub_8040728(void)
{
switch (gTrainers[gTrainerBattleOpponent].trainerClass)
{
- case 2:
- case 0x31:
- return BGM_BATTLE30;
- case 3:
- case 4:
- case 0x32:
- case 0x33:
- return BGM_BATTLE31;
- case 0x19:
- return BGM_BATTLE32;
- case 0x20:
- return BGM_BATTLE33;
- case 0x2E:
- if (!StringCompare(gTrainers[gTrainerBattleOpponent].trainerName, BattleText_Wally))
- return BGM_BATTLE20;
- return BGM_BATTLE35;
- case 0x18:
- return BGM_BATTLE38;
- default:
+ case 2:
+ case 0x31:
+ return BGM_BATTLE30;
+ case 3:
+ case 4:
+ case 0x32:
+ case 0x33:
+ return BGM_BATTLE31;
+ case 0x19:
+ return BGM_BATTLE32;
+ case 0x20:
+ return BGM_BATTLE33;
+ case 0x2E:
+ if (!StringCompare(gTrainers[gTrainerBattleOpponent].trainerName, BattleText_Wally))
return BGM_BATTLE20;
+ return BGM_BATTLE35;
+ case 0x18:
+ return BGM_BATTLE38;
+ default:
+ return BGM_BATTLE20;
}
}
return BGM_BATTLE27;
diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c
index 6540858c1..b2f8a1569 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
@@ -1,8 +1,10 @@
#include "global.h"
#include "pokemon_size_record.h"
+#include "data2.h"
#include "event_data.h"
#include "species.h"
#include "string_util.h"
+#include "strings2.h"
#include "text.h"
extern u16 SpeciesToNationalPokedexNum(u16);
@@ -15,9 +17,7 @@ struct UnknownStruct
u16 unk4;
};
-extern u8 gOtherText_Marco[];
extern u16 gScriptResult;
-extern u8 gSpeciesNames[][11];
static const struct UnknownStruct sBigMonSizeTable[] =
{
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index 5f96512f0..56a56e455 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -4,22 +4,11 @@
#include "menu.h"
#include "pokemon.h"
#include "string_util.h"
+#include "strings2.h"
extern struct Pokemon *unk_2018000;
extern u8 *(gNatureNames[]);
-extern const u8 gOtherText_Terminator4[];
-extern const u8 gOtherText_Nature[];
-
-extern const u8 gOtherText_Met[];
-extern const u8 gOtherText_Egg2[];
-extern const u8 gOtherText_ObtainedInTrade[];
-extern const u8 gOtherText_FatefulEncounter[];
-extern const u8 gOtherText_Met2[];
-extern const u8 gOtherText_EggDayCare[];
-extern const u8 gOtherText_EggNicePlace[];
-extern const u8 gOtherText_EggObtainedInTrade[];
-extern const u8 gOtherText_EggHotSprings[];
u8 *sub_80A1E9C(u8 *dest, u8 *src, u8);
u8 PokemonSummaryScreen_CheckOT(struct Pokemon *pokemon);
diff --git a/src/pokenav.c b/src/pokenav.c
index 60e7c73e1..f50f039f8 100644
--- a/src/pokenav.c
+++ b/src/pokenav.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "battle.h"
+#include "data2.h"
#include "string_util.h"
struct UnkPokenavStruct_Sub {
@@ -17,8 +18,6 @@ struct UnkPokenavStruct {
extern struct UnkPokenavStruct *gUnknown_083DFEC4;
-extern const struct Trainer gTrainers[];
-extern const u8 gTrainerClassNames[][13];
void sub_80F700C(u8 *arg0, u16 arg1) {
struct Trainer *trainer;
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 76fe13059..c84cfd2ae 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -10,6 +10,7 @@
#include "songs.h"
#include "sound.h"
#include "string_util.h"
+#include "strings2.h"
#include "task.h"
extern void *recordMixingSecretBases;
@@ -23,20 +24,18 @@ extern u8 gUnknown_083D0288[2];
extern u8 gUnknown_083D028A[2][3];
extern u8 gUnknown_083D0290[9][4];
-extern u8 gUnknown_02038738[]; //Don't know what type this points to
+extern struct RecordMixing_UnknownStruct gUnknown_02038738[2]; //Don't know what type this points to
extern u16 gSpecialVar_0x8005;
extern u32 gUnknown_03005D2C;
extern u8 gUnknown_03000718;
extern u8 gUnknown_0300071C[];
-extern u8 gOtherText_MixingComplete[];
-extern u8 gOtherText_MixingRecordsWithFriend[];
extern bool8 gReceivedRemoteLinkPlayers;
#define BUFFER_CHUNK_SIZE 200
void sub_80B929C(void)
{
- sub_8083A84(sub_80B9484);
+ sub_8083A84(Task_RecordMixing_Main);
}
struct PlayerRecords {
@@ -53,8 +52,10 @@ struct PlayerRecords {
extern struct PlayerRecords unk_2008000;
extern struct PlayerRecords unk_2018000;
-#ifdef NONMATCHING
-void sub_80B92AC(void)
+void sub_80BC300();
+void sub_80C045C();
+
+void RecordMixing_PrepareExchangePacket(void)
{
sub_80BC300();
sub_80C045C();
@@ -64,128 +65,20 @@ void sub_80B92AC(void)
memcpy(unk_2018000.filler1004, gUnknown_083D0274, 0x40);
memcpy(unk_2018000.filler1044, gUnknown_083D0278, 0x40);
memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, 0x28);
- memcpy(gUnknown_02038738, gSaveBlock1.filler_303C, 0x38);
- memcpy(gUnknown_02038738 + 0x38, gSaveBlock1.filler_3074, 0x38);
- sub_8041324(gSaveBlock1.filler_2F9C, gUnknown_02038738);
+ 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);
memcpy(unk_2018000.filler1124, gUnknown_083D0284, 0xA4);
if (GetMultiplayerId() == 0)
unk_2018000.filler11C8[0] = sub_8126338();
}
-#else
-__attribute__((naked))
-void sub_80B92AC(void)
-{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- bl sub_80BC300\n\
- bl sub_80C045C\n\
- ldr r6, _080B9364 @ =0x02018000\n\
- ldr r0, _080B9368 @ =recordMixingSecretBases\n\
- ldr r1, [r0]\n\
- movs r2, 0xC8\n\
- lsls r2, 4\n\
- adds r0, r6, 0\n\
- bl memcpy\n\
- movs r1, 0xC8\n\
- lsls r1, 4\n\
- adds r0, r6, r1\n\
- ldr r1, _080B936C @ =recordMixingTvShows\n\
- ldr r1, [r1]\n\
- movs r2, 0xE1\n\
- lsls r2, 2\n\
- bl memcpy\n\
- ldr r2, _080B9370 @ =0x00001004\n\
- adds r0, r6, r2\n\
- ldr r1, _080B9374 @ =gUnknown_083D0274\n\
- ldr r1, [r1]\n\
- movs r2, 0x40\n\
- bl memcpy\n\
- ldr r1, _080B9378 @ =0x00001044\n\
- adds r0, r6, r1\n\
- ldr r1, _080B937C @ =gUnknown_083D0278\n\
- ldr r1, [r1]\n\
- movs r2, 0x40\n\
- bl memcpy\n\
- ldr r2, _080B9380 @ =0x00001084\n\
- adds r0, r6, r2\n\
- ldr r1, _080B9384 @ =recordMixingEasyChatPairs\n\
- ldr r1, [r1]\n\
- movs r2, 0x28\n\
- bl memcpy\n\
- ldr r5, _080B9388 @ =gUnknown_02038738\n\
- ldr r4, _080B938C @ =gSaveBlock1\n\
- ldr r0, _080B9390 @ =0x0000303c\n\
- adds r1, r4, r0\n\
- adds r0, r5, 0\n\
- movs r2, 0x38\n\
- bl memcpy\n\
- ldr r2, _080B9394 @ =0x00003074\n\
- adds r1, r4, r2\n\
- adds r0, r5, 0\n\
- adds r0, 0x38\n\
- movs r2, 0x38\n\
- bl memcpy\n\
- ldr r0, _080B9398 @ =0x00002f9c\n\
- adds r4, r0\n\
- adds r0, r4, 0\n\
- adds r1, r5, 0\n\
- bl sub_8041324\n\
- ldr r1, _080B939C @ =0x000010ac\n\
- adds r0, r6, r1\n\
- ldr r1, _080B93A0 @ =gUnknown_083D0280\n\
- ldr r1, [r1]\n\
- movs r2, 0x78\n\
- bl memcpy\n\
- ldr r2, _080B93A4 @ =0x00001124\n\
- adds r0, r6, r2\n\
- ldr r1, _080B93A8 @ =gUnknown_083D0284\n\
- ldr r1, [r1]\n\
- movs r2, 0xA4\n\
- bl memcpy\n\
- bl GetMultiplayerId\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _080B935C\n\
- bl sub_8126338\n\
- ldr r2, _080B93AC @ =0x000011c8\n\
- adds r1, r6, r2\n\
- strh r0, [r1]\n\
-_080B935C:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_080B9364: .4byte 0x02018000\n\
-_080B9368: .4byte recordMixingSecretBases\n\
-_080B936C: .4byte recordMixingTvShows\n\
-_080B9370: .4byte 0x00001004\n\
-_080B9374: .4byte gUnknown_083D0274\n\
-_080B9378: .4byte 0x00001044\n\
-_080B937C: .4byte gUnknown_083D0278\n\
-_080B9380: .4byte 0x00001084\n\
-_080B9384: .4byte recordMixingEasyChatPairs\n\
-_080B9388: .4byte gUnknown_02038738\n\
-_080B938C: .4byte gSaveBlock1\n\
-_080B9390: .4byte 0x0000303c\n\
-_080B9394: .4byte 0x00003074\n\
-_080B9398: .4byte 0x00002f9c\n\
-_080B939C: .4byte 0x000010ac\n\
-_080B93A0: .4byte gUnknown_083D0280\n\
-_080B93A4: .4byte 0x00001124\n\
-_080B93A8: .4byte gUnknown_083D0284\n\
-_080B93AC: .4byte 0x000011c8\n\
- .syntax divided\n");
-}
-#endif
-#undef NONMATCHING
-
-void sub_80B93B0(u32 a)
+void RecordMixing_ReceiveExchangePacket(u32 a)
{
sub_80BD674(unk_2008000.secretBases, sizeof(struct PlayerRecords), a);
- sub_80BFD44(unk_2008000.tvShows, sizeof(struct PlayerRecords), a);
+ sub_80BFD44((u8 *)unk_2008000.tvShows, sizeof(struct PlayerRecords), a);
sub_80C0514(unk_2008000.filler1004, sizeof(struct PlayerRecords), a);
sub_80B9B1C(unk_2008000.filler1044, sizeof(struct PlayerRecords), a);
//UB: Too many arguments for function "sub_80FA4E4"
@@ -195,7 +88,7 @@ void sub_80B93B0(u32 a)
sub_80B9F3C(unk_2008000.filler11C8, a);
}
-void sub_80B9450(u8 taskId)
+void Task_RecordMixing_SoundEffect(u8 taskId)
{
gTasks[taskId].data[0]++;
if (gTasks[taskId].data[0] == 50)
@@ -206,24 +99,23 @@ void sub_80B9450(u8 taskId)
}
#define TD_STATE 0
-
-void sub_80B9484(u8 taskId)
+void Task_RecordMixing_Main(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
switch (taskData[TD_STATE])
{
- case 0:
+ case 0: // init
sub_8007270(gSpecialVar_0x8005);
VarSet(0x4000, 1);
gUnknown_03000718 = 0;
- sub_80B92AC();
+ RecordMixing_PrepareExchangePacket();
CreateRecordMixingSprite();
taskData[TD_STATE] = 1;
taskData[10] = CreateTask(sub_80B95F0, 0x50);
- taskData[15] = CreateTask(sub_80B9450, 0x51);
+ taskData[15] = CreateTask(Task_RecordMixing_SoundEffect, 0x51);
break;
- case 1:
+ case 1: // wait for sub_80B95F0
if (!gTasks[taskData[10]].isActive)
{
taskData[TD_STATE] = 2;
@@ -237,7 +129,7 @@ void sub_80B9484(u8 taskId)
taskData[TD_STATE] = 3;
PlaySE(SE_W226);
break;
- case 3:
+ case 3: // wait for sub_80BA00C
if (!gTasks[taskData[10]].isActive)
{
taskData[TD_STATE] = 4;
@@ -247,7 +139,7 @@ void sub_80B9484(u8 taskId)
taskData[8] = 0;
}
break;
- case 4:
+ case 4: // wait 60 frames
taskData[8]++;
if (taskData[8] > 60)
taskData[TD_STATE] = 5;
@@ -275,10 +167,10 @@ void sub_80B95F0(u8 taskId)
MenuDisplayMessageBox();
MenuPrint(gOtherText_MixingRecordsWithFriend, 2, 15);
task->data[8] = 0x708;
- task->data[TD_STATE] = 0x190;
+ task->data[TD_STATE] = 400;
ClearLinkCallback_2();
break;
- case 100:
+ case 100: // wait 20 frames
task->data[12]++;
if (task->data[12] > 20)
{
@@ -320,7 +212,7 @@ void sub_80B95F0(u8 taskId)
if (sub_800820C() == GetLinkPlayerCount_2())
task->data[TD_STATE] = 1;
break;
- case 400:
+ case 400: // wait 20 frames
task->data[12]++;
if (task->data[12] > 20)
{
@@ -328,7 +220,7 @@ void sub_80B95F0(u8 taskId)
task->data[12] = 0;
}
break;
- case 1:
+ case 1: // wait for handshake
if (gReceivedRemoteLinkPlayers)
{
ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), 2, 2);
@@ -342,16 +234,16 @@ void sub_80B95F0(u8 taskId)
task->data[6] = GetLinkPlayerCount_2();
task->data[TD_STATE] = 0;
task->data[5] = GetMultiplayerId_();
- task->func = sub_80B97DC;
+ task->func = Task_RecordMixing_SendPacket;
StorePtrInTaskData(&unk_2018000, &task->data[2]);
- subTaskId = CreateTask(Task_CopyRecvBuffer, 0x50);
+ subTaskId = CreateTask(Task_RecordMixing_CopyReceiveBuffer, 0x50);
task->data[10] = subTaskId;
gTasks[subTaskId].data[0] = taskId;
//StorePtrInTaskData((void*)0x2008000, &gTasks[subTaskId].data[5]);
StorePtrInTaskData((u8 *)&unk_2018000 - 0x10000, &gTasks[subTaskId].data[5]);
break;
}
- case 5:
+ case 5: // wait 60 frames
task->data[10]++;
if (task->data[10] > 60)
{
@@ -362,45 +254,46 @@ void sub_80B95F0(u8 taskId)
}
}
-void sub_80B97DC(u8 taskId)
+void Task_RecordMixing_SendPacket(u8 taskId)
{
struct Task *task = &gTasks[taskId];
+ // does this send the data 24 times?
switch (task->data[TD_STATE])
{
- case 0: //Copy record data to send buffer
- {
- void *recordData = (u8 *)LoadPtrFromTaskData(&task->data[2]) + BUFFER_CHUNK_SIZE * task->data[4];
+ case 0: //Copy record data to send buffer
+ {
+ void *recordData = (u8 *)LoadPtrFromTaskData(&task->data[2]) + BUFFER_CHUNK_SIZE * task->data[4];
- memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE);
- task->data[TD_STATE]++;
- break;
- }
- case 1:
- if (GetMultiplayerId() == 0)
- sub_8007E9C(1);
+ memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE);
+ task->data[TD_STATE]++;
+ break;
+ }
+ case 1:
+ if (GetMultiplayerId() == 0)
+ sub_8007E9C(1);
+ task->data[TD_STATE]++;
+ break;
+ case 2:
+ break;
+ case 3:
+ task->data[4]++;
+ if ((u16)task->data[4] == 24)
task->data[TD_STATE]++;
- break;
- case 2:
- break;
- case 3:
- task->data[4]++;
- if ((u16)task->data[4] == 24)
- task->data[TD_STATE]++;
- else
- task->data[TD_STATE] = 0;
- break;
- case 4:
- if (!gTasks[task->data[10]].isActive)
- task->func = sub_80B9A1C;
+ else
+ task->data[TD_STATE] = 0;
+ break;
+ case 4:
+ if (!gTasks[task->data[10]].isActive)
+ task->func = Task_RecordMixing_SendPacket_SwitchToReceive;
}
}
-void Task_CopyRecvBuffer(u8 taskId)
+void Task_RecordMixing_CopyReceiveBuffer(u8 taskId)
{
struct Task *task = &gTasks[taskId];
s32 recvStatus = GetBlockReceivedStatus();
- u32 sp8 = 0;
+ u8 handledPlayers = 0;
if (recvStatus == sub_8008198())
{
@@ -408,32 +301,27 @@ void Task_CopyRecvBuffer(u8 taskId)
for (player = 0; player < GetLinkPlayerCount(); player++)
{
- //_080B98D4
- u8 *ptr;
void *src;
u8 *dst;
if ((recvStatus >> player) & 1)
{
- ptr = LoadPtrFromTaskData(&task->data[5]);
- dst = ptr + task->data[player + 1] * BUFFER_CHUNK_SIZE + player * sizeof(struct PlayerRecords);
+ dst = LoadPtrFromTaskData(&task->data[5]) + task->data[player + 1] * BUFFER_CHUNK_SIZE + player * sizeof(struct PlayerRecords);
src = GetPlayerRecvBuffer(player);
- if ((u32)(task->data[player + 1] + 1) * BUFFER_CHUNK_SIZE > sizeof(struct PlayerRecords))
+ if ((task->data[player + 1] + 1) * BUFFER_CHUNK_SIZE > sizeof(struct PlayerRecords))
memcpy(dst, src, sizeof(struct PlayerRecords) - task->data[player + 1] * BUFFER_CHUNK_SIZE);
else
memcpy(dst, src, BUFFER_CHUNK_SIZE);
- //_080B993C
ResetBlockReceivedFlag(player);
task->data[player + 1]++;
if ((u16)task->data[player + 1] == 0x18)
- sp8 = (u8)(sp8 + 1);
+ handledPlayers++;
}
}
- //line 828
gTasks[task->data[0]].data[0]++;
}
//_080B998A
- if (sp8 == GetLinkPlayerCount())
+ if (handledPlayers == GetLinkPlayerCount())
DestroyTask(taskId);
}
@@ -445,18 +333,18 @@ void sub_80B99B4(u8 taskId)
DestroyTask(taskId);
}
-void sub_80B99E8(u8 taskId)
+void Task_RecordMixing_ReceivePacket(u8 taskId)
{
struct Task *task = &gTasks[taskId];
task->func = sub_80B99B4;
if (gUnknown_03000718 == 1)
- sub_80B93B0(task->data[5]);
+ RecordMixing_ReceiveExchangePacket(task->data[5]);
}
-void sub_80B9A1C(u8 taskId)
+void Task_RecordMixing_SendPacket_SwitchToReceive(u8 taskId)
{
- gTasks[taskId].func = sub_80B99E8;
+ gTasks[taskId].func = Task_RecordMixing_ReceivePacket;
gUnknown_03000718 = 1;
}
@@ -537,6 +425,7 @@ u8 sub_80B9BBC(u16 *a)
return a[16];
}
+#undef NONMATCHING
#ifdef NONMATCHING
void sub_80B9BC4(u32 a, u32 b, u32 c, u32 d)
diff --git a/src/rom3.c b/src/rom3.c
index 0169128cb..be6ae0b27 100644
--- a/src/rom3.c
+++ b/src/rom3.c
@@ -15,7 +15,6 @@ extern u8 unk_2000000[];
extern u16 gBattleTypeFlags;
extern const u32 gBitTable[];
extern u16 gBattleWeather;
-extern const struct BattleMove gBattleMoves[];
extern struct BattlePokemon gBattleMons[];
extern u8 gUnknown_020238C4;
@@ -582,7 +581,7 @@ void sub_800C47C(u8 taskId)
}
}
-void dp01_build_cmdbuf_x00_a_b_0(u8 a, int b, int c)
+void dp01_build_cmdbuf_x00_a_b_0(u8 a, u8 b, u8 c)
{
gUnknown_03004040[0] = 0;
gUnknown_03004040[1] = b;
@@ -591,7 +590,7 @@ void dp01_build_cmdbuf_x00_a_b_0(u8 a, int b, int c)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x01_a_b_0(u8 a, int b, int c)
+void dp01_build_cmdbuf_x01_a_b_0(u8 a, u8 b, u8 c)
{
gUnknown_03004040[0] = 1;
gUnknown_03004040[1] = b;
@@ -600,7 +599,7 @@ void dp01_build_cmdbuf_x01_a_b_0(u8 a, int b, int c)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x02_a_b_varargs(u8 a, int b, int c, u8 d, u8 *e)
+void dp01_build_cmdbuf_x02_a_b_varargs(u8 a, u8 b, u8 c, u8 d, u8 *e)
{
int i;
@@ -612,7 +611,7 @@ void dp01_build_cmdbuf_x02_a_b_varargs(u8 a, int b, int c, u8 d, u8 *e)
dp01_prepare_buffer(a, gUnknown_03004040, d + 3);
}
-void unref_sub_800C6A4(u8 a, int b, u8 c, u8 *d)
+void unref_sub_800C6A4(u8 a, u8 b, u8 c, u8 *d)
{
int i;
@@ -633,7 +632,7 @@ void dp01_build_cmdbuf_x04_4_4_4(u8 a)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void sub_800C704(u8 a, int b, int c)
+void sub_800C704(u8 a, u8 b, u8 c)
{
gUnknown_03004040[0] = 5;
gUnknown_03004040[1] = b;
@@ -642,7 +641,7 @@ void sub_800C704(u8 a, int b, int c)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x06_a(u8 a, int b)
+void dp01_build_cmdbuf_x06_a(u8 a, u8 b)
{
gUnknown_03004040[0] = 6;
gUnknown_03004040[1] = b;
@@ -703,7 +702,7 @@ void dp01_build_cmdbuf_x0C_C_C_C(u8 a)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x0D_a(u8 a, int b)
+void dp01_build_cmdbuf_x0D_a(u8 a, u8 b)
{
gUnknown_03004040[0] = 13;
gUnknown_03004040[1] = b;
@@ -721,7 +720,7 @@ void unref_sub_800C828(u8 a, u8 b, u8 *c)
dp01_prepare_buffer(a, gUnknown_03004040, b * 3 + 2);
}
-void dp01_build_cmdbuf_x0F_aa_b_cc_dddd_e_mlc_weather_00_x1Cbytes(u8 a, u16 b, u8 c, u16 d, int e, u8 f, u8 *g)
+void dp01_build_cmdbuf_x0F_aa_b_cc_dddd_e_mlc_weather_00_x1Cbytes(u8 a, u16 b, u8 c, u16 d, s32 e, u8 f, u8 *g)
{
gUnknown_03004040[0] = 15;
gUnknown_03004040[1] = b;
@@ -1039,7 +1038,7 @@ _0800CB54: .4byte gUnknown_030041C0\n\
.syntax divided\n");
}
-void dp01_build_cmdbuf_x12_a_bb(u8 a, int b, u16 c)
+void dp01_build_cmdbuf_x12_a_bb(u8 a, u8 b, u16 c)
{
gUnknown_03004040[0] = 18;
gUnknown_03004040[1] = b;
@@ -1048,14 +1047,14 @@ void dp01_build_cmdbuf_x12_a_bb(u8 a, int b, u16 c)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void unref_sub_800CB84(u8 a, int b)
+void unref_sub_800CB84(u8 a, u8 b)
{
gUnknown_03004040[0] = 19;
gUnknown_03004040[1] = b;
dp01_prepare_buffer(a, gUnknown_03004040, 2);
}
-void sub_800CBA4(u8 a, int b, int c, u8 *d)
+void sub_800CBA4(u8 a, u8 b, u8 c, u8 *d)
{
u32 i;
@@ -1078,7 +1077,7 @@ void sub_800CBE0(u8 a, u8 *b)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x16_a_b_c_ptr_d_e_f(u8 a, int b, int c, int d, u8 *e)
+void dp01_build_cmdbuf_x16_a_b_c_ptr_d_e_f(u8 a, u8 b, u8 c, u8 d, u8 *e)
{
int i;
@@ -1109,7 +1108,7 @@ void dp01_build_cmdbuf_x18_0_aa_health_bar_update(u8 a, s16 b)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x19_a_bb(u8 a, int b, s16 c)
+void dp01_build_cmdbuf_x19_a_bb(u8 a, u8 b, s16 c)
{
gUnknown_03004040[0] = 25;
gUnknown_03004040[1] = b;
@@ -1132,7 +1131,7 @@ void dp01_build_cmdbuf_x1A_aaaa_bbbb(u8 a, u32 b, u32 c)
dp01_prepare_buffer(a, gUnknown_03004040, 9);
}
-void dp01_build_cmdbuf_x1B_aaaa_b(u8 a, int b, u32 c)
+void dp01_build_cmdbuf_x1B_aaaa_b(u8 a, u8 b, u32 c)
{
gUnknown_03004040[0] = 27;
gUnknown_03004040[1] = b;
@@ -1143,7 +1142,7 @@ void dp01_build_cmdbuf_x1B_aaaa_b(u8 a, int b, u32 c)
dp01_prepare_buffer(a, gUnknown_03004040, 6);
}
-void dp01_build_cmdbuf_x1C_a(u8 a, int b)
+void dp01_build_cmdbuf_x1C_a(u8 a, u8 b)
{
gUnknown_03004040[0] = 28;
gUnknown_03004040[1] = b;
@@ -1203,7 +1202,7 @@ void unref_sub_800CE84(u8 a, u16 b, u8 *c)
dp01_prepare_buffer(a, gUnknown_03004040, b + 3);
}
-void dp01_build_cmdbuf_x21_a_bb(u8 a, int b, u16 c)
+void dp01_build_cmdbuf_x21_a_bb(u8 a, u8 b, u16 c)
{
gUnknown_03004040[0] = 33;
gUnknown_03004040[1] = b;
@@ -1212,7 +1211,7 @@ void dp01_build_cmdbuf_x21_a_bb(u8 a, int b, u16 c)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x22_a_three_bytes(u8 a, int b, u8 *c)
+void dp01_build_cmdbuf_x22_a_three_bytes(u8 a, u8 b, u8 *c)
{
int i;
@@ -1250,7 +1249,7 @@ void dp01_build_cmdbuf_x25_25_25_25(u8 a)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x26_a(u8 a, int b)
+void dp01_build_cmdbuf_x26_a(u8 a, u8 b)
{
gUnknown_03004040[0] = 38;
gUnknown_03004040[1] = b;
@@ -1320,7 +1319,7 @@ void dp01_build_cmdbuf_x2D_2D_2D_2D(u8 a)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x2E_a(u8 a, int b)
+void dp01_build_cmdbuf_x2E_a(u8 a, u8 b)
{
gUnknown_03004040[0] = 46;
gUnknown_03004040[1] = b;
@@ -1367,7 +1366,7 @@ void dp01_build_cmdbuf_x32_32_32_32(u8 a)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x33_a_33_33(u8 a, int b)
+void dp01_build_cmdbuf_x33_a_33_33(u8 a, u8 b)
{
gUnknown_03004040[0] = 51;
gUnknown_03004040[1] = b;
@@ -1376,7 +1375,7 @@ void dp01_build_cmdbuf_x33_a_33_33(u8 a, int b)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void dp01_build_cmdbuf_x34_a_bb_aka_battle_anim(u8 a, int b, u16 c)
+void dp01_build_cmdbuf_x34_a_bb_aka_battle_anim(u8 a, u8 b, u16 c)
{
gUnknown_03004040[0] = 52;
gUnknown_03004040[1] = b;
@@ -1385,21 +1384,21 @@ void dp01_build_cmdbuf_x34_a_bb_aka_battle_anim(u8 a, int b, u16 c)
dp01_prepare_buffer(a, gUnknown_03004040, 4);
}
-void sub_800D1D8(u8 a, int b)
+void sub_800D1D8(u8 a, u8 b)
{
gUnknown_03004040[0] = 53;
gUnknown_03004040[1] = b;
dp01_prepare_buffer(a, gUnknown_03004040, 2);
}
-void dp01_build_cmdbuf_x38_a(u8 a, int b)
+void dp01_build_cmdbuf_x38_a(u8 a, u8 b)
{
gUnknown_03004040[0] = 54;
gUnknown_03004040[1] = b;
dp01_prepare_buffer(a, gUnknown_03004040, 2);
}
-void dp01_build_cmdbuf_x37_a(u8 a, int b)
+void dp01_build_cmdbuf_x37_a(u8 a, u8 b)
{
gUnknown_03004040[0] = 55;
gUnknown_03004040[1] = b;
diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c
index b216bbe97..9561db690 100644
--- a/src/rom_8077ABC.c
+++ b/src/rom_8077ABC.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "battle.h"
#include "blend_palette.h"
+#include "data2.h"
#include "decompress.h"
#include "palette.h"
#include "species.h"
@@ -20,7 +21,6 @@
#define NUM_BATTLE_SLOTS 4
#define gBattleMonPartyPositions gUnknown_02024A6A
-#define gCastformFrontSpriteCoords gUnknownCastformCoords_0837F598
#define gCastformElevations gUnknownCastformData_0837F5A8
#define gCastformBackSpriteYCoords gUnknown_0837F5AC
#define gTransformPersonalities gUnknown_02024E70
@@ -41,13 +41,6 @@ struct TransformStatus {
u16 species;
};
-struct MonCoords {
- // This would use a bitfield, but sub_8079F44
- // uses it as a u8 and casting won't match.
- u8 coords; // u8 x:4, y:4;
- u8 y_offset;
-};
-
struct Struct_gUnknown_0837F578 {
u8 field_0;
u8 field_1;
@@ -102,11 +95,8 @@ extern struct Struct_unk_2019348 unk_2019348;
extern struct TransformStatus gTransformStatuses[];
extern u16 gBattleMonPartyPositions[];
extern u16 gBattleTypeFlags;
-extern struct MonCoords gMonBackPicCoords[];
-extern struct MonCoords gMonFrontPicCoords[];
extern u32 gTransformPersonalities[NUM_BATTLE_SLOTS];
extern u8 gBattleMonForms[NUM_BATTLE_SLOTS];
-extern u8 gEnemyMonElevation[];
extern u16 gUnknown_0202F7CA[];
extern u8 gBattleMonSprites[NUM_BATTLE_SLOTS];
extern u8 gBattleAnimPlayerMonIndex;
@@ -117,9 +107,6 @@ extern u8 gUnknown_02024A68; // gNumBattleMons?
extern struct OamMatrix gOamMatrices[];
extern struct Struct_2017810 unk_2017810[];
extern u8 gUnknown_0202F7BE;
-extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E7C18;
-extern struct SpriteSheet gMonFrontPicTable[];
-extern struct SpriteSheet gMonBackPicTable[];
extern u8 IsContest();
extern bool8 sub_8078874(u8);
diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c
index d46abc74d..a3de0bd00 100644
--- a/src/save_failed_screen.c
+++ b/src/save_failed_screen.c
@@ -7,6 +7,7 @@
#include "palette.h"
#include "save.h"
#include "sprite.h"
+#include "strings.h"
#include "task.h"
#include "text.h"
@@ -36,13 +37,6 @@ extern u32 gGameContinueCallback;
extern u8 gBirchHelpGfx[];
-extern u8 gSystemText_SaveFailedBackupCheck[];
-extern u8 gSystemText_CheckCompleteSaveAttempt[];
-extern u8 gSystemText_BackupDamagedGameContinue[];
-extern u8 gSystemText_SaveCompletedPressA[];
-extern u8 gSystemText_SaveCompletedGameEnd[];
-extern u8 gSystemText_GameplayEnded[];
-
extern u8 gBirchGrassTilemap[];
extern u8 gBirchBagTilemap[];
extern u8 gBirchBagGrassPal[0x40];
@@ -110,59 +104,59 @@ static void CB2_SaveFailedScreen(void)
switch (gMain.state)
{
- case 0:
- default:
- SetVBlankCallback(0);
- REG_DISPCNT = 0;
- REG_BG3CNT = 0;
- REG_BG2CNT = 0;
- REG_BG1CNT = 0;
- REG_BG0CNT = 0;
- REG_BG3HOFS = 0;
- REG_BG3VOFS = 0;
- REG_BG2HOFS = 0;
- REG_BG2VOFS = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- DmaFill16(3, 0, VRAM, VRAM_SIZE);
- DmaFill32(3, 0, OAM, OAM_SIZE);
- DmaFill16(3, 0, PLTT, PLTT_SIZE);
- LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM);
- LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000));
- LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800));
- LZ77UnCompVram(&gSaveFailedClockGfx, (void *)(VRAM + 0x10020));
- ResetSpriteData();
- ResetTasks();
- ResetPaletteFade();
- LoadPalette(&gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal));
- LoadPalette(&gSaveFailedClockPal, 0x100, sizeof(gSaveFailedClockPal));
- SetUpWindowConfig(&gWindowConfig_81E6C3C);
- InitMenuWindow(&gWindowConfig_81E6CE4);
- MenuDrawTextWindow(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window
- MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); // message window
- MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
- ime = REG_IME;
- REG_IME = 0;
- REG_IE |= INTR_FLAG_VBLANK;
- REG_IME = ime;
- REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
- SetVBlankCallback(VBlankCB);
- REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256;
- REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG2_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0;
- gMain.state++;
- break;
- case 1:
- if (!UpdatePaletteFade())
- {
- SetMainCallback2(CB2_WipeSave);
- SetVBlankCallback(VBlankCB_UpdateClockGraphics);
- }
- break;
+ case 0:
+ default:
+ SetVBlankCallback(0);
+ REG_DISPCNT = 0;
+ REG_BG3CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG0CNT = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ DmaFill16(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill16(3, 0, PLTT, PLTT_SIZE);
+ LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM);
+ LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000));
+ LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800));
+ LZ77UnCompVram(&gSaveFailedClockGfx, (void *)(VRAM + 0x10020));
+ ResetSpriteData();
+ ResetTasks();
+ ResetPaletteFade();
+ LoadPalette(&gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal));
+ LoadPalette(&gSaveFailedClockPal, 0x100, sizeof(gSaveFailedClockPal));
+ SetUpWindowConfig(&gWindowConfig_81E6C3C);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ MenuDrawTextWindow(13, CLOCK_WIN_TOP, 16, CLOCK_WIN_TOP + 3); // clock window
+ MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19); // message window
+ MenuPrint(gSystemText_SaveFailedBackupCheck, 2, MSG_WIN_TOP + 1);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ ime = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = ime;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ SetVBlankCallback(VBlankCB);
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(6) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG2_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_MODE_0;
+ gMain.state++;
+ break;
+ case 1:
+ if (!UpdatePaletteFade())
+ {
+ SetMainCallback2(CB2_WipeSave);
+ SetVBlankCallback(VBlankCB_UpdateClockGraphics);
+ }
+ break;
}
}
diff --git a/src/save_menu_util.c b/src/save_menu_util.c
index 7899fabb1..8910bb300 100644
--- a/src/save_menu_util.c
+++ b/src/save_menu_util.c
@@ -5,11 +5,7 @@
#include "menu.h"
#include "pokedex.h"
#include "string_util.h"
-
-extern u8 gOtherText_Player[];
-extern u8 gOtherText_Badges[];
-extern u8 gOtherText_Pokedex[];
-extern u8 gOtherText_PlayTime[];
+#include "strings2.h"
void HandleDrawSaveWindowInfo(s16 left, s16 top)
{
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 136181bd3..33867b58a 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -6,6 +6,7 @@
#include "clock.h"
#include "coins.h"
#include "contest_painting.h"
+#include "data2.h"
#include "decoration.h"
#include "event_data.h"
#include "field_door.h"
@@ -59,9 +60,6 @@ extern SpecialFunc gSpecials[];
extern u8 *gStdScripts[];
extern u8 *gStdScripts_End[];
-extern u8 gSpeciesNames[][11];
-extern u8 gMoveNames[][13];
-
extern u8 * const gUnknown_083CE048[];
extern struct Decoration gDecorations[];
diff --git a/src/script_menu.c b/src/script_menu.c
index f62b62ac7..d6e328eb4 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -913,19 +913,19 @@ void task_picbox(u8 taskId)
switch (task->data[0])
{
- case 0:
- task->data[0]++;
- break;
- case 1:
- break;
- case 2:
- FreeResourcesAndDestroySprite(&gSprites[task->data[2]]);
- task->data[0]++;
- break;
- case 3:
- MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10);
- DestroyTask(taskId);
- break;
+ case 0:
+ task->data[0]++;
+ break;
+ case 1:
+ break;
+ case 2:
+ FreeResourcesAndDestroySprite(&gSprites[task->data[2]]);
+ task->data[0]++;
+ break;
+ case 3:
+ MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10);
+ DestroyTask(taskId);
+ break;
}
}
diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c
index e53eb30cb..abc4dbc9e 100644
--- a/src/script_pokemon_util_80C4BF0.c
+++ b/src/script_pokemon_util_80C4BF0.c
@@ -3,6 +3,7 @@
#include "battle.h"
#include "berry.h"
#include "contest.h"
+#include "data2.h"
#include "decompress.h"
#include "event_data.h"
#include "items.h"
@@ -21,9 +22,6 @@
#define CONTEST_ENTRY_PIC_LEFT 10
#define CONTEST_ENTRY_PIC_TOP 3
-extern const struct SpriteSheet gMonFrontPicTable[];
-extern struct MonCoords gMonFrontPicCoords[];
-
extern void sub_80C46EC(void);
extern void sub_80C4740(void);
extern void sub_80C48F4(void);
@@ -35,7 +33,6 @@ extern void sub_8042044(struct Pokemon *mon, u16, u8);
extern void sub_8121E10(void);
extern void sub_8121E34(void);
-extern void *gUnknown_081FAF4C[];
extern struct SpriteTemplate gUnknown_02024E8C;
extern struct SpritePalette *sub_80409C8(u16, u32, u32);
@@ -73,18 +70,18 @@ void sub_80C4C28(void)
switch(specialVar)
{
- case 0:
- var = 3;
- break;
- case 1:
- var = 4;
- break;
- case 2:
- var = 5;
- break;
- default:
- var = 100;
- break;
+ case 0:
+ var = 3;
+ break;
+ case 1:
+ var = 4;
+ break;
+ case 2:
+ var = 5;
+ break;
+ default:
+ var = 100;
+ break;
}
gSpecialVar_0x8004 = var;
}
@@ -103,22 +100,22 @@ void sub_80C4C78(void)
switch(gScriptContestCategory)
{
- case 0:
- var = 8;
- break;
- case 1:
- var = 9;
- break;
- case 2:
- var = 10;
- break;
- case 3:
- var = 11;
- break;
- case 4:
- default:
- var = 12;
- break;
+ case 0:
+ var = 8;
+ break;
+ case 1:
+ var = 9;
+ break;
+ case 2:
+ var = 10;
+ break;
+ case 3:
+ var = 11;
+ break;
+ case 4:
+ default:
+ var = 12;
+ break;
}
returnVar = gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[var].var;
@@ -437,7 +434,7 @@ void ShowContestEntryMonPic(void)
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = species;
HandleLoadSpecialPokePic((struct SpriteSheet *)&gMonFrontPicTable[species].data,
- gMonFrontPicCoords[species].x, gMonFrontPicCoords[species].y,
+ gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset,
(u32)gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], species, var1);
paletteData = sub_80409C8(species, var2, var1);
LoadCompressedObjectPalette(paletteData);
@@ -467,26 +464,26 @@ void sub_80C5190(u8 taskId)
switch(task->data[0])
{
- case 2:
- sprite = &gSprites[task->data[2]];
- FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
-
- if(sprite->oam.affineMode)
- FreeOamMatrix(sprite->oam.matrixNum);
-
- DestroySprite(sprite);
- task->data[0]++;
- break;
- case 0:
- task->data[0]++;
- break;
- case 3:
- MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10);
- DestroyTask(taskId);
- break;
- case 1:
- default:
- break;
+ case 2:
+ sprite = &gSprites[task->data[2]];
+ FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum));
+
+ if(sprite->oam.affineMode)
+ FreeOamMatrix(sprite->oam.matrixNum);
+
+ DestroySprite(sprite);
+ task->data[0]++;
+ break;
+ case 0:
+ task->data[0]++;
+ break;
+ case 3:
+ MenuZeroFillWindowRect(task->data[3], task->data[4], task->data[3] + 9, task->data[4] + 10);
+ DestroyTask(taskId);
+ break;
+ case 1:
+ default:
+ break;
}
}
@@ -593,15 +590,15 @@ void CheckForAlivePartyMons(void)
switch(var)
{
- case 1:
- gScriptResult = var;
- break;
- case 0:
- gScriptResult = var;
- break;
- case 2:
- gScriptResult = var;
- break;
+ case 1:
+ gScriptResult = var;
+ break;
+ case 0:
+ gScriptResult = var;
+ break;
+ case 2:
+ gScriptResult = var;
+ break;
}
}
@@ -663,12 +660,12 @@ void sub_80C5580(void)
switch(var)
{
- case 0:
- gScriptResult = 0;
- break;
- default:
- gScriptResult = 1;
- break;
+ case 0:
+ gScriptResult = 0;
+ break;
+ default:
+ gScriptResult = 1;
+ break;
}
SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
@@ -686,14 +683,14 @@ void SetBattleTowerPlayerParty(void)
switch(var)
{
- case 0: // player quit battle tower?
- LoadPlayerParty();
- gScriptResult = 0;
- break;
- default: // load battle tower.
- ReducePlayerPartyToThree();
- gScriptResult = 1;
- break;
+ case 0: // player quit battle tower?
+ LoadPlayerParty();
+ gScriptResult = 0;
+ break;
+ default: // load battle tower.
+ ReducePlayerPartyToThree();
+ gScriptResult = 1;
+ break;
}
SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
diff --git a/src/script_pokemon_util_80F99CC.c b/src/script_pokemon_util_80F99CC.c
index ce62f2abb..9e833ec34 100644
--- a/src/script_pokemon_util_80F99CC.c
+++ b/src/script_pokemon_util_80F99CC.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "asm.h"
#include "battle_party_menu.h"
+#include "data2.h"
#include "palette.h"
#include "pokemon.h"
#include "rom4.h"
@@ -17,8 +18,6 @@ extern u16 gSpecialVar_0x8005;
extern u8 gUnknown_02038694;
extern u16 gScriptResult;
-extern u8 gMoveNames[][13];
-
extern void (*gUnknown_0300485C)(void);
extern void OpenPartyMenu(u8, u8);
@@ -81,62 +80,62 @@ bool8 sub_80F9ACC(void)
{
switch(EWRAM_1B000.unk264)
{
- case 0:
- if(EWRAM_1B000.unk266 < gPlayerPartyCount)
- {
- TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]);
- EWRAM_1B000.unk266++;
- }
- else
- {
- EWRAM_1B000.unk266 = 0;
- EWRAM_1B000.unk264++;
- }
- break;
- case 1:
- LoadHeldItemIconGraphics();
- EWRAM_1B000.unk264++;
- break;
- case 2:
- CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260);
- EWRAM_1B000.unk264++;
- break;
- case 3:
- if(sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1)
- {
- EWRAM_1B000.unk266++;
- break;
- }
- else
- {
- EWRAM_1B000.unk266 = 0;
- EWRAM_1B000.unk264++;
- break;
- }
- case 4:
- PartyMenuPrintMonsLevelOrStatus();
+ case 0:
+ if(EWRAM_1B000.unk266 < gPlayerPartyCount)
+ {
+ TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]);
+ EWRAM_1B000.unk266++;
+ }
+ else
+ {
+ EWRAM_1B000.unk266 = 0;
EWRAM_1B000.unk264++;
+ }
+ break;
+ case 1:
+ LoadHeldItemIconGraphics();
+ EWRAM_1B000.unk264++;
+ break;
+ case 2:
+ CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260);
+ EWRAM_1B000.unk264++;
+ break;
+ case 3:
+ if(sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1)
+ {
+ EWRAM_1B000.unk266++;
break;
- case 5:
- PrintPartyMenuMonNicknames();
+ }
+ else
+ {
+ EWRAM_1B000.unk266 = 0;
EWRAM_1B000.unk264++;
break;
- case 6:
- sub_80F9C00();
- EWRAM_1B000.unk264++;
+ }
+ case 4:
+ PartyMenuPrintMonsLevelOrStatus();
+ EWRAM_1B000.unk264++;
+ break;
+ case 5:
+ PrintPartyMenuMonNicknames();
+ EWRAM_1B000.unk264++;
+ break;
+ case 6:
+ sub_80F9C00();
+ EWRAM_1B000.unk264++;
+ break;
+ case 7: // the only case that can return true.
+ if(sub_806B58C(EWRAM_1B000.unk266) != 1)
+ {
+ EWRAM_1B000.unk266++;
break;
- case 7: // the only case that can return true.
- if(sub_806B58C(EWRAM_1B000.unk266) != 1)
- {
- EWRAM_1B000.unk266++;
- break;
- }
- else
- {
- EWRAM_1B000.unk266 = 0;
- EWRAM_1B000.unk264 = 0;
- return TRUE;
- }
+ }
+ else
+ {
+ EWRAM_1B000.unk266 = 0;
+ EWRAM_1B000.unk264 = 0;
+ return TRUE;
+ }
}
return FALSE;
}
@@ -149,15 +148,15 @@ void sub_80F9C00(void)
{
switch(sub_80AE47C(&gPlayerParty[i]))
{
- case 0:
- case 3:
- case 4:
- sub_806BC3C(i, 0x7E);
- break;
- case 1:
- case 2:
- sub_806BC3C(i, 0x70);
- break;
+ case 0:
+ case 3:
+ case 4:
+ sub_806BC3C(i, 0x7E);
+ break;
+ case 1:
+ case 2:
+ sub_806BC3C(i, 0x70);
+ break;
}
}
}
@@ -168,18 +167,18 @@ void sub_80F9C6C(u8 var)
{
switch(sub_806BD80(var))
{
- case 1:
- PlaySE(5);
- gUnknown_02038694 = sub_806CA38(var);
- gSpecialVar_0x8004 = gUnknown_02038694;
- sub_8123138(var);
- break;
- case 2:
- PlaySE(5);
- gUnknown_02038694 = 0xFF;
- gSpecialVar_0x8004 = 0xFF;
- sub_8123138(var);
- break;
+ case 1:
+ PlaySE(5);
+ gUnknown_02038694 = sub_806CA38(var);
+ gSpecialVar_0x8004 = gUnknown_02038694;
+ sub_8123138(var);
+ break;
+ case 2:
+ PlaySE(5);
+ gUnknown_02038694 = 0xFF;
+ gSpecialVar_0x8004 = 0xFF;
+ sub_8123138(var);
+ break;
}
}
}
@@ -188,62 +187,62 @@ bool8 sub_80F9CE8(void) // this is the same function as sub_80F9ACC except case
{
switch(EWRAM_1B000.unk264)
{
- case 0:
- if(EWRAM_1B000.unk266 < gPlayerPartyCount)
- {
- TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]);
- EWRAM_1B000.unk266++;
- }
- else
- {
- EWRAM_1B000.unk266 = 0;
- EWRAM_1B000.unk264++;
- }
- break;
- case 1:
- LoadHeldItemIconGraphics();
- EWRAM_1B000.unk264++;
- break;
- case 2:
- CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260);
- EWRAM_1B000.unk264++;
- break;
- case 3:
- if(sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1)
- {
- EWRAM_1B000.unk266++;
- break;
- }
- else
- {
- EWRAM_1B000.unk266 = 0;
- EWRAM_1B000.unk264++;
- break;
- }
- case 4:
- PartyMenuPrintMonsLevelOrStatus();
+ case 0:
+ if(EWRAM_1B000.unk266 < gPlayerPartyCount)
+ {
+ TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]);
+ EWRAM_1B000.unk266++;
+ }
+ else
+ {
+ EWRAM_1B000.unk266 = 0;
EWRAM_1B000.unk264++;
+ }
+ break;
+ case 1:
+ LoadHeldItemIconGraphics();
+ EWRAM_1B000.unk264++;
+ break;
+ case 2:
+ CreateHeldItemIcons_806DC34(EWRAM_1B000.unk260);
+ EWRAM_1B000.unk264++;
+ break;
+ case 3:
+ if(sub_806BD58(EWRAM_1B000.unk260, EWRAM_1B000.unk266) != 1)
+ {
+ EWRAM_1B000.unk266++;
break;
- case 5:
- PrintPartyMenuMonNicknames();
+ }
+ else
+ {
+ EWRAM_1B000.unk266 = 0;
EWRAM_1B000.unk264++;
break;
- case 6:
- sub_80F9E1C();
- EWRAM_1B000.unk264++;
+ }
+ case 4:
+ PartyMenuPrintMonsLevelOrStatus();
+ EWRAM_1B000.unk264++;
+ break;
+ case 5:
+ PrintPartyMenuMonNicknames();
+ EWRAM_1B000.unk264++;
+ break;
+ case 6:
+ sub_80F9E1C();
+ EWRAM_1B000.unk264++;
+ break;
+ case 7: // the only case that can return true.
+ if(sub_806B58C(EWRAM_1B000.unk266) != 1)
+ {
+ EWRAM_1B000.unk266++;
break;
- case 7: // the only case that can return true.
- if(sub_806B58C(EWRAM_1B000.unk266) != 1)
- {
- EWRAM_1B000.unk266++;
- break;
- }
- else
- {
- EWRAM_1B000.unk266 = 0;
- EWRAM_1B000.unk264 = 0;
- return TRUE;
- }
+ }
+ else
+ {
+ EWRAM_1B000.unk266 = 0;
+ EWRAM_1B000.unk264 = 0;
+ return TRUE;
+ }
}
return FALSE;
}
@@ -267,16 +266,16 @@ void sub_80F9E64(u8 var)
{
switch(sub_806BD80(var))
{
- case 1:
- PlaySE(5);
- gSpecialVar_0x8004 = sub_806CA38(var);
- gSpecialVar_0x8005 = sub_8040574(&gPlayerParty[gSpecialVar_0x8004]);
- sub_8123138(var);
- break;
- case 2:
- PlaySE(5);
- gSpecialVar_0x8004 = 0xFF;
- sub_8123138(var);
+ case 1:
+ PlaySE(5);
+ gSpecialVar_0x8004 = sub_806CA38(var);
+ gSpecialVar_0x8005 = sub_8040574(&gPlayerParty[gSpecialVar_0x8004]);
+ sub_8123138(var);
+ break;
+ case 2:
+ PlaySE(5);
+ gSpecialVar_0x8004 = 0xFF;
+ sub_8123138(var);
}
}
}
diff --git a/src/secret_base.c b/src/secret_base.c
index 572dfaa1d..c210a55d2 100644
--- a/src/secret_base.c
+++ b/src/secret_base.c
@@ -2,10 +2,831 @@
#include "string_util.h"
#include "strings.h"
#include "text.h"
+#include "event_data.h"
+#include "vars.h"
+#include "rom4.h"
+#include "asm.h"
+#include "script.h"
+#include "field_player_avatar.h"
+#include "field_camera.h"
+#include "map_constants.h"
+#include "task.h"
+#include "palette.h"
+#include "decoration.h"
+#include "field_weather.h"
+#include "metatile_behavior.h"
+#include "pokemon.h"
-u8 sub_80BB8A8(void *);
+extern u8 gUnknown_020387DC;
+extern u16 gSpecialVar_0x8004;
+extern u16 gSpecialVar_0x8005;
+extern u16 gSpecialVar_0x8006;
+extern u16 gSpecialVar_0x8007;
+extern u16 gScriptResult;
+extern const struct
+{
+ u16 unk_083D1358_0;
+ u16 unk_083D1358_1;
+} gUnknown_083D1358[7];
+extern const u8 gUnknown_083D1374[4 * 16];
+extern void *gUnknown_0300485C;
+extern const u8 sub_807D770(void);
+extern const u8 gUnknown_083D13EC[12];
+extern const u8 sub_80BCCA4(u8);
+extern u8 gUnknown_081A2E14[];
-u8 *sub_80BC190(u8 *dest, u8 arg1) {
+
+void sub_80BB4AC(struct SecretBaseRecord *record) // 080bb4ac
+{
+ u16 i;
+ u16 j;
+ record->sbr_field_0 = 0;
+ for (i=0; i<7; i++)
+ record->sbr_field_2[i] = 0xff;
+ for (i=0; i<4; i++)
+ record->trainerId[i] = 0x00;
+ record->sbr_field_e = 0;
+ record->sbr_field_10 = 0;
+ record->sbr_field_11 = 0;
+ record->sbr_field_1_0 = 0;
+ record->gender = 0;
+ record->sbr_field_1_5 = 0;
+ record->sbr_field_1_6 = 0;
+ for (i=0; i<16; i++) {
+ record->decorations[i] = 0;
+ record->decorationPos[i] = 0;
+ }
+ for (i=0; i<6; i++) {
+ for (j=0; j<4; j++) {
+ record->partyMoves[i * 4 + j] = 0;
+ }
+ record->partyPersonality[i] = 0;
+ record->partyEVs[i] = 0;
+ record->partySpecies[i] = 0;
+ record->partyHeldItems[i] = 0;
+ record->partyLevels[i] = 0;
+ }
+}
+
+void ResetSecretBase(u8 idx) // 80bb594
+{
+ sub_80BB4AC(&(gSaveBlock1.secretBases[idx]));
+}
+
+void ResetSecretBases(void) // 080bb5b4
+{
+ u16 i;
+ for (i=0; i<20; i++)
+ ResetSecretBase(i);
+}
+
+void sub_80BB5D0(void) // 080bb5d0
+{
+ gUnknown_020387DC = gSpecialVar_0x8004;
+}
+
+void sub_80BB5E4(void) // 80bb5e4
+{
+ u16 idx;
+ gScriptResult = 0;
+ for (idx=0; idx<20; idx++) {
+ if (gUnknown_020387DC != gSaveBlock1.secretBases[idx].sbr_field_0)
+ continue;
+ gScriptResult = 1;
+ VarSet(VAR_0x4054, idx);
+ break;
+ }
+}
+
+void sub_80BB63C(void) // 80bb63c
+{
+ if (gSaveBlock1.secretBases[0].sbr_field_0)
+ gScriptResult = 1;
+ else
+ gScriptResult = 0;
+}
+
+u8 sub_80BB66C(void) // 80bb66c
+{
+ s16 x, y;
+ s16 v0;
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ v0 = MapGridGetMetatileBehaviorAt(x, y) & 0xFFF;
+ if (v0 == 0x90 || v0 == 0x91)
+ return 1;
+ else if (v0 == 0x92 || v0 == 0x93)
+ return 2;
+ else if (v0 == 0x9a || v0 == 0x9b)
+ return 3;
+ else if (v0 == 0x94 || v0 == 0x95)
+ return 4;
+ else if (v0 == 0x96 || v0 == 0x97 || v0 == 0x9c || v0 == 0x9d)
+ return 5;
+ else if (v0 == 0x98 || v0 == 0x99)
+ return 6;
+ return 0;
+}
+
+void sub_80BB70C(void) // 80bb70c
+{
+ gSpecialVar_0x8007 = sub_80BB66C();
+}
+
+s16 unref_sub_80BB724(u16 *a0, u8 a1)
+{
+ u16 v2;
+ for (v2=0; v2<0x200; v2++) {
+ if ((a0[v2] & 0xFFF) == a1)
+ return (s16)v2;
+ }
+ return -1;
+}
+
+void sub_80BB764(s16 *arg1, s16 *arg2, u16 arg3)
+{
+ s16 x, y;
+ for (y=0; y<gMapHeader.mapData->height; y++) {
+ for (x=0; x<gMapHeader.mapData->width; x++) {
+ if ((gMapHeader.mapData->map[y * gMapHeader.mapData->width + x] & 0x3ff) == arg3) {
+ *arg1 = x;
+ *arg2 = y;
+ return;
+ }
+ }
+ }
+}
+
+void sub_80BB800(void)
+{
+ s16 x, y;
+ s16 tile_id;
+ u16 idx;
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ tile_id = MapGridGetMetatileIdAt(x, y);
+ for (idx=0; idx<7; idx++) {
+ if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) {
+ MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00);
+ CurrentMapDrawMetatileAt(x, y);
+ return;
+ }
+ }
+ for (idx=0; idx<7; idx++) {
+ if (gUnknown_083D1358[idx].unk_083D1358_1 == tile_id) {
+ MapGridSetMetatileIdAt(x, y, gUnknown_083D1358[idx].unk_083D1358_0 | 0xc00);
+ CurrentMapDrawMetatileAt(x, y);
+ return;
+ }
+ }
+}
+
+u8 sub_80BB8A8(u8 *arg1)
+{
+ u8 idx;
+ for (idx=0; idx<7; idx++) {
+ if (arg1[idx] == EOS)
+ return idx;
+ }
+ return 7;
+}
+
+void sub_80BB8CC(void)
+{
+ u8 nameLength;
+ u16 idx;
+ gSaveBlock1.secretBases[0].sbr_field_0 = gUnknown_020387DC;
+ for (idx=0; idx<4; idx++) {
+ gSaveBlock1.secretBases[0].trainerId[idx] = gSaveBlock2.playerTrainerId[idx];
+ }
+ VarSet(VAR_0x4054, 0);
+ nameLength = sub_80BB8A8(gSaveBlock2.playerName);
+ memset(gSaveBlock1.secretBases[0].sbr_field_2, 0xFF, 7);
+ StringCopyN(gSaveBlock1.secretBases[0].sbr_field_2, gSaveBlock2.playerName, nameLength);
+ gSaveBlock1.secretBases[0].gender = gSaveBlock2.playerGender;
+ VarSet(VAR_SECRET_BASE_MAP, gMapHeader.name);
+}
+
+void sub_80BB970(struct MapEvents *events)
+{
+ u16 bgevidx, idx, jdx;
+ s16 tile_id;
+ for (bgevidx=0; bgevidx<events->bgEventCount; bgevidx++) {
+ if (events->bgEvents[bgevidx].kind == 8) {
+ for (jdx=0; jdx<20; jdx++) {
+ if (gSaveBlock1.secretBases[jdx].sbr_field_0 == events->bgEvents[bgevidx].bgUnion.secretBaseId) {
+ tile_id = MapGridGetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7);
+ for (idx=0; idx<7; idx++) {
+ if (gUnknown_083D1358[idx].unk_083D1358_0 == tile_id) {
+ MapGridSetMetatileIdAt(events->bgEvents[bgevidx].x + 7, events->bgEvents[bgevidx].y + 7, gUnknown_083D1358[idx].unk_083D1358_1 | 0xc00);
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+}
+
+void sub_80BBA14(void)
+{
+ s8 idx = 4 * (gUnknown_020387DC / 10);
+ warp1_set_2(MAP_GROUP_SECRET_BASE_RED_CAVE1, gUnknown_083D1374[idx], gUnknown_083D1374[idx + 1]);
+}
+
+void sub_80BBA48(u8 taskid)
+{
+ u16 curbaseid;
+ switch (gTasks[taskid].data[0]) {
+ case 0:
+ gTasks[taskid].data[0] = 1;
+ break;
+ case 1:
+ if (!gPaletteFade.active) {
+ gTasks[taskid].data[0] = 2;
+ }
+ break;
+ case 2:
+ curbaseid = VarGet(VAR_0x4054);
+ if (gSaveBlock1.secretBases[curbaseid].sbr_field_10 < 0xff)
+ gSaveBlock1.secretBases[curbaseid].sbr_field_10 ++;
+ sub_80BBA14();
+ warp_in();
+ gUnknown_0300485C = sub_8080990;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(taskid);
+ break;
+ }
+}
+
+void sub_80BBAF0(void)
+{
+ CreateTask(sub_80BBA48, 0);
+ fade_screen(1, 0);
+ saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1);
+}
+
+bool8 sub_80BBB24(void)
+{
+ if (gMapHeader.mapType == 9 && VarGet(VAR_0x4097) == 0)
+ return FALSE;
+ return TRUE;
+}
+
+void sub_80BBB50(u8 taskid)
+{
+ FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2);
+ if (sub_807D770() == 1) {
+ EnableBothScriptContexts();
+ DestroyTask(taskid);
+ }
+}
+
+void sub_80BBB90(void)
+{
+ s16 x, y;
+ ScriptContext2_Enable();
+ HideMapNamePopup();
+ sub_80BB764(&x, &y, 0x220);
+ MapGridSetMetatileIdAt(x + 7, y + 7, 0xe20);
+ CurrentMapDrawMetatileAt(x + 7, y + 7);
+ pal_fill_black();
+ CreateTask(sub_80BBB50, 0);
+}
+
+void sub_80BBBEC(u8 taskid)
+{
+ s8 idx;
+ if (!gPaletteFade.active) {
+ idx = 4 * (gUnknown_020387DC / 10);
+ warp1_set(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1, gUnknown_083D1374[idx + 2], gUnknown_083D1374[idx + 3]);
+ warp_in();
+ gUnknown_0300485C = sub_80BBB90;
+ SetMainCallback2(CB2_LoadMap);
+ DestroyTask(taskid);
+ }
+}
+
+void sub_80BBC78(void)
+{
+ u8 taskid = CreateTask(sub_80BBBEC, 0);
+ gTasks[taskid].data[0] = 0;
+ fade_screen(1, 0);
+}
+
+bool8 CurrentMapIsSecretBase(void)
+{
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP_SECRET_BASE_SHRUB4 && (u8)(gSaveBlock1.location.mapNum) <= MAP_ID_SECRET_BASE_SHRUB4)
+ return TRUE;
+ return FALSE;
+}
+
+#ifdef NONMATCHING
+void sub_80BBCCC(u8 flagIn)
+{
+ u16 curBaseId;
+ u16 x, y;
+ if (CurrentMapIsSecretBase()) {
+ curBaseId = VarGet(VAR_0x4054);
+ for (x=0; x<16; x++) {
+ if ((u8)(gSaveBlock1.secretBases[curBaseId].decorations[x] - 1) <= 0x77 && gDecorations[gSaveBlock1.secretBases[curBaseId].decorations[x]].decor_field_11 != 4) {
+ sub_80FF394((gSaveBlock1.secretBases[0].decorationPos[x] >> 4) + 7, (gSaveBlock1.secretBases[0].decorationPos[x] & 0xF) + 7, gSaveBlock1.secretBases[curBaseId].decorations[x]);
+ }
+ }
+ if (curBaseId != 0) {
+ sub_80BB764(&x, &y, 0x220);
+ MapGridSetMetatileIdAt(x + 7, y + 7, 0xe21);
+ } else if (flagIn == 1 && VarGet(VAR_0x4089) == 1) {
+ sub_80BB764(&x, &y, 0x220);
+ MapGridSetMetatileIdAt(x + 7, y + 7, 0xe0a);
+ }
+ }
+}
+
+void sub_80BBDD0(void)
+{
+ u8 *roomdecor;
+ u8 *roomdecorpos;
+ u8 ndecor;
+ u8 decidx;
+ u8 objid = 0;
+ u8 metatile;
+ u16 curBase = VarGet(VAR_0x4054);
+ if (!CurrentMapIsSecretBase()) {
+ roomdecor = gSaveBlock1.playerRoomDecor;
+ roomdecorpos = gSaveBlock1.playerRoomDecorPos;
+ ndecor = 12;
+ } else {
+ roomdecor = gSaveBlock1.secretBases[curBase].decorations;
+ roomdecorpos = gSaveBlock1.secretBases[curBase].decorationPos;
+ ndecor = 16;
+ }
+ for (decidx=0; decidx<ndecor; decidx++) {
+ if (roomdecor[decidx] == 0)
+ continue;
+ if (gDecorations[roomdecor[decidx]].decor_field_11 != 4)
+ continue;
+ for (objid=0; objid<gMapHeader.events->mapObjectCount; objid++) {
+ if (gMapHeader.events->mapObjects[objid].flagId == gSpecialVar_0x8004 + 0xAE)
+ break;
+ }
+ if (objid != gMapHeader.events->mapObjectCount) {
+ gSpecialVar_0x8006 = roomdecorpos[decidx] >> 4;
+ gSpecialVar_0x8007 = roomdecorpos[decidx] & 0xF;
+ metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7);
+ if (sub_80572D8(metatile) == 1 || sub_80572EC(metatile) == 1) {
+ gScriptResult = gMapHeader.events->mapObjects[objid].graphicsId + 0x3f20;
+ VarSet(gScriptResult, gDecorations[roomdecor[decidx]].tiles[0]);
+ gScriptResult = gMapHeader.events->mapObjects[objid].localId;
+ FlagReset(gSpecialVar_0x8004 + 0xAE);
+ show_sprite(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
+ sub_805C0F8(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007);
+ sub_805C78C(gScriptResult, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
+ gSpecialVar_0x8004 ++;
+ }
+ }
+ }
+}
+
+#else
+__attribute__((naked))
+void sub_80BBCCC(u8 flagIn)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ sub sp, 0x4\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r8, r0\n\
+ bl CurrentMapIsSecretBase\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080BBDBC\n\
+ ldr r0, _080BBD70 @ =0x00004054\n\
+ bl VarGet\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ movs r1, 0\n\
+ mov r0, sp\n\
+ strh r1, [r0]\n\
+ ldr r6, _080BBD74 @ =gSaveBlock1\n\
+ mov r4, sp\n\
+ ldr r0, _080BBD78 @ =0x00001a2a\n\
+ adds r7, r6, r0\n\
+_080BBCFC:\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 5\n\
+ ldrh r1, [r4]\n\
+ adds r2, r0, r1\n\
+ ldr r1, _080BBD7C @ =0x00001a1a\n\
+ adds r0, r6, r1\n\
+ adds r1, r2, r0\n\
+ ldrb r0, [r1]\n\
+ subs r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x77\n\
+ bhi _080BBD3A\n\
+ ldr r0, _080BBD80 @ =gDecorations\n\
+ ldrb r3, [r1]\n\
+ lsls r1, r3, 5\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x11]\n\
+ cmp r0, 0x4\n\
+ beq _080BBD3A\n\
+ adds r0, r2, r7\n\
+ ldrb r2, [r0]\n\
+ lsrs r0, r2, 4\n\
+ adds r0, 0x7\n\
+ movs r1, 0xF\n\
+ ands r1, r2\n\
+ adds r1, 0x7\n\
+ adds r2, r3, 0\n\
+ bl sub_80FF394\n\
+_080BBD3A:\n\
+ ldrh r0, [r4]\n\
+ adds r0, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ strh r0, [r4]\n\
+ cmp r0, 0xF\n\
+ bls _080BBCFC\n\
+ cmp r5, 0\n\
+ beq _080BBD88\n\
+ mov r4, sp\n\
+ adds r4, 0x2\n\
+ movs r2, 0x88\n\
+ lsls r2, 2\n\
+ mov r0, sp\n\
+ adds r1, r4, 0\n\
+ bl sub_80BB764\n\
+ mov r0, sp\n\
+ ldrh r0, [r0]\n\
+ adds r0, 0x7\n\
+ ldrh r1, [r4]\n\
+ adds r1, 0x7\n\
+ ldr r2, _080BBD84 @ =0x00000e21\n\
+ bl MapGridSetMetatileIdAt\n\
+ b _080BBDBC\n\
+ .align 2, 0\n\
+_080BBD70: .4byte 0x00004054\n\
+_080BBD74: .4byte gSaveBlock1\n\
+_080BBD78: .4byte 0x00001a2a\n\
+_080BBD7C: .4byte 0x00001a1a\n\
+_080BBD80: .4byte gDecorations\n\
+_080BBD84: .4byte 0x00000e21\n\
+_080BBD88:\n\
+ mov r0, r8\n\
+ cmp r0, 0x1\n\
+ bne _080BBDBC\n\
+ ldr r0, _080BBDC8 @ =0x00004089\n\
+ bl VarGet\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x1\n\
+ bne _080BBDBC\n\
+ mov r4, sp\n\
+ adds r4, 0x2\n\
+ movs r2, 0x88\n\
+ lsls r2, 2\n\
+ mov r0, sp\n\
+ adds r1, r4, 0\n\
+ bl sub_80BB764\n\
+ mov r0, sp\n\
+ ldrh r0, [r0]\n\
+ adds r0, 0x7\n\
+ ldrh r1, [r4]\n\
+ adds r1, 0x7\n\
+ ldr r2, _080BBDCC @ =0x00000e0a\n\
+ bl MapGridSetMetatileIdAt\n\
+_080BBDBC:\n\
+ add sp, 0x4\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080BBDC8: .4byte 0x00004089\n\
+_080BBDCC: .4byte 0x00000e0a\n\
+.syntax divided\n");
+}
+
+__attribute__((naked))
+void sub_80BBDD0(void)
+{
+ 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\
+ sub sp, 0x14\n\
+ ldr r0, _080BBE00 @ =0x00004054\n\
+ bl VarGet\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ bl CurrentMapIsSecretBase\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080BBE08\n\
+ ldr r0, _080BBE04 @ =gSaveBlock1 + 0x2688\n\
+ str r0, [sp, 0x4]\n\
+ adds r0, 0xC\n\
+ str r0, [sp, 0x8]\n\
+ movs r1, 0xC\n\
+ str r1, [sp, 0xC]\n\
+ b _080BBE1E\n\
+ .align 2, 0\n\
+_080BBE00: .4byte 0x00004054\n\
+_080BBE04: .4byte gSaveBlock1 + 0x2688\n\
+_080BBE08:\n\
+ lsls r1, r4, 2\n\
+ adds r1, r4\n\
+ lsls r1, 5\n\
+ ldr r0, _080BBF7C @ =gSaveBlock1 + 0x1A1A\n\
+ adds r2, r1, r0\n\
+ str r2, [sp, 0x4]\n\
+ adds r0, 0x10\n\
+ adds r1, r0\n\
+ str r1, [sp, 0x8]\n\
+ movs r3, 0x10\n\
+ str r3, [sp, 0xC]\n\
+_080BBE1E:\n\
+ movs r6, 0\n\
+ ldr r4, [sp, 0xC]\n\
+ cmp r6, r4\n\
+ bcc _080BBE28\n\
+ b _080BBF6C\n\
+_080BBE28:\n\
+ ldr r5, _080BBF80 @ =gSaveBlock1\n\
+ mov r10, r5\n\
+_080BBE2C:\n\
+ ldr r1, [sp, 0x4]\n\
+ adds r0, r1, r6\n\
+ ldrb r1, [r0]\n\
+ mov r9, r0\n\
+ adds r2, r6, 0x1\n\
+ str r2, [sp, 0x10]\n\
+ cmp r1, 0\n\
+ bne _080BBE3E\n\
+ b _080BBF5E\n\
+_080BBE3E:\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 5\n\
+ ldr r3, _080BBF84 @ =gDecorations\n\
+ adds r0, r3\n\
+ ldrb r0, [r0, 0x11]\n\
+ cmp r0, 0x4\n\
+ beq _080BBE4E\n\
+ b _080BBF5E\n\
+_080BBE4E:\n\
+ movs r5, 0\n\
+ ldr r0, _080BBF88 @ =gMapHeader\n\
+ ldr r2, [r0, 0x4]\n\
+ ldrb r3, [r2]\n\
+ mov r8, r0\n\
+ cmp r5, r3\n\
+ bcs _080BBE8E\n\
+ ldr r0, [r2, 0x4]\n\
+ ldrh r1, [r0, 0x14]\n\
+ ldr r4, _080BBF8C @ =gSpecialVar_0x8004\n\
+ ldrh r0, [r4]\n\
+ adds r0, 0xAE\n\
+ adds r7, r4, 0\n\
+ cmp r1, r0\n\
+ beq _080BBE8E\n\
+ adds r4, r2, 0\n\
+ adds r2, r3, 0\n\
+_080BBE70:\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ cmp r5, r2\n\
+ bcs _080BBE8E\n\
+ ldr r1, [r4, 0x4]\n\
+ lsls r0, r5, 1\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldrh r1, [r0, 0x14]\n\
+ ldrh r0, [r7]\n\
+ adds r0, 0xAE\n\
+ cmp r1, r0\n\
+ bne _080BBE70\n\
+_080BBE8E:\n\
+ mov r1, r8\n\
+ ldr r0, [r1, 0x4]\n\
+ ldrb r0, [r0]\n\
+ cmp r5, r0\n\
+ beq _080BBF5E\n\
+ ldr r7, _080BBF90 @ =gSpecialVar_0x8006\n\
+ ldr r2, [sp, 0x8]\n\
+ adds r1, r2, r6\n\
+ ldrb r0, [r1]\n\
+ lsrs r0, 4\n\
+ strh r0, [r7]\n\
+ ldr r6, _080BBF94 @ =gSpecialVar_0x8007\n\
+ ldrb r1, [r1]\n\
+ movs r0, 0xF\n\
+ ands r0, r1\n\
+ strh r0, [r6]\n\
+ ldrh r0, [r7]\n\
+ adds r0, 0x7\n\
+ ldrh r1, [r6]\n\
+ adds r1, 0x7\n\
+ bl MapGridGetMetatileBehaviorAt\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ adds r0, r4, 0\n\
+ bl sub_80572D8\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ beq _080BBEDA\n\
+ adds r0, r4, 0\n\
+ bl sub_80572EC\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _080BBF5E\n\
+_080BBEDA:\n\
+ mov r3, r8\n\
+ ldr r0, [r3, 0x4]\n\
+ ldr r1, [r0, 0x4]\n\
+ lsls r4, r5, 1\n\
+ adds r4, r5\n\
+ lsls r4, 3\n\
+ adds r1, r4, r1\n\
+ ldr r5, _080BBF98 @ =0x00003f20\n\
+ adds r0, r5, 0\n\
+ ldrb r1, [r1, 0x1]\n\
+ adds r0, r1\n\
+ ldr r1, _080BBF9C @ =gScriptResult\n\
+ strh r0, [r1]\n\
+ ldrh r0, [r1]\n\
+ mov r2, r9\n\
+ ldrb r1, [r2]\n\
+ lsls r1, 5\n\
+ ldr r3, _080BBFA0 @ =gDecorations + 0x1C\n\
+ adds r1, r3\n\
+ ldr r1, [r1]\n\
+ ldrh r1, [r1]\n\
+ bl VarSet\n\
+ mov r5, r8\n\
+ ldr r0, [r5, 0x4]\n\
+ ldr r0, [r0, 0x4]\n\
+ adds r4, r0\n\
+ ldrb r0, [r4]\n\
+ ldr r1, _080BBF9C @ =gScriptResult\n\
+ strh r0, [r1]\n\
+ ldr r2, _080BBF8C @ =gSpecialVar_0x8004\n\
+ ldrh r0, [r2]\n\
+ adds r0, 0xAE\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ bl FlagReset\n\
+ ldr r3, _080BBF9C @ =gScriptResult\n\
+ ldrb r0, [r3]\n\
+ mov r4, r10\n\
+ ldrb r1, [r4, 0x5]\n\
+ ldrb r2, [r4, 0x4]\n\
+ bl show_sprite\n\
+ ldr r5, _080BBF9C @ =gScriptResult\n\
+ ldrb r0, [r5]\n\
+ ldrb r1, [r4, 0x5]\n\
+ ldrb r2, [r4, 0x4]\n\
+ movs r4, 0\n\
+ ldrsh r3, [r7, r4]\n\
+ movs r5, 0\n\
+ ldrsh r4, [r6, r5]\n\
+ str r4, [sp]\n\
+ bl sub_805C0F8\n\
+ ldr r1, _080BBF9C @ =gScriptResult\n\
+ ldrb r0, [r1]\n\
+ mov r2, r10\n\
+ ldrb r1, [r2, 0x5]\n\
+ ldrb r2, [r2, 0x4]\n\
+ bl sub_805C78C\n\
+ ldr r3, _080BBF8C @ =gSpecialVar_0x8004\n\
+ ldrh r0, [r3]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3]\n\
+_080BBF5E:\n\
+ ldr r4, [sp, 0x10]\n\
+ lsls r0, r4, 24\n\
+ lsrs r6, r0, 24\n\
+ ldr r5, [sp, 0xC]\n\
+ cmp r6, r5\n\
+ bcs _080BBF6C\n\
+ b _080BBE2C\n\
+_080BBF6C:\n\
+ add sp, 0x14\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\
+ .align 2, 0\n\
+_080BBF7C: .4byte gSaveBlock1 + 0x1A1A\n\
+_080BBF80: .4byte gSaveBlock1\n\
+_080BBF84: .4byte gDecorations\n\
+_080BBF88: .4byte gMapHeader\n\
+_080BBF8C: .4byte gSpecialVar_0x8004\n\
+_080BBF90: .4byte gSpecialVar_0x8006\n\
+_080BBF94: .4byte gSpecialVar_0x8007\n\
+_080BBF98: .4byte 0x00003f20\n\
+_080BBF9C: .4byte gScriptResult\n\
+_080BBFA0: .4byte gDecorations + 0x1C\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80BBFA4(void)
+{
+ int curBase = VarGet(VAR_0x4054);
+ VarSet(VAR_0x401F, gUnknown_083D13EC[sub_80BCCA4(curBase)]);
+}
+
+void sub_80BBFD8(s16 *position, struct MapEvents *events)
+{
+ s16 bgevtidx;
+ for (bgevtidx=0; bgevtidx<events->bgEventCount; bgevtidx++) {
+ if (events->bgEvents[bgevtidx].kind == 8 && position[0] == events->bgEvents[bgevtidx].x + 7 && position[1] == events->bgEvents[bgevtidx].y + 7) {
+ gUnknown_020387DC = events->bgEvents[bgevtidx].bgUnion.secretBaseId;
+ break;
+ }
+ }
+}
+
+void sub_80BC038(s16 *position, struct MapEvents *events)
+{
+ sub_80BBFD8(position, events);
+ sub_80BB5E4();
+ ScriptContext1_SetupScript(gUnknown_081A2E14);
+}
+
+bool8 sub_80BC050(void)
+{
+ sub_80BB5D0();
+ sub_80BB5E4();
+ if (gScriptResult == 1)
+ return FALSE;
+ return TRUE;
+}
+
+void sub_80BC074(u8 taskid)
+{
+ switch (gTasks[taskid].data[0]) {
+ case 0:
+ ScriptContext2_Enable();
+ gTasks[taskid].data[0] = 1;
+ break;
+ case 1:
+ if (!gPaletteFade.active) {
+ gTasks[taskid].data[0] = 2;
+ }
+ break;
+ case 2:
+ copy_saved_warp2_bank_and_enter_x_to_warp1(0x7E);
+ warp_in();
+ gUnknown_0300485C = mapldr_default;
+ SetMainCallback2(CB2_LoadMap);
+ ScriptContext2_Disable();
+ DestroyTask(taskid);
+ break;
+ }
+}
+
+void sub_80BC0F8(void) {
+ CreateTask(sub_80BC074, 0);
+ fade_screen(1, 0);
+}
+
+void sub_80BC114(void) {
+ if (gSaveBlock1.secretBases[0].sbr_field_0 != gUnknown_020387DC)
+ gScriptResult = 1;
+ else
+ gScriptResult = 0;
+}
+
+u8 sub_80BC14C(u8 sbid)
+{
+ s16 idx;
+ for (idx=0; idx<20; idx++) {
+ if (gSaveBlock1.secretBases[idx].sbr_field_0 == sbid)
+ return idx;
+ }
+ return 0;
+}
+
+
+
+u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190
u8 local1;
u8 *str;
@@ -16,3 +837,234 @@ u8 *sub_80BC190(u8 *dest, u8 arg1) {
return StringAppend(dest, gOtherText_PlayersBase);
}
+
+u8 *GetSecretBaseMapName(u8 *dest) {
+ gUnknown_020387DC = gSaveBlock1.secretBases[VarGet(VAR_0x4054)].sbr_field_0;
+ return sub_80BC190(dest, VarGet(VAR_0x4054));
+}
+
+void sub_80BC224(void) {
+ u8 *var0 = gSaveBlock1.secretBases[(u8)VarGet(VAR_0x4054)].sbr_field_2;
+ u8 *var1 = gStringVar1;
+ u8 var2 = sub_80BB8A8(var0);
+ u8 *var3 = StringCopyN(var1, var0, var2);
+ *var3 = EOS;
+}
+
+u8 sub_80BC268(u8 foo) { // 80bc268
+ if (gSaveBlock1.secretBases[foo].sbr_field_1_6)
+ return 1;
+ return 0;
+}
+
+u8 sub_80BC298(struct Pokemon *mon) { // 80bc298
+ u16 evsum = GetMonData(mon, MON_DATA_HP_EV);
+ evsum += GetMonData(mon, MON_DATA_ATK_EV);
+ evsum += GetMonData(mon, MON_DATA_DEF_EV);
+ evsum += GetMonData(mon, MON_DATA_SPD_EV);
+ evsum += GetMonData(mon, MON_DATA_SPATK_EV);
+ evsum += GetMonData(mon, MON_DATA_SPDEF_EV);
+ return (u8)(evsum / 6);
+}
+
+#ifdef NONMATCHING
+void sub_80BC300(void)
+{
+ u16 moveidx;
+ u16 sbpartyidx = 0;
+ int resetVal = 0;
+ u16 partyidx = 0;
+ while (partyidx < 6) {
+ partyidx ++;
+ for (moveidx=0; moveidx<4; moveidx++) {
+ gSaveBlock1.secretBases[0].partyMoves[(partyidx - 1) * 6 + moveidx] = resetVal;
+ }
+ gSaveBlock1.secretBases[0].partySpecies[partyidx - 1] = resetVal;
+ gSaveBlock1.secretBases[0].partyHeldItems[partyidx - 1] = resetVal;
+ gSaveBlock1.secretBases[0].partyLevels[partyidx - 1] = resetVal;
+ gSaveBlock1.secretBases[0].partyPersonality[partyidx - 1] = resetVal;
+ gSaveBlock1.secretBases[0].partyEVs[partyidx - 1] = resetVal;
+ if (GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES) != 0 && !GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_IS_EGG)) {
+ sbpartyidx ++;
+ for (moveidx=0; moveidx<4; moveidx++) {
+ gSaveBlock1.secretBases[0].partyMoves[(sbpartyidx - 1) * 6 + moveidx] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_MOVE1 + moveidx);
+ }
+ gSaveBlock1.secretBases[0].partySpecies[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_SPECIES);
+ gSaveBlock1.secretBases[0].partyHeldItems[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_HELD_ITEM);
+ gSaveBlock1.secretBases[0].partyLevels[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_LEVEL);
+ gSaveBlock1.secretBases[0].partyPersonality[sbpartyidx - 1] = GetMonData(&(gPlayerParty[partyidx - 1]), MON_DATA_PERSONALITY);
+ gSaveBlock1.secretBases[0].partyEVs[sbpartyidx - 1] = sub_80BC298(&(gPlayerParty[partyidx - 1]));
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80BC300(void)
+{
+ 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\
+ sub sp, 0xC\n\
+ movs r0, 0\n\
+ mov r10, r0\n\
+ movs r6, 0\n\
+ mov r9, r6\n\
+_080BC314:\n\
+ movs r4, 0\n\
+ lsls r3, r6, 2\n\
+ lsls r2, r6, 1\n\
+ ldr r7, _080BC424 @ =gPlayerParty\n\
+ adds r1, r6, 0x1\n\
+ str r1, [sp]\n\
+ adds r1, r3, 0\n\
+_080BC322:\n\
+ adds r0, r1, r4\n\
+ lsls r0, 1\n\
+ ldr r5, _080BC428 @ =gSaveBlock1 + 0x1A54\n\
+ adds r0, r5, r0\n\
+ mov r5, r9\n\
+ strh r5, [r0]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ cmp r4, 0x3\n\
+ bls _080BC322\n\
+ ldr r1, _080BC42C @ =gSaveBlock1 + 0x1A84\n\
+ adds r0, r1, r2\n\
+ strh r5, [r0]\n\
+ ldr r5, _080BC430 @ =gSaveBlock1 + 0x1A90\n\
+ adds r0, r5, r2\n\
+ mov r1, r9\n\
+ strh r1, [r0]\n\
+ ldr r2, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\
+ adds r0, r2, r6\n\
+ mov r5, r9\n\
+ strb r5, [r0]\n\
+ ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\
+ adds r0, r1, r3\n\
+ mov r2, r9\n\
+ str r2, [r0]\n\
+ ldr r3, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\
+ adds r0, r3, r6\n\
+ strb r2, [r0]\n\
+ movs r0, 0x64\n\
+ adds r5, r6, 0\n\
+ muls r5, r0\n\
+ adds r4, r5, r7\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xB\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ beq _080BC408\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x2D\n\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ bne _080BC408\n\
+ movs r4, 0\n\
+ mov r0, r10\n\
+ lsls r0, 2\n\
+ mov r8, r0\n\
+ mov r1, r10\n\
+ lsls r7, r1, 1\n\
+ adds r1, 0x1\n\
+ str r1, [sp, 0x4]\n\
+ ldr r2, _080BC424 @ =gPlayerParty\n\
+_080BC38E:\n\
+ adds r1, r4, 0\n\
+ adds r1, 0xD\n\
+ adds r0, r5, r2\n\
+ str r2, [sp, 0x8]\n\
+ bl GetMonData\n\
+ mov r3, r8\n\
+ adds r1, r3, r4\n\
+ lsls r1, 1\n\
+ ldr r3, _080BC428 @ =gSaveBlock1 + 0x1A54\n\
+ adds r1, r3, r1\n\
+ strh r0, [r1]\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ ldr r2, [sp, 0x8]\n\
+ cmp r4, 0x3\n\
+ bls _080BC38E\n\
+ movs r0, 0x64\n\
+ adds r4, r6, 0\n\
+ muls r4, r0\n\
+ ldr r0, _080BC424 @ =gPlayerParty\n\
+ adds r4, r0\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xB\n\
+ bl GetMonData\n\
+ ldr r5, _080BC42C @ =gSaveBlock1 + 0x1A84\n\
+ adds r1, r5, r7\n\
+ strh r0, [r1]\n\
+ adds r0, r4, 0\n\
+ movs r1, 0xC\n\
+ bl GetMonData\n\
+ ldr r2, _080BC430 @ =gSaveBlock1 + 0x1A90\n\
+ adds r1, r2, r7\n\
+ strh r0, [r1]\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x38\n\
+ bl GetMonData\n\
+ ldr r1, _080BC434 @ =gSaveBlock1 + 0x1A9C\n\
+ add r1, r10\n\
+ strb r0, [r1]\n\
+ adds r0, r4, 0\n\
+ movs r1, 0\n\
+ bl GetMonData\n\
+ ldr r1, _080BC438 @ =gSaveBlock1 + 0x1A3C\n\
+ add r1, r8\n\
+ str r0, [r1]\n\
+ adds r0, r4, 0\n\
+ bl sub_80BC298\n\
+ ldr r1, _080BC43C @ =gSaveBlock1 + 0x1AA2\n\
+ add r1, r10\n\
+ strb r0, [r1]\n\
+ ldr r3, [sp, 0x4]\n\
+ lsls r0, r3, 16\n\
+ lsrs r0, 16\n\
+ mov r10, r0\n\
+_080BC408:\n\
+ ldr r5, [sp]\n\
+ lsls r0, r5, 16\n\
+ lsrs r6, r0, 16\n\
+ cmp r6, 0x5\n\
+ bls _080BC314\n\
+ add sp, 0xC\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\
+ .align 2, 0\n\
+_080BC424: .4byte gPlayerParty\n\
+_080BC428: .4byte gSaveBlock1 + 0x1A54\n\
+_080BC42C: .4byte gSaveBlock1 + 0x1A84\n\
+_080BC430: .4byte gSaveBlock1 + 0x1A90\n\
+_080BC434: .4byte gSaveBlock1 + 0x1A9C\n\
+_080BC438: .4byte gSaveBlock1 + 0x1A3C\n\
+_080BC43C: .4byte gSaveBlock1 + 0x1AA2\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80BC440(void)
+{
+ u16 backupValue = gSaveBlock1.secretBases[0].sbr_field_e;
+ ResetSecretBase(0);
+ gSaveBlock1.secretBases[0].sbr_field_e = backupValue;
+ sub_80BC0F8();
+}
+
+void SecretBasePC_PackUp(void)
+{
+ IncrementGameStat(20);
+ sub_80BC440();
+}
diff --git a/src/shop.c b/src/shop.c
index cca920df5..cd39b075a 100644
--- a/src/shop.c
+++ b/src/shop.c
@@ -9,6 +9,7 @@
#include "script.h"
#include "sound.h"
#include "sprite.h"
+#include "strings.h"
#include "task.h"
struct UnknownShopStruct
@@ -28,8 +29,6 @@ extern struct MenuAction gUnknown_083CC6D0[];
extern u8 gUnknown_083CC6E8[];
extern u8 gUnknown_083CC6EB[];
-extern u8 gOtherText_CanIHelpYou[];
-extern u8 gOtherText_AnythingElse[];
extern u8 gBuyMenuFrame_Gfx[];
extern u16 gBuyMenuFrame_Tilemap[];
@@ -38,7 +37,7 @@ extern u16 gUnknown_083CC710[2];
extern void sub_80A6300(void);
extern void sub_80BE3BC(void);
-extern void DisplayItemMessageOnField(u8, u8*, TaskFunc, u16);
+extern void DisplayItemMessageOnField(u8, const u8*, TaskFunc, u16);
extern u8 sub_807D770(void);
extern void pal_fill_black(void);
extern void sub_80B3764(int, int);
@@ -342,17 +341,17 @@ void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s8 var4)
switch(tempVar4)
{
- case 0: // _080B335C
- BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3);
- BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4);
- break;
- case 1: // _080B3364
- BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3);
- BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4);
- break;
- case 2: // _080B3398
- BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3);
- BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4);
- break;
+ case 0: // _080B335C
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3);
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4);
+ break;
+ case 1: // _080B3364
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3);
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4);
+ break;
+ case 2: // _080B3398
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[3], offset1, offset2, var3);
+ BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[1], offset1, offset2, var3 + 4);
+ break;
}
}
diff --git a/src/smokescreen.c b/src/smokescreen.c
index 1d3a14a5b..0406c1cb3 100644
--- a/src/smokescreen.c
+++ b/src/smokescreen.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "data2.h"
#include "decompress.h"
#include "sprite.h"
@@ -6,9 +7,6 @@ extern u8 CreateInvisibleSpriteWithCallback(void (*)(struct Sprite *));
static void sub_8046388(struct Sprite *);
-extern struct SpriteSheet gUnknown_081FAEA4;
-extern struct SpritePalette gUnknown_081FAEAC;
-extern const struct SpriteTemplate gSpriteTemplate_81FAF0C;
u8 sub_8046234(s16 x, s16 y, u8 a3)
{
diff --git a/src/start_menu.c b/src/start_menu.c
index be489bd1f..80080cd43 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -21,6 +21,8 @@
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings.h"
+#include "strings2.h"
#include "task.h"
#include "trainer_card.h"
@@ -54,24 +56,11 @@ EWRAM_DATA static u8 sNumStartMenuActions = 0;
EWRAM_DATA static u8 sCurrentStartMenuActions[10] = {0};
//Text strings
-extern u8 gSystemText_Saving[];
extern u8 gSaveText_PlayerSavedTheGame[];
extern u8 gSaveText_DontTurnOff[];
-extern u8 gSystemText_SaveErrorExchangeBackup[];
extern u8 gSaveText_ThereIsAlreadyAFile[];
extern u8 gSaveText_ThereIsADifferentFile[];
extern u8 gSaveText_WouldYouLikeToSave[];
-extern u8 gOtherText_SafariStock[];
-extern u8 SystemText_Pokedex[];
-extern u8 SystemText_Pokemon[];
-extern u8 SystemText_BAG[];
-extern u8 SystemText_Pokenav[];
-extern u8 SystemText_Player[];
-extern u8 SystemText_Save[];
-extern u8 SystemText_Option[];
-extern u8 SystemText_Exit[];
-extern u8 SystemText_Retire[];
-extern u8 SystemText_Player[];
static u8 StartMenu_PokedexCallback(void);
static u8 StartMenu_PokemonCallback(void);
@@ -113,7 +102,7 @@ static u8 SaveCallback1(void);
static u8 SaveCallback2(void);
static void sub_807160C(void);
static u8 RunSaveDialogCallback(void);
-static void DisplaySaveMessageWithCallback(u8 *ptr, u8 (*func)(void));
+static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void));
static void Task_SaveDialog(u8 taskId);
static void sub_8071700(void);
static void HideSaveDialog(void);
@@ -227,30 +216,30 @@ static bool32 InitStartMenuMultistep(s16 *step, s16 *index)
{
switch (*step)
{
- case 1:
- BuildStartMenuActions();
+ case 1:
+ BuildStartMenuActions();
+ (*step)++;
+ break;
+ case 2:
+ MenuDrawTextWindow(22, 0, 29, sNumStartMenuActions * 2 + 3);
+ *index = 0;
+ (*step)++;
+ break;
+ case 3:
+ if (GetSafariZoneFlag())
+ DisplaySafariBallsWindow();
+ (*step)++;
+ break;
+ case 4:
+ if (PrintStartMenuItemsMultistep(index, 2))
(*step)++;
- break;
- case 2:
- MenuDrawTextWindow(22, 0, 29, sNumStartMenuActions * 2 + 3);
- *index = 0;
- (*step)++;
- break;
- case 3:
- if (GetSafariZoneFlag())
- DisplaySafariBallsWindow();
- (*step)++;
- break;
- case 4:
- if (PrintStartMenuItemsMultistep(index, 2))
- (*step)++;
- break;
- case 0:
- (*step)++;
- break;
- case 5:
- sStartMenuCursorPos = InitMenu(0, 0x17, 2, sNumStartMenuActions, sStartMenuCursorPos, 6);
- return TRUE;
+ break;
+ case 0:
+ (*step)++;
+ break;
+ case 5:
+ sStartMenuCursorPos = InitMenu(0, 0x17, 2, sNumStartMenuActions, sStartMenuCursorPos, 6);
+ return TRUE;
}
return FALSE;
}
@@ -288,14 +277,14 @@ void sub_80712B4(u8 taskId)
switch (task->data[0])
{
- case 0:
- gCallback_03004AE8 = StartMenu_InputProcessCallback;
- task->data[0]++;
- break;
- case 1:
- if (gCallback_03004AE8() == 1)
- DestroyTask(taskId);
- break;
+ case 0:
+ gCallback_03004AE8 = StartMenu_InputProcessCallback;
+ task->data[0]++;
+ break;
+ case 1:
+ if (gCallback_03004AE8() == 1)
+ DestroyTask(taskId);
+ break;
}
}
@@ -475,20 +464,20 @@ static u8 SaveCallback2(void)
{
switch (RunSaveDialogCallback())
{
- case SAVE_IN_PROGRESS:
- return FALSE;
- case SAVE_CANCELED:
- //Go back to start menu
- MenuZeroFillScreen();
- InitStartMenu();
- gCallback_03004AE8 = StartMenu_InputProcessCallback;
- return FALSE;
- case SAVE_SUCCESS:
- case SAVE_ERROR:
- MenuZeroFillScreen();
- sub_8064E2C();
- ScriptContext2_Disable();
- return TRUE;
+ case SAVE_IN_PROGRESS:
+ return FALSE;
+ case SAVE_CANCELED:
+ //Go back to start menu
+ MenuZeroFillScreen();
+ InitStartMenu();
+ gCallback_03004AE8 = StartMenu_InputProcessCallback;
+ return FALSE;
+ case SAVE_SUCCESS:
+ case SAVE_ERROR:
+ MenuZeroFillScreen();
+ sub_8064E2C();
+ ScriptContext2_Disable();
+ return TRUE;
}
return FALSE;
}
@@ -517,7 +506,7 @@ void InitSaveDialog(void)
CreateTask(Task_SaveDialog, 0x50);
}
-static void DisplaySaveMessageWithCallback(u8 *ptr, u8 (*func)(void))
+static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void))
{
StringExpandPlaceholders(gStringVar4, ptr);
MenuDisplayMessageBox();
@@ -532,15 +521,15 @@ static void Task_SaveDialog(u8 taskId)
switch (status)
{
- case SAVE_CANCELED:
- case SAVE_ERROR:
- gScriptResult = 0;
- break;
- case SAVE_SUCCESS:
- gScriptResult = status;
- break;
- case SAVE_IN_PROGRESS:
- return;
+ case SAVE_CANCELED:
+ case SAVE_ERROR:
+ gScriptResult = 0;
+ break;
+ case SAVE_SUCCESS:
+ gScriptResult = status;
+ break;
+ case SAVE_IN_PROGRESS:
+ return;
}
DestroyTask(taskId);
EnableBothScriptContexts();
@@ -602,29 +591,29 @@ static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void)
{
switch (ProcessMenuInputNoWrap_())
{
- case 0: //YES
- HideSaveDialog();
- switch (gSaveFileStatus)
+ case 0: //YES
+ HideSaveDialog();
+ switch (gSaveFileStatus)
+ {
+ case 0:
+ case 2:
+ if (gDifferentSaveFile == FALSE)
{
- case 0:
- case 2:
- if (gDifferentSaveFile == FALSE)
- {
- saveDialogCallback = SaveDialogCB_SaveFileExists;
- return SAVE_IN_PROGRESS;
- }
- saveDialogCallback = SaveDialogCB_DisplaySavingMessage;
- return SAVE_IN_PROGRESS;
- default:
- saveDialogCallback = SaveDialogCB_SaveFileExists;
- return SAVE_IN_PROGRESS;
+ saveDialogCallback = SaveDialogCB_SaveFileExists;
+ return SAVE_IN_PROGRESS;
}
- break;
- case -1: //B button
- case 1: //NO
- HideSaveDialog();
- sub_8071700();
- return SAVE_CANCELED;
+ saveDialogCallback = SaveDialogCB_DisplaySavingMessage;
+ return SAVE_IN_PROGRESS;
+ default:
+ saveDialogCallback = SaveDialogCB_SaveFileExists;
+ return SAVE_IN_PROGRESS;
+ }
+ break;
+ case -1: //B button
+ case 1: //NO
+ HideSaveDialog();
+ sub_8071700();
+ return SAVE_CANCELED;
}
return SAVE_IN_PROGRESS;
}
@@ -648,15 +637,15 @@ static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void)
{
switch (ProcessMenuInputNoWrap_())
{
- case 0: //YES
- HideSaveDialog();
- saveDialogCallback = SaveDialogCB_DisplaySavingMessage;
- break;
- case -1: //B button
- case 1: //NO
- HideSaveDialog();
- sub_8071700();
- return SAVE_CANCELED;
+ case 0: //YES
+ HideSaveDialog();
+ saveDialogCallback = SaveDialogCB_DisplaySavingMessage;
+ break;
+ case -1: //B button
+ case 1: //NO
+ HideSaveDialog();
+ sub_8071700();
+ return SAVE_CANCELED;
}
return SAVE_IN_PROGRESS;
}
@@ -749,55 +738,55 @@ static bool32 sub_80719FC(u8 *step)
{
switch (*step)
{
- case 0:
+ case 0:
+ {
+ u8 *addr;
+ u32 size;
+
+ REG_DISPCNT = 0;
+ SetVBlankCallback(NULL);
+ remove_some_task();
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ addr = (void *)VRAM;
+ size = 0x18000;
+ while (1)
{
- u8 *addr;
- u32 size;
-
- REG_DISPCNT = 0;
- SetVBlankCallback(NULL);
- remove_some_task();
- DmaClear16(3, PLTT, PLTT_SIZE);
- addr = (void *)VRAM;
- size = 0x18000;
- while (1)
+ DmaFill16(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
{
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
+ DmaFill16(3, 0, addr, size);
+ break;
}
- break;
}
- case 1:
- ResetSpriteData();
- ResetTasks();
- ResetPaletteFade();
- dp12_8087EA4();
- break;
- case 2:
- SetUpWindowConfig(&gWindowConfig_81E6CE4);
- InitMenuWindow(&gWindowConfig_81E6CE4);
- REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON;
- break;
- case 3:
- {
- u32 savedIme;
-
- BlendPalettes(-1, 0x10, 0);
- SetVBlankCallback(sub_80719F0);
- savedIme = REG_IME;
- REG_IME = 0;
- REG_IE |= 1;
- REG_IME = savedIme;
- break;
- }
- case 4:
- return TRUE;
+ break;
+ }
+ case 1:
+ ResetSpriteData();
+ ResetTasks();
+ ResetPaletteFade();
+ dp12_8087EA4();
+ break;
+ case 2:
+ SetUpWindowConfig(&gWindowConfig_81E6CE4);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON;
+ break;
+ case 3:
+ {
+ u32 savedIme;
+
+ BlendPalettes(-1, 0x10, 0);
+ SetVBlankCallback(sub_80719F0);
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= 1;
+ REG_IME = savedIme;
+ break;
+ }
+ case 4:
+ return TRUE;
}
(*step)++;
return FALSE;
@@ -826,31 +815,31 @@ static void Task_8071B64(u8 taskId)
{
switch (*step)
{
- case 0:
- MenuDisplayMessageBox();
- MenuPrint(gSystemText_Saving, 2, 15);
- BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
- (*step)++;
- break;
- case 1:
- SetSecretBase2Field_9_AndHideBG();
- sub_8125E2C();
- (*step)++;
- break;
- case 2:
- if (!sub_8125E6C())
- break;
- ClearSecretBase2Field_9_2();
- (*step)++;
- break;
- case 3:
- BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
- (*step)++;
- break;
- case 4:
- SetMainCallback2(gMain.savedCallback);
- DestroyTask(taskId);
+ case 0:
+ MenuDisplayMessageBox();
+ MenuPrint(gSystemText_Saving, 2, 15);
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ (*step)++;
+ break;
+ case 1:
+ SetSecretBase2Field_9_AndHideBG();
+ sub_8125E2C();
+ (*step)++;
+ break;
+ case 2:
+ if (!sub_8125E6C())
break;
+ ClearSecretBase2Field_9_2();
+ (*step)++;
+ break;
+ case 3:
+ BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
+ (*step)++;
+ break;
+ case 4:
+ SetMainCallback2(gMain.savedCallback);
+ DestroyTask(taskId);
+ break;
}
}
}
diff --git a/src/starter_choose.c b/src/starter_choose.c
index 6ef410d21..32b6adf36 100644
--- a/src/starter_choose.c
+++ b/src/starter_choose.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "starter_choose.h"
#include "asm.h"
+#include "data2.h"
#include "decompress.h"
#include "main.h"
#include "menu.h"
@@ -11,23 +12,11 @@
#include "species.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings.h"
#include "task.h"
#include "trig.h"
-struct MonCoords
-{
- u8 x, y;
-};
-
-extern void * const gUnknown_081FAF4C[];
-extern const u8 gOtherText_DoYouChoosePoke[];
extern u16 gScriptResult;
-extern const u8 gSpeciesNames[][11];
-extern const u8 gOtherText_Poke[];
-extern const struct SpriteSheet gMonFrontPicTable[];
-extern const struct MonCoords gMonFrontPicCoords[];
-extern const struct SpritePalette gMonPaletteTable[];
-extern const u8 gOtherText_BirchInTrouble[];
extern struct SpriteTemplate gUnknown_02024E8C;
//--------------------------------------------------
@@ -448,26 +437,26 @@ static void Task_StarterChoose5(u8 taskId)
switch (ProcessMenuInputNoWrap_())
{
- case 0: // YES
- //Return the starter choice and exit.
- gScriptResult = gTasks[taskId].tStarterSelection;
- SetMainCallback2(gMain.savedCallback);
- break;
- case 1: // NO
- case -1: // B button
- PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(21, 7, 27, 12);
-
- spriteId = gTasks[taskId].tPkmnSpriteId;
- FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum));
- FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
- DestroySprite(&gSprites[spriteId]);
-
- spriteId = gTasks[taskId].tCircleSpriteId;
- FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
- DestroySprite(&gSprites[spriteId]);
- gTasks[taskId].func = Task_StarterChoose6;
- break;
+ case 0: // YES
+ //Return the starter choice and exit.
+ gScriptResult = gTasks[taskId].tStarterSelection;
+ SetMainCallback2(gMain.savedCallback);
+ break;
+ case 1: // NO
+ case -1: // B button
+ PlaySE(SE_SELECT);
+ MenuZeroFillWindowRect(21, 7, 27, 12);
+
+ spriteId = gTasks[taskId].tPkmnSpriteId;
+ FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum));
+ FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
+ DestroySprite(&gSprites[spriteId]);
+
+ spriteId = gTasks[taskId].tCircleSpriteId;
+ FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
+ DestroySprite(&gSprites[spriteId]);
+ gTasks[taskId].func = Task_StarterChoose6;
+ break;
}
}
@@ -567,7 +556,7 @@ static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
DecompressPicFromTable_2(
&gMonFrontPicTable[species],
- gMonFrontPicCoords[species].x, gMonFrontPicCoords[species].y,
+ gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset,
gUnknown_081FAF4C[0], gUnknown_081FAF4C[1],
species);
LoadCompressedObjectPalette(&gMonPaletteTable[species]);
diff --git a/src/string_util.c b/src/string_util.c
index 957d70153..9686256a1 100644
--- a/src/string_util.c
+++ b/src/string_util.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "string_util.h"
+#include "strings.h"
#include "text.h"
u8 gUnknownStringVar[16];
@@ -23,20 +24,6 @@ static const s32 sPowersOfTen[] =
1000000000,
};
-extern u8 gExpandedPlaceholder_Empty[];
-extern u8 gExpandedPlaceholder_Kun[];
-extern u8 gExpandedPlaceholder_Chan[];
-extern u8 gExpandedPlaceholder_Sapphire[];
-extern u8 gExpandedPlaceholder_Ruby[];
-extern u8 gExpandedPlaceholder_Aqua[];
-extern u8 gExpandedPlaceholder_Magma[];
-extern u8 gExpandedPlaceholder_Archie[];
-extern u8 gExpandedPlaceholder_Maxie[];
-extern u8 gExpandedPlaceholder_Kyogre[];
-extern u8 gExpandedPlaceholder_Groudon[];
-extern u8 gExpandedPlaceholder_Brendan[];
-extern u8 gExpandedPlaceholder_May[];
-
u8 *StringCopy10(u8 *dest, const u8 *src)
{
u8 i;
@@ -473,17 +460,17 @@ static u8 *ExpandPlaceholder_StringVar3(void)
static u8 *ExpandPlaceholder_KunChan(void)
{
if (gSaveBlock2.playerGender == MALE)
- return gExpandedPlaceholder_Kun;
+ return (u8 *) gExpandedPlaceholder_Kun;
else
- return gExpandedPlaceholder_Chan;
+ return (u8 *) gExpandedPlaceholder_Chan;
}
static u8 *ExpandPlaceholder_RivalName(void)
{
if (gSaveBlock2.playerGender == MALE)
- return gExpandedPlaceholder_May;
+ return (u8 *) gExpandedPlaceholder_May;
else
- return gExpandedPlaceholder_Brendan;
+ return (u8 *) gExpandedPlaceholder_Brendan;
}
#define VERSION_DEPENDENT_PLACEHOLDER_LIST \
@@ -497,11 +484,11 @@ static u8 *ExpandPlaceholder_RivalName(void)
#ifdef SAPPHIRE
#define X(ph, r, s) \
-static u8 *ExpandPlaceholder_##ph(void) { return gExpandedPlaceholder_##s; }
+static u8 *ExpandPlaceholder_##ph(void) { return (u8 *) gExpandedPlaceholder_##s; }
VERSION_DEPENDENT_PLACEHOLDER_LIST
#else
#define X(ph, r, s) \
-static u8 *ExpandPlaceholder_##ph(void) { return gExpandedPlaceholder_##r; }
+static u8 *ExpandPlaceholder_##ph(void) { return (u8 *) gExpandedPlaceholder_##r; }
VERSION_DEPENDENT_PLACEHOLDER_LIST
#endif
@@ -530,7 +517,7 @@ u8 *GetExpandedPlaceholder(u32 id)
};
if (id >= ARRAY_COUNT(funcs))
- return gExpandedPlaceholder_Empty;
+ return (u8 *) gExpandedPlaceholder_Empty;
else
return funcs[id]();
}
diff --git a/src/text.c b/src/text.c
index 7be72833a..02cafea48 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1755,21 +1755,21 @@ u16 InitWindowTileData(struct Window *win, u16 startOffset)
case 1:
switch (win->config->fontNum)
{
- case 0:
- case 3:
- retVal = LoadFixedWidthFont(win, startOffset);
- break;
- case 1:
- case 2:
- retVal = LoadFixedWidthFont_Font1Latin(win, startOffset);
- break;
- case 4:
- case 5:
- retVal = LoadFixedWidthFont_Font4Latin(win, startOffset);
- break;
- case 6:
- retVal = LoadFixedWidthFont_Braille(win, startOffset);
- break;
+ case 0:
+ case 3:
+ retVal = LoadFixedWidthFont(win, startOffset);
+ break;
+ case 1:
+ case 2:
+ retVal = LoadFixedWidthFont_Font1Latin(win, startOffset);
+ break;
+ case 4:
+ case 5:
+ retVal = LoadFixedWidthFont_Font4Latin(win, startOffset);
+ break;
+ case 6:
+ retVal = LoadFixedWidthFont_Braille(win, startOffset);
+ break;
}
break;
}
@@ -1888,30 +1888,30 @@ static void MultistepLoadFont_LoadGlyph(struct Window *win, u16 startOffset, u8
switch (win->config->fontNum)
{
- case 0:
- case 3:
- buffer = win->tileData + 32 * startOffset + 64 * glyph;
- LoadFixedWidthGlyph(win, glyph, buffer);
- break;
- case 1:
- case 2:
- buffer = win->tileData + 32 * (glyph + startOffset);
- ApplyColors_UnshadowedFont(
- &sFont1LatinGlyphs[8 * glyph],
- (u32 *)buffer,
- win->foregroundColor,
- win->backgroundColor);
- break;
- case 4:
- case 5:
- buffer = win->tileData + 32 * (glyph + startOffset);
- ApplyColors_ShadowedFont(
- &gFont4LatinGlyphs[8 * glyph],
- buffer,
- win->foregroundColor,
- win->shadowColor,
- win->backgroundColor);
- break;
+ case 0:
+ case 3:
+ buffer = win->tileData + 32 * startOffset + 64 * glyph;
+ LoadFixedWidthGlyph(win, glyph, buffer);
+ break;
+ case 1:
+ case 2:
+ buffer = win->tileData + 32 * (glyph + startOffset);
+ ApplyColors_UnshadowedFont(
+ &sFont1LatinGlyphs[8 * glyph],
+ (u32 *)buffer,
+ win->foregroundColor,
+ win->backgroundColor);
+ break;
+ case 4:
+ case 5:
+ buffer = win->tileData + 32 * (glyph + startOffset);
+ ApplyColors_ShadowedFont(
+ &gFont4LatinGlyphs[8 * glyph],
+ buffer,
+ win->foregroundColor,
+ win->shadowColor,
+ win->backgroundColor);
+ break;
}
}
diff --git a/src/title_screen.c b/src/title_screen.c
index dd6a858f6..241e5489e 100644
--- a/src/title_screen.c
+++ b/src/title_screen.c
@@ -709,7 +709,7 @@ static void CB2_GoToMainMenu(void)
static void CB2_GoToCopyrightScreen(void)
{
if (!UpdatePaletteFade())
- SetMainCallback2(CB2_InitCopyrightScreen);
+ SetMainCallback2(CB2_InitCopyrightScreenAfterTitleScreen);
}
static void CB2_GoToClearSaveDataScreen(void)
diff --git a/src/trainer_card.c b/src/trainer_card.c
index e6ed79c15..ef3a2d857 100644
--- a/src/trainer_card.c
+++ b/src/trainer_card.c
@@ -14,6 +14,7 @@
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
+#include "strings2.h"
#include "task.h"
typedef void (*Callback)(void);
@@ -64,16 +65,6 @@ extern u16 gUnknown_083B5F4C[];
extern u16 gUnknown_08E8CFC0[];
extern u16 gUnknown_08E8D9C0[];
-extern u8 gOtherText_TrainersTrainerCard[];
-extern u8 gOtherText_FirstHOF[];
-extern u8 gOtherText_LinkCableBattles[];
-extern u8 gOtherText_BattleTowerWinRecord[];
-extern u8 gOtherText_ContestRecord[];
-extern u8 gOtherText_MixingRecord[];
-extern u8 gOtherText_TradeRecord[];
-extern u8 gOtherText_Boy[];
-extern u8 gOtherText_Girl[];
-
extern bool8 (*const gUnknown_083B5EBC[])(struct Task *);
extern bool8 (*const gUnknown_083B5ED8[])(struct Task *);
@@ -1831,7 +1822,7 @@ static void TrainerCard_Back_PrintPokemonTrades(void)
void unref_sub_8094588(u16 left, u16 top)
{
- u8 *text = gOtherText_Boy;
+ const u8 *text = gOtherText_Boy;
if (gSaveBlock2.playerGender == FEMALE)
{
diff --git a/src/trainer_see.c b/src/trainer_see.c
index 9d58faab8..6c2bf0ab0 100644
--- a/src/trainer_see.c
+++ b/src/trainer_see.c
@@ -373,9 +373,9 @@ void sub_80846E4(u8 taskId)
mapObj->mapobj_bit_7 = 0;
}
-void sub_8084794(u32 var)
+void sub_8084794(struct MapObject *var)
{
- StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], var);
+ StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80846E4, 0)].data[1], (u32)var);
}
void sub_80847C8(void)
diff --git a/src/trig.c b/src/trig.c
index 8b75b3838..d64231087 100644
--- a/src/trig.c
+++ b/src/trig.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "trig.h"
-extern s16 gSineTable[];
extern s16 gSineDegreeTable[];
// amplitude * sin(index*(π/128))
diff --git a/src/tv.c b/src/tv.c
index c0d4bde4d..110dfba89 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -1,26 +1,49 @@
#include "global.h"
#include "asm.h"
+#include "tv.h"
+#include "data2.h"
#include "event_data.h"
#include "field_message_box.h"
#include "flags.h"
#include "rng.h"
#include "string_util.h"
#include "text.h"
-
-enum
-{
- TVSHOW_FAN_CLUB_LETTER = 1,
- TVSHOW_RECENT_HAPPENINGS = 2,
- TVSHOW_PKMN_FAN_CLUB_OPINIONS = 3,
- TVSHOW_NAME_RATER_SHOW = 5,
- TVSHOW_MASS_OUTBREAK = 41,
-};
+#include "species.h"
+#include "pokedex.h"
+#include "naming_screen.h"
+#include "rom4.h"
+#include "map_constants.h"
+#include "strings.h"
+#include "link.h"
+#include "easy_chat.h"
+#include "item.h"
+#include "items.h"
+#include "contest_painting.h"
+#include "rtc.h"
struct UnkTvStruct
{
s8 var0;
};
+struct UnkBattleStruct {
+ u16 var00;
+ u8 var02[3];
+ u8 var05_0:1;
+ u8 var05_1:1;
+ u8 var05_pad2:6;
+ u16 var06;
+ u8 pad08[24];
+ u16 var20;
+ u8 pad22[6];
+ u16 var28;
+ u8 var2a[11];
+ u8 var35;
+ u8 var36[11];
+};
+extern struct UnkBattleStruct gUnknown_030042E0;
+extern u8 gUnknown_0300430A[11];
+
struct OutbreakPokemon
{
/*0x00*/ u16 species;
@@ -29,17 +52,488 @@ struct OutbreakPokemon
/*0x0B*/ u8 location;
};
+extern u8 *gUnknown_083D1464[3];
+extern u8 gUnknown_02038694;
+
+struct TVSaleItem {
+ u16 item_id;
+ u16 item_amount;
+};
+extern struct TVSaleItem gUnknown_02038724[3];
+
extern u16 gSpecialVar_0x8004;
+extern u16 gSpecialVar_0x8005;
+extern u16 gSpecialVar_0x8006;
extern u8 gSpecialVar_0x8007;
extern u16 gScriptResult;
extern u8 gUnknown_020387E8;
extern struct UnkTvStruct gUnknown_03005D38;
-extern u8 gSpeciesNames[][11];
+extern u8 *gTVBravoTrainerTextGroup[];
+extern u8 *gTVBravoTrainerBattleTowerTextGroup[];
+extern u8 *gTVSmartShopperTextGroup[];
+extern u8 *gTVNameRaterTextGroup[];
+extern u8 *gTVPokemonTodayTextGroup[];
+extern u8 *gTVPokemonTodayFailedCaptureTextGroup[];
+extern u8 *gTVFanClubTextGroup[];
+extern u8 *gTVRecentHappeningsTextGroup[];
+extern u8 *gTVFanClubOpinionsTextGroup[];
extern u8 *gTVPokemonOutbreakTextGroup[];
+extern u8 *gTVGabbyAndTyTextGroup[];
+extern u8 *gTVFishingGuruAdviceTextGroup[];
+extern u8 *gTVWorldOfMastersTextGroup[];
extern struct OutbreakPokemon gPokeOutbreakSpeciesList[5];
+extern void sub_80BEBF4(void);
+
+extern u16 gUnknown_020387E0;
+extern u16 gUnknown_020387E2;
+extern const u8 *gUnknown_083CE048[];
+
+extern const u8 *gTVNewsTextGroup1[];
+extern const u8 *gTVNewsTextGroup2[];
+extern const u8 *gTVNewsTextGroup3[];
+
+extern u16 gScriptLastTalked;
+
+u32 GetPlayerTrainerId(void);
+
+void ClearTVShowData(void)
+{
+ u8 showidx;
+ u8 extradataidx;
+ for (showidx=0; showidx<25; showidx++) {
+ gSaveBlock1.tvShows.shows[showidx].common.var00 = 0;
+ gSaveBlock1.tvShows.shows[showidx].common.var01 = 0;
+ for (extradataidx=0; extradataidx<34; extradataidx++) {
+ gSaveBlock1.tvShows.shows[showidx].common.pad02[extradataidx] = 0;
+ }
+ }
+ sub_80BEBF4();
+}
+
+bool8 sub_80BF1B4(u8);
+void sub_80BF20C(void);
+extern u16 sub_8135D3C(u8);
+extern u8 gScriptContestCategory;
+extern u8 gScriptContestRank;
+extern u8 gUnknown_03004316[11];
+extern u8 gUnknown_02024D26;
+
+void sub_80BF334(void);
+void sub_80BF3A4(void);
+void sub_80BF3DC(void);
+void sub_80BF46C(void);
+void sub_80BF478(void);
+void sub_80BF484(void);
+void sub_80BF4BC(void);
+
+void sub_80BE028(void);
+void sub_80BE074(void);
+void sub_80BE778(void);
+void sub_80BEB20(void);
+
+asm(".section .text_a");
+s8 sub_80BF74C(TVShow tvShow[]);
+
+void sub_80BF55C(TVShow tvShow[], u8 showidx);
+void sub_80BEA88(void);
+
+void sub_80BE138(TVShow *show);
+void sub_80BE160(TVShow *show);
+extern u16 gUnknown_02024C04;
+
+void sub_80BE5FC(void);
+void sub_80BE65C(void);
+void sub_80BE6A0(void);
+void nullsub_21(void);
+void sub_80BE188(void);
+void sub_80BE320(void);
+
+extern u8 GabbyAndTyGetBattleNum(void);
+
+void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void) {
+ switch (GabbyAndTyGetBattleNum()) {
+ case 1:
+ gSpecialVar_0x8004 = 0xE;
+ gSpecialVar_0x8005 = 0xD;
+ break;
+ case 2:
+ gSpecialVar_0x8004 = 0x5;
+ gSpecialVar_0x8005 = 0x6;
+ break;
+ case 3:
+ gSpecialVar_0x8004 = 0x12;
+ gSpecialVar_0x8005 = 0x11;
+ break;
+ case 4:
+ gSpecialVar_0x8004 = 0x15;
+ gSpecialVar_0x8005 = 0x16;
+ break;
+ case 5:
+ gSpecialVar_0x8004 = 0x8;
+ gSpecialVar_0x8005 = 0x9;
+ break;
+ case 6:
+ gSpecialVar_0x8004 = 0x13;
+ gSpecialVar_0x8005 = 0x14;
+ break;
+ case 7:
+ gSpecialVar_0x8004 = 0x17;
+ gSpecialVar_0x8005 = 0x18;
+ break;
+ case 8:
+ gSpecialVar_0x8004 = 0xA;
+ gSpecialVar_0x8005 = 0xB;
+ break;
+ }
+}
+
+void sub_80BDE48(void) {
+ switch (gSpecialVar_0x8005) {
+ case TVSHOW_FAN_CLUB_LETTER:
+ sub_80BE5FC();
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ sub_80BE65C();
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ sub_80BE6A0();
+ break;
+ case TVSHOW_UNKN_SHOWTYPE_04:
+ nullsub_21();
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ sub_80BE188();
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ sub_80BE320();
+ break;
+ }
+}
+
+u8 sub_80BDEAC(u8 *a0) {
+ u8 lang;
+ lang = GAME_LANGUAGE;
+ if (a0[0] == 0xFC && a0[1] == 0x15) {
+ lang = LANGUAGE_JAPANESE;
+ }
+ return lang;
+}
+
+void sub_80BDEC8(void) {
+ TVShow *show;
+ u8 i;
+ u16 total;
+ u16 item;
+ total = 0;
+ sub_80BEB20();
+ sub_80BE778();
+ if (gUnknown_030042E0.var28 == 0) {
+ sub_80BE074();
+ } else {
+ sub_80BE028();
+ if (sub_80BF77C(0xffff) == 0 && StringCompareWithoutExtCtrlCodes(gSpeciesNames[gUnknown_030042E0.var28], gUnknown_030042E0.var2a) != 0) {
+ gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows);
+ if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_CAUGHT) != 1) {
+ for (i=0; i<11; i++) {
+ total += gUnknown_030042E0.var36[i];
+ }
+ if (total != 0 || gUnknown_030042E0.var05_1 != 0) {
+ total = FALSE;
+ show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ show->pokemonToday.var00 = TVSHOW_POKEMON_TODAY_CAUGHT;
+ show->pokemonToday.var01 = total;
+ if (gUnknown_030042E0.var05_1 != 0) {
+ total = 1;
+ item = ITEM_MASTER_BALL;
+ } else {
+ for (i=0; i<11; i++) {
+ total += gUnknown_030042E0.var36[i];
+ }
+ if (total > 0xff) {
+ total = 0xff;
+ }
+ item = gUnknown_02024C04;
+ }
+ show->pokemonToday.var12 = total;
+ show->pokemonToday.ball = item;
+ StringCopy(show->pokemonToday.playerName, gSaveBlock2.playerName);
+ StringCopy(show->pokemonToday.nickname, gUnknown_030042E0.var2a);
+ show->pokemonToday.species = gUnknown_030042E0.var28;
+ sub_80BE138(show);
+ show->pokemonToday.language = GAME_LANGUAGE;
+ show->pokemonToday.language2 = sub_80BDEAC(show->pokemonToday.nickname);
+ StripExtCtrlCodes(show->pokemonToday.nickname);
+ }
+ }
+ }
+ }
+}
+
+void sub_80BE028(void) {
+ TVShow *buffer;
+ buffer = &gSaveBlock1.tvShows.unknown_2A98;
+ if (buffer->worldOfMasters.var00 != TVSHOW_WORLD_OF_MASTERS) {
+ sub_80BF55C(gSaveBlock1.tvShows.shows, 24);
+ buffer->worldOfMasters.var06 = GetGameStat(GAME_STAT_STEPS);
+ buffer->worldOfMasters.var00 = TVSHOW_WORLD_OF_MASTERS;
+ }
+ buffer->worldOfMasters.var02++;
+ buffer->worldOfMasters.var04 = gUnknown_030042E0.var28;
+ buffer->worldOfMasters.var08 = gUnknown_030042E0.var06;
+ buffer->worldOfMasters.var0a = gMapHeader.name;
+}
+
+#ifdef NONMATCHING
+void sub_80BE074(void) {
+ u8 i;
+ u16 total;
+ u8 flag;
+ TVShow *show;
+ if (sub_80BF77C(0xffff) == 0) {
+ for (i=0, total=0; i<ARRAY_COUNT(gUnknown_03004316); i++) {
+ total += gUnknown_03004316[i];
+ }
+ if (total > 0xff) {
+ total = 0xff;
+ }
+ if (total > 2 && gUnknown_02024D26 == 1) {
+ gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows);
+ if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_POKEMON_TODAY_FAILED) != 1) {
+ flag = FALSE;
+ show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ asm_comment("Here the wrong registers are used to hold the show ID and flag.");
+ show->pokemonTodayFailed.var00 = TVSHOW_POKEMON_TODAY_FAILED;
+ show->pokemonTodayFailed.var01 = flag;
+ show->pokemonTodayFailed.species = gUnknown_030042E0.var06;
+ show->pokemonTodayFailed.species2 = gUnknown_030042E0.var20;
+ show->pokemonTodayFailed.var10 = total;
+ show->pokemonTodayFailed.var11 = gUnknown_02024D26;
+ show->pokemonTodayFailed.var12 = gMapHeader.name;
+ StringCopy(show->pokemonTodayFailed.playerName, gSaveBlock2.playerName);
+ sub_80BE138(show);
+ show->pokemonTodayFailed.language = GAME_LANGUAGE;
+ }
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80BE074(void) {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ ldr r0, _080BE118 @ =0x0000ffff\n\
+ bl sub_80BF77C\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080BE112\n\
+ movs r1, 0\n\
+ movs r5, 0\n\
+ ldr r2, _080BE11C @ =gUnknown_03004316\n\
+_080BE088:\n\
+ adds r0, r1, r2\n\
+ ldrb r0, [r0]\n\
+ adds r0, r5, r0\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ cmp r1, 0xA\n\
+ bls _080BE088\n\
+ cmp r5, 0xFF\n\
+ bls _080BE0A2\n\
+ movs r5, 0xFF\n\
+_080BE0A2:\n\
+ cmp r5, 0x2\n\
+ bls _080BE112\n\
+ ldr r7, _080BE120 @ =gUnknown_02024D26\n\
+ ldrb r0, [r7]\n\
+ cmp r0, 0x1\n\
+ bne _080BE112\n\
+ ldr r6, _080BE124 @ =gSaveBlock1 + 0x2738\n\
+ adds r0, r6, 0\n\
+ bl sub_80BF74C\n\
+ ldr r4, _080BE128 @ =gUnknown_03005D38\n\
+ strb r0, [r4]\n\
+ lsls r0, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x1\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ beq _080BE112\n\
+ movs r0, 0x17\n\
+ bl sub_80BF1B4\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ beq _080BE112\n\
+ movs r0, 0\n\
+ ldrsb r0, [r4, r0]\n\
+ lsls r4, r0, 3\n\
+ adds r4, r0\n\
+ lsls r4, 2\n\
+ adds r4, r6\n\
+ @ -- Here the compiler puts the status flag in the wrong register. --\n\
+ movs r1, 0\n\
+ movs r0, 0x17\n\
+ strb r0, [r4]\n\
+ strb r1, [r4, 0x1]\n\
+ ldr r1, _080BE12C @ =gUnknown_030042E0\n\
+ ldrh r0, [r1, 0x6]\n\
+ strh r0, [r4, 0xC]\n\
+ ldrh r0, [r1, 0x20]\n\
+ strh r0, [r4, 0xE]\n\
+ strb r5, [r4, 0x10]\n\
+ ldrb r0, [r7]\n\
+ strb r0, [r4, 0x11]\n\
+ ldr r0, _080BE130 @ =gMapHeader\n\
+ ldrb r0, [r0, 0x14]\n\
+ strb r0, [r4, 0x12]\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x13\n\
+ ldr r1, _080BE134 @ =gSaveBlock2\n\
+ bl StringCopy\n\
+ adds r0, r4, 0\n\
+ bl sub_80BE138\n\
+ movs r0, 2 @ GAME_LANGUAGE\n\
+ strb r0, [r4, 0x2]\n\
+_080BE112:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080BE118: .4byte 0x0000ffff\n\
+_080BE11C: .4byte gUnknown_03004316\n\
+_080BE120: .4byte gUnknown_02024D26\n\
+_080BE124: .4byte gSaveBlock1 + 0x2738\n\
+_080BE128: .4byte gUnknown_03005D38\n\
+_080BE12C: .4byte gUnknown_030042E0\n\
+_080BE130: .4byte gMapHeader\n\
+_080BE134: .4byte gSaveBlock2\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80BE138(TVShow *show) {
+ u32 playerId;
+ playerId = GetPlayerTrainerId();
+ show->common.srcTrainerId2Lo = playerId & 0xFF;
+ show->common.srcTrainerId2Hi = playerId >> 8;
+ show->common.srcTrainerIdLo = playerId & 0xFF;
+ show->common.srcTrainerIdHi = playerId >> 8;
+ show->common.trainerIdLo = playerId & 0xFF;
+ show->common.trainerIdHi = playerId >> 8;
+}
+
+void sub_80BE160(TVShow *show) {
+ u32 playerId;
+ playerId = GetPlayerTrainerId();
+ show->common.srcTrainerIdLo = playerId & 0xFF;
+ show->common.srcTrainerIdHi = playerId >> 8;
+ show->common.trainerIdLo = playerId & 0xFF;
+ show->common.trainerIdHi = playerId >> 8;
+}
+
+void sub_80BE188(void) {
+ TVShow *show;
+ TVShow *buffer;
+ buffer = &gSaveBlock1.tvShows.unknown_2A98;
+ if (buffer->bravoTrainer.var00 == TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE) {
+ show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ show->bravoTrainer.var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE;
+ show->bravoTrainer.var01 = 1;
+ show->bravoTrainer.species = buffer->bravoTrainer.species;
+ StringCopy(show->bravoTrainer.playerName, gSaveBlock2.playerName);
+ StringCopy(show->bravoTrainer.pokemonNickname, buffer->bravoTrainer.pokemonNickname);
+ show->bravoTrainer.contestCategory = buffer->bravoTrainer.contestCategory;
+ show->bravoTrainer.contestRank = buffer->bravoTrainer.contestRank;
+ show->bravoTrainer.var14 = buffer->bravoTrainer.var14;
+ show->bravoTrainer.var13_5 = buffer->bravoTrainer.var13_5;
+ show->bravoTrainer.contestCategory = buffer->bravoTrainer.contestCategory;
+ sub_80BE160(show);
+ show->bravoTrainer.language = GAME_LANGUAGE;
+ show->bravoTrainer.var1f = sub_80BDEAC(show->bravoTrainer.pokemonNickname);
+ StripExtCtrlCodes(show->bravoTrainer.pokemonNickname);
+ }
+}
+
+void sub_80BE23C(u16 a0) {
+ TVShow *show;
+ show = &gSaveBlock1.tvShows.unknown_2A98;
+ sub_80BF484();
+ gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows.shows);
+ if (gUnknown_03005D38.var0 != -1) {
+ sub_80BF55C(gSaveBlock1.tvShows.shows, 24);
+ show->bravoTrainer.var14 = a0;
+ show->bravoTrainer.var00 = TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE;
+ }
+}
+
+void sub_80BE284(u8 a0) {
+ TVShow *show;
+ show = &gSaveBlock1.tvShows.unknown_2A98;
+ gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows.shows);
+ if (gUnknown_03005D38.var0 != -1) {
+ show->bravoTrainer.var13_5 = a0;
+ show->bravoTrainer.contestCategory = gScriptContestCategory;
+ show->bravoTrainer.contestRank = gScriptContestRank;
+ show->bravoTrainer.species = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_SPECIES, NULL);
+ GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_NICKNAME, show->bravoTrainer.pokemonNickname);
+ }
+}
+
+void sub_80BE320(void) {
+ TVShow *show;
+ show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ show->bravoTrainerTower.var00 = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE;
+ show->bravoTrainerTower.var01 = 1;
+ StringCopy(show->bravoTrainerTower.trainerName, gSaveBlock2.playerName);
+ StringCopy(show->bravoTrainerTower.pokemonName, gSaveBlock2.filler_A8.filler_3DC);
+ show->bravoTrainerTower.species = gSaveBlock2.filler_A8.var_480;
+ show->bravoTrainerTower.winningMove = gSaveBlock2.filler_A8.var_482;
+ show->bravoTrainerTower.var16 = sub_8135D3C(gSaveBlock2.filler_A8.var_4D0);
+ show->bravoTrainerTower.var1c = gSaveBlock2.filler_A8.var_4AD;
+ if (gSaveBlock2.filler_A8.var_4D0 == 0) {
+ show->bravoTrainerTower.btLevel = 50;
+ } else {
+ show->bravoTrainerTower.btLevel = 100;
+ }
+ show->bravoTrainerTower.var1b = gSpecialVar_0x8004;
+ sub_80BE160(show);
+ show->bravoTrainerTower.language = GAME_LANGUAGE;
+}
+
+void sub_80BE3BC(void) {
+ u8 rval;
+ TVShow *tvShow;
+ u8 i;
+
+ rval = sub_80BF77C(0x5555);
+ if (rval == 0) {
+ gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows);
+ if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_SMART_SHOPPER) != 1) {
+ sub_80BF20C();
+ if (gUnknown_02038724[0].item_amount >= 20) {
+ tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ tvShow->smartshopperShow.var00 = TVSHOW_SMART_SHOPPER;
+ tvShow->smartshopperShow.var01 = rval;
+ tvShow->smartshopperShow.shopLocation = gMapHeader.name;
+ for (i=0; i<3; i++) {
+ tvShow->smartshopperShow.itemIds[i] = gUnknown_02038724[i].item_id;
+ tvShow->smartshopperShow.itemAmounts[i] = gUnknown_02038724[i].item_amount;
+ }
+ tvShow->smartshopperShow.priceReduced = GetPriceReduction(1);
+ StringCopy(tvShow->smartshopperShow.playerName, gSaveBlock2.playerName);
+ sub_80BE138(tvShow);
+ tvShow->smartshopperShow.language = GAME_LANGUAGE;
+ }
+ }
+ }
+}
+
void sub_80BE478(void)
{
u16 playerNameLength;
@@ -67,7 +561,7 @@ void sub_80BE478(void)
return;
}
- tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0];
+ tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
tvShow->nameRaterShow.var00 = TVSHOW_NAME_RATER_SHOW;
tvShow->nameRaterShow.var01 = 1;
@@ -85,7 +579,7 @@ void sub_80BE478(void)
sub_80BE160(tvShow);
tvShow->nameRaterShow.language = GAME_LANGUAGE;
- tvShow->nameRaterShow.var1F = sub_80BDEAC(tvShow->nameRaterShow.pokemonName);
+ tvShow->nameRaterShow.pokemonNameLanguage = sub_80BDEAC(tvShow->nameRaterShow.pokemonName);
StripExtCtrlCodes(tvShow->nameRaterShow.pokemonName);
}
@@ -94,7 +588,7 @@ void StartMassOutbreak(void)
{
TVShow *tvShow;
- tvShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004];
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
gSaveBlock1.outbreakPokemonSpecies = tvShow->massOutbreak.species;
gSaveBlock1.outbreakLocationMapNum = tvShow->massOutbreak.locationMapNum;
@@ -116,7 +610,7 @@ void sub_80BE5FC(void)
TVShow *tvShow;
u16 species;
- tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0];
+ tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
tvShow->fanclubLetter.var00 = TVSHOW_FAN_CLUB_LETTER;
tvShow->fanclubLetter.var01 = 1;
@@ -125,22 +619,22 @@ void sub_80BE5FC(void)
species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL);
tvShow->fanclubLetter.species = species;
sub_80BE160(tvShow);
- tvShow->fanclubLetter.var18 = GAME_LANGUAGE;
+ tvShow->fanclubLetter.language = GAME_LANGUAGE;
}
void sub_80BE65C(void)
{
TVShow *tvShow;
- tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0];
+ tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
tvShow->recentHappenings.var00 = TVSHOW_RECENT_HAPPENINGS;
tvShow->recentHappenings.var01 = 1;
- StringCopy(&tvShow->recentHappenings.var10[0], &gSaveBlock2.playerName[0]);
+ StringCopy(tvShow->recentHappenings.playerName, gSaveBlock2.playerName);
tvShow->recentHappenings.var02 = 0;
sub_80BE160(tvShow);
- tvShow->recentHappenings.var18 = GAME_LANGUAGE;
+ tvShow->recentHappenings.language = GAME_LANGUAGE;
}
void sub_80BE6A0(void)
@@ -148,7 +642,7 @@ void sub_80BE6A0(void)
TVShow *tvShow;
u8 monIndex;
- tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0];
+ tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
tvShow->fanclubOpinions.var00 = TVSHOW_PKMN_FAN_CLUB_OPINIONS;
tvShow->fanclubOpinions.var01 = 1;
@@ -159,13 +653,13 @@ void sub_80BE6A0(void)
tvShow->fanclubOpinions.var04B = gSpecialVar_0x8007;
- StringCopy(tvShow->fanclubOpinions.var05, gSaveBlock2.playerName);
+ StringCopy(tvShow->fanclubOpinions.playerName, gSaveBlock2.playerName);
GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, tvShow->fanclubOpinions.var10);
tvShow->fanclubOpinions.var02 = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL);
sub_80BE160(tvShow);
- tvShow->fanclubOpinions.var0D = GAME_LANGUAGE;
+ tvShow->fanclubOpinions.language = GAME_LANGUAGE;
tvShow->fanclubOpinions.var0E = sub_80BDEAC(tvShow->fanclubOpinions.var10);
StripExtCtrlCodes(tvShow->fanclubOpinions.var10);
}
@@ -186,7 +680,7 @@ void sub_80BE778(void)
for (i = 0; i < 24; i++)
{
- if (gSaveBlock1.tvShows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK)
+ if (gSaveBlock1.tvShows.shows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK)
{
return;
}
@@ -197,7 +691,7 @@ void sub_80BE778(void)
return;
}
- gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows);
+ gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows.shows);
if (gUnknown_03005D38.var0 == -1)
{
return;
@@ -213,7 +707,7 @@ void sub_80BE778(void)
val2 = gUnknown_03005D38.var0;
- tvShow = &gSaveBlock1.tvShows[val2];
+ tvShow = &gSaveBlock1.tvShows.shows[val2];
tvShow->massOutbreak.var00 = TVSHOW_MASS_OUTBREAK;
tvShow->massOutbreak.var01 = 1;
@@ -235,7 +729,7 @@ void sub_80BE778(void)
tvShow->massOutbreak.var16 = 0x01;
sub_80BE160(tvShow);
- tvShow->massOutbreak.var18 = GAME_LANGUAGE;
+ tvShow->massOutbreak.language = GAME_LANGUAGE;
}
}
@@ -264,7 +758,593 @@ void UpdateTVShowsPerDay(u16 arg0)
sub_80BEA5C(arg0);
}
-asm(".section .text_b");
+void sub_80BE8EC(u16 arg0)
+{
+ u8 showidx;
+ TVShow *tvShow;
+ if (gSaveBlock1.outbreakPokemonSpecies == 0) {
+ for (showidx=0; showidx<24; showidx++) {
+ if (gSaveBlock1.tvShows.shows[showidx].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK && gSaveBlock1.tvShows.shows[showidx].massOutbreak.var01 == 0x01) {
+ tvShow = &(gSaveBlock1.tvShows.shows[showidx]);
+ if (tvShow->massOutbreak.var16 < arg0)
+ tvShow->massOutbreak.var16 = 0;
+ else
+ tvShow->massOutbreak.var16 -= arg0;
+ break;
+ }
+ }
+ }
+}
+
+void UpdateMassOutbreakTimeLeft(u16 arg0)
+{
+ if (gSaveBlock1.outbreakUnk5 <= arg0)
+ EndMassOutbreak();
+ else
+ gSaveBlock1.outbreakUnk5 -= arg0;
+}
+
+void sub_80BE9D4();
+
+void sub_80BE97C(bool8 flag)
+{
+ u8 var0, var1;
+ if (flag != 0) {
+ var0 = gUnknown_020387E2 >> 8;
+ if (var0 > 4)
+ sub_80BE9D4();
+ gUnknown_020387E2 &= 0xFF;
+ var1 = gUnknown_020387E2 & 0xFF;
+ if (var1 != 0xFF)
+ gUnknown_020387E2++;
+ } else {
+ var0 = gUnknown_020387E2 & 0xFF;
+ if (var0 > 4)
+ sub_80BE9D4();
+ gUnknown_020387E2 &= 0xFF00;
+ var1 = gUnknown_020387E2 >> 8;
+ if (var1 != 0xFF)
+ gUnknown_020387E2 += 0x100;
+ }
+}
+
+void sub_80BE9D4()
+{
+ TVShow *show;
+ gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows);
+ if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_FISHING_ADVICE) != 1) {
+ show = &(gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0]);
+#ifdef NONMATCHING
+ show->pokemonAngler.var00 = TVSHOW_FISHING_ADVICE;
+ show->pokemonAngler.var01 = 0;
+#else
+ asm(".syntax unified\n\
+ movs r1, 0\n\
+ movs r0, 24\n\
+ strb r0, [r4]\n\
+ strb r1, [r4, 1]\n\
+ .syntax divided\n");
+#endif
+ show->pokemonAngler.var02 = gUnknown_020387E2 & 0xFF;
+ show->pokemonAngler.var03 = gUnknown_020387E2 >> 8;
+ show->pokemonAngler.var04 = gUnknown_020387E0;
+ StringCopy(show->pokemonAngler.playerName, gSaveBlock2.playerName);
+ sub_80BE138(show);
+ show->pokemonAngler.language = GAME_LANGUAGE;
+ }
+}
+
+void sub_80BEA50(u16 var)
+{
+ gUnknown_020387E0 = var;
+}
+
+void sub_80BF55C(TVShow tvShow[], u8 showidx);
+void sub_80BEA88(void);
+
+void sub_80BEA5C(u16 arg0)
+{
+ TVShow *unk_2a98;
+ unk_2a98 = &gSaveBlock1.tvShows.unknown_2A98;
+ if (unk_2a98->common.var00 == TVSHOW_WORLD_OF_MASTERS)
+ {
+ if (unk_2a98->worldOfMasters.var02 < 20)
+ {
+ sub_80BF55C(gSaveBlock1.tvShows.shows, 0x18);
+ }
+ else
+ {
+ sub_80BEA88();
+ }
+ }
+}
+void sub_80BEA88(void)
+{
+ TVShow *unk_2a98;
+ TVShow *tvShow;
+ u8 rval;
+ unk_2a98 = &gSaveBlock1.tvShows.unknown_2A98;
+ rval = sub_80BF77C(0xFFFF);
+ if (rval == 0)
+ {
+ gUnknown_03005D38.var0 = sub_80BF74C(gSaveBlock1.tvShows.shows);
+ if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_WORLD_OF_MASTERS) != 1)
+ {
+ tvShow = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ tvShow->worldOfMasters.var00 = TVSHOW_WORLD_OF_MASTERS;
+ tvShow->worldOfMasters.var01 = rval;
+ tvShow->worldOfMasters.var02 = unk_2a98->worldOfMasters.var02;
+ tvShow->worldOfMasters.var06 = GetGameStat(GAME_STAT_STEPS) - unk_2a98->worldOfMasters.var06;
+ tvShow->worldOfMasters.var04 = unk_2a98->worldOfMasters.var04;
+ tvShow->worldOfMasters.var08 = unk_2a98->worldOfMasters.var08;
+ tvShow->worldOfMasters.var0a = unk_2a98->worldOfMasters.var0a;
+ StringCopy(tvShow->worldOfMasters.playerName, gSaveBlock2.playerName);
+ sub_80BE138(tvShow);
+ tvShow->worldOfMasters.language = GAME_LANGUAGE;
+ }
+ }
+}
+
+int sub_80BEBC8(struct UnknownSaveStruct2ABC *arg0);
+void sub_80BEC10(u8);
+void sub_80BF588(TVShow tvShows[]);
+void sub_80BF6D8(void);
+bool8 sub_80BF77C(u16);
+bool8 sub_80BEE48(u8);
+
+bool8 IsPriceDiscounted(u8);
+
+void sub_80BEB20(void) {
+ u16 rval;
+ struct SaveBlock1 *save;
+ struct UnknownSaveStruct2ABC *unk2abc;
+ if (FlagGet(SYS_GAME_CLEAR) != 0) {
+ unk2abc = gSaveBlock1.unknown_2ABC;
+ gUnknown_03005D38.var0 = sub_80BEBC8(unk2abc);
+ if (gUnknown_03005D38.var0 != -1 && sub_80BF77C(0x28f) != 1) {
+ rval = (Random() % 3) + 1;
+ if (sub_80BEE48(rval) != 1) {
+ save = &gSaveBlock1;
+ save->unknown_2ABC[gUnknown_03005D38.var0].val0 = rval;
+ save->unknown_2ABC[gUnknown_03005D38.var0].val2 = 4;
+ save->unknown_2ABC[gUnknown_03005D38.var0].val1 = 1;
+ }
+ }
+ }
+}
+
+int sub_80BEBC8(struct UnknownSaveStruct2ABC *arg0) {
+ s8 i;
+ for (i=0; i<16; i++) {
+ if (arg0[i].val0 == 0) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void sub_80BEBF4(void) {
+ u8 i;
+ for (i=0; i<16; i++) {
+ sub_80BEC10(i);
+ }
+}
+
+void sub_80BEC10(u8 arg0) {
+ gSaveBlock1.unknown_2ABC[arg0].val0 = 0;
+ gSaveBlock1.unknown_2ABC[arg0].val1 = 0;
+ gSaveBlock1.unknown_2ABC[arg0].val2 = 0;
+}
+
+void sub_80BEC40(void) {
+ u8 i, j;
+ for (i = 0; i < 15; i++) {
+ if (gSaveBlock1.unknown_2ABC[i].val0 == 0) {
+ for (j = i + 1; j < 16; j++) {
+ if (gSaveBlock1.unknown_2ABC[j].val0 != 0) {
+ gSaveBlock1.unknown_2ABC[i] = gSaveBlock1.unknown_2ABC[j];
+ sub_80BEC10(j);
+ break;
+ }
+ }
+ }
+ }
+}
+
+u8 sub_80BECA0(void)
+{
+ u8 i;
+ for (i=0; i<16; i++)
+ {
+ if (gSaveBlock1.unknown_2ABC[i].val0 != 0 && gSaveBlock1.unknown_2ABC[i].val1 == 1 && gSaveBlock1.unknown_2ABC[i].val2 < 3)
+ {
+ return i;
+ }
+ }
+ return 0xFF;
+}
+
+void sub_80BECE8(void)
+{
+ u8 arg0;
+ arg0 = sub_80BECA0();
+ if (arg0 == 0xff)
+ {
+ gScriptResult = 0;
+ return;
+ }
+ if (gSaveBlock1.unknown_2ABC[arg0].val2 == 0)
+ {
+ gSaveBlock1.unknown_2ABC[arg0].val1 = 2;
+ if (gLocalTime.hours < 20)
+ {
+ ShowFieldMessage(gTVNewsTextGroup2[gSaveBlock1.unknown_2ABC[arg0].val0]);
+ }
+ else
+ {
+ ShowFieldMessage(gTVNewsTextGroup3[gSaveBlock1.unknown_2ABC[arg0].val0]);
+ }
+ }
+ else
+ {
+ u16 value = gSaveBlock1.unknown_2ABC[arg0].val2;
+ ConvertIntToDecimalStringN(gStringVar1, value, 0, 1);
+ gSaveBlock1.unknown_2ABC[arg0].val1 = 0;
+ ShowFieldMessage(gTVNewsTextGroup1[gSaveBlock1.unknown_2ABC[arg0].val0]);
+ }
+ gScriptResult = 1;
+}
+
+bool8 GetPriceReduction(u8 arg0)
+{
+ u8 i;
+ if (arg0 == 0)
+ {
+ return FALSE;
+ }
+ for (i=0; i<16; i++)
+ {
+ if (gSaveBlock1.unknown_2ABC[i].val0 == arg0)
+ {
+ if (gSaveBlock1.unknown_2ABC[i].val1 == 2 && IsPriceDiscounted(arg0) != 0)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+bool8 IsPriceDiscounted(u8 arg0)
+{
+ switch (arg0)
+ {
+ case 1:
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP_SLATEPORT_CITY && gSaveBlock1.location.mapNum == MAP_ID_SLATEPORT_CITY && gScriptLastTalked == 0x1a)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ break;
+ case 3:
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP && gSaveBlock1.location.mapNum == MAP_ID_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+ break;
+ default:
+ return TRUE;
+ }
+}
+
+bool8 sub_80BEE48(u8 arg0)
+{
+ u8 i;
+ if (arg0 == 0)
+ {
+ return TRUE;
+ }
+ else
+ {
+ for (i=0; i<16; i++)
+ {
+ if (gSaveBlock1.unknown_2ABC[i].val0 == arg0)
+ {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+void sub_80BEE84(u16 var0)
+{
+ u8 i;
+ for (i=0; i<16; i++)
+ {
+ if (gSaveBlock1.unknown_2ABC[i].val0)
+ {
+ if (gSaveBlock1.unknown_2ABC[i].val2 < var0)
+ {
+ sub_80BEC10(i);
+ }
+ else
+ {
+ if (!gSaveBlock1.unknown_2ABC[i].val1 && FlagGet(SYS_GAME_CLEAR) == 1)
+ {
+ gSaveBlock1.unknown_2ABC[i].val1 = 1;
+ }
+ gSaveBlock1.unknown_2ABC[i].val2 -= var0;
+ }
+ }
+ }
+ sub_80BEC40();
+}
+
+void sub_80BEF10(u8 strvaridx, u8 rank)
+{
+ switch (rank)
+ {
+ case NORMAL_RANK:
+ StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[NORMAL_RANK + 5]);
+ break;
+ case SUPER_RANK:
+ StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[SUPER_RANK + 5]);
+ break;
+ case HYPER_RANK:
+ StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[HYPER_RANK + 5]);
+ break;
+ case MASTER_RANK:
+ StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[MASTER_RANK + 5]);
+ break;
+ }
+}
+
+void CopyContestCategoryToStringVar(u8 strvaridx, u8 category)
+{
+ switch (category)
+ {
+ case CONTEST_COOL:
+ StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_COOL]);
+ break;
+ case CONTEST_BEAUTY:
+ StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_BEAUTY]);
+ break;
+ case CONTEST_CUTE:
+ StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_CUTE]);
+ break;
+ case CONTEST_SMART:
+ StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_SMART]);
+ break;
+ case CONTEST_TOUGH:
+ StringCopy(gUnknown_083D1464[strvaridx], gUnknown_083CE048[CONTEST_TOUGH]);
+ break;
+ }
+}
+
+void SetContestCategoryStringVarForInterview(void)
+{
+ TVShow *tvShow;
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
+ CopyContestCategoryToStringVar(1, tvShow->bravoTrainer.contestCategory);
+}
+
+void sub_80BF088(u8 arg0, s32 price)
+{
+ size_t log10val;
+ log10val = sub_80BF0B8(price);
+ ConvertIntToDecimalStringN(gUnknown_083D1464[arg0], price, 0, log10val);
+}
+
+size_t sub_80BF0B8(int value)
+{
+ if (value / 10 == 0)
+ return 1;
+ else if (value / 100 == 0)
+ return 2;
+ else if (value / 1000 == 0)
+ return 3;
+ else if (value / 10000 == 0)
+ return 4;
+ else if (value / 100000 == 0)
+ return 5;
+ else if (value / 1000000 == 0)
+ return 6;
+ else if (value / 10000000 == 0)
+ return 7;
+ else if (value / 100000000 == 0)
+ return 8;
+ else
+ return 1;
+}
+
+void sub_80BF154(u8 arg0, struct TVShowSmartShopper *arg1)
+{
+ u8 i;
+ s32 price;
+ price = 0;
+ for (i=0; i<3; i++)
+ {
+ if (arg1->itemIds[i])
+ {
+ price += ItemId_GetPrice(arg1->itemIds[i]) * arg1->itemAmounts[i];
+ }
+ }
+ if (arg1->priceReduced == 1)
+ {
+ sub_80BF088(arg0, price >> 1);
+ }
+ else
+ {
+ sub_80BF088(arg0, price);
+ }
+}
+
+bool8 sub_80BF1B4(u8 showIdx)
+{
+ TVShow *tvShows;
+ u8 i;
+ u32 trainerId;
+ tvShows = gSaveBlock1.tvShows.shows;
+ trainerId = GetPlayerTrainerId();
+ for (i=5; i<24; i++)
+ {
+ if (tvShows[i].common.var00 == showIdx)
+ {
+ if ((trainerId & 0xFF) == tvShows[i].common.trainerIdLo && ((trainerId >> 8) & 0xFF) == tvShows[i].common.trainerIdHi)
+ {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+void sub_80BF20C(void)
+{
+ u8 i, j;
+ u16 tmpId, tmpAmount;
+ for (i=0; i<2; i++)
+ {
+ for (j=i+1; j<3; j++)
+ {
+ if (gUnknown_02038724[i].item_amount < gUnknown_02038724[j].item_amount)
+ {
+ tmpId = gUnknown_02038724[i].item_id;
+ tmpAmount = gUnknown_02038724[i].item_amount;
+ gUnknown_02038724[i].item_id = gUnknown_02038724[j].item_id;
+ gUnknown_02038724[i].item_amount = gUnknown_02038724[j].item_amount;
+ gUnknown_02038724[j].item_id = tmpId;
+ gUnknown_02038724[j].item_amount = tmpAmount;
+ }
+ }
+ }
+}
+
+void sub_80BF25C(u8 showType)
+{
+ u8 i;
+ for (i=0; i<5; i++)
+ {
+ if (gSaveBlock1.tvShows.shows[i].common.var00 == showType) {
+ if(gSaveBlock1.tvShows.shows[i].common.var01 == 1)
+ {
+ gScriptResult = 1;
+ }
+ else
+ {
+ sub_80BF55C(gSaveBlock1.tvShows.shows, i);
+ sub_80BF588(gSaveBlock1.tvShows.shows);
+ sub_80BF6D8();
+ }
+ return;
+ }
+ }
+ sub_80BF6D8();
+}
+
+void sub_80BF2C4(void)
+{
+ gScriptResult = 0;
+ switch (gSpecialVar_0x8005) {
+ case TVSHOW_FAN_CLUB_LETTER:
+ sub_80BF334();
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ sub_80BF3A4();
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ sub_80BF3DC();
+ break;
+ case TVSHOW_UNKN_SHOWTYPE_04:
+ sub_80BF46C();
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ sub_80BF478();
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ sub_80BF484();
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ sub_80BF4BC();
+ break;
+ }
+}
+
+void sub_80BF334(void)
+{
+ TVShow *show;
+ sub_80BF25C(TVSHOW_FAN_CLUB_LETTER);
+ if (gScriptResult == 0) {
+ StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]);
+ show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ sub_80EB6FC(show->fanclubLetter.pad04, 6);
+ }
+}
+
+void sub_80BF3A4(void)
+{
+ TVShow *show;
+ sub_80BF25C(TVSHOW_RECENT_HAPPENINGS);
+ if (gScriptResult == 0) {
+ show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ sub_80EB6FC(show->recentHappenings.var04, 6);
+ }
+}
+
+void sub_80BF3DC(void)
+{
+ TVShow *show;
+ sub_80BF25C(TVSHOW_PKMN_FAN_CLUB_OPINIONS);
+ if (gScriptResult == 0) {
+ StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, 0)]);
+ GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, gStringVar2);
+ StringGetEnd10(gStringVar2);
+ show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ sub_80EB6FC(show->fanclubOpinions.var1C, 2);
+ }
+}
+
+void sub_80BF46C(void)
+{
+ gScriptResult = 1;
+}
+
+void sub_80BF478(void)
+{
+ sub_80BF25C(TVSHOW_NAME_RATER_SHOW);
+}
+
+void sub_80BF484(void)
+{
+ TVShow *show;
+ sub_80BF25C(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE);
+ if (gScriptResult == 0) {
+ show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ sub_80EB6FC(show->bravoTrainer.var04, 2);
+ }
+}
+
+void sub_80BF4BC(void)
+{
+ TVShow *show;
+ sub_80BF25C(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE);
+ if (gScriptResult == 0) {
+ show = &gSaveBlock1.tvShows.shows[gUnknown_03005D38.var0];
+ sub_80EB6FC(show->bravoTrainerTower.var18, 1); // wrong struct ident, fix later
+ }
+}
u8 sub_80BF4F4(u8 arg0)
{
@@ -282,13 +1362,1540 @@ u8 sub_80BF4F4(u8 arg0)
return TRUE;
}
+u8 sub_80BF544(void)
+{
+ return sub_80BF4F4(GetLeadMonIndex());
+}
+
+void sub_80BF55C(TVShow tvShow[], u8 showidx)
+{
+ u8 idx;
+ tvShow[showidx].common.var00 = 0;
+ tvShow[showidx].common.var01 = 0;
+ for (idx=0; idx<34; idx++) {
+ tvShow[showidx].common.pad02[idx] = 0;
+ }
+}
+
+void sub_80BF588(TVShow tvShow[])
+{
+ u8 showidx;
+ u8 showidx2;
+ for (showidx=0; showidx<4; showidx++) {
+ if (tvShow[showidx].common.var00 == 0) {
+ for (showidx2=showidx+1; showidx2<5; showidx2++) {
+ if (tvShow[showidx2].common.var00 != 0) {
+ tvShow[showidx] = tvShow[showidx2];
+ sub_80BF55C(tvShow, showidx2);
+ break;
+ }
+ }
+ }
+ }
+ for (showidx=5; showidx<24; showidx++) {
+ if (tvShow[showidx].common.var00 == 0) {
+ for (showidx2=showidx+1; showidx2<24; showidx2++) {
+ if (tvShow[showidx2].common.var00 != 0) {
+ tvShow[showidx] = tvShow[showidx2];
+ sub_80BF55C(gSaveBlock1.tvShows.shows, showidx2);
+ break;
+ }
+ }
+ }
+ }
+}
+
+u16 sub_80BF638(u8 arg0, u16 arg1)
+{
+ u16 retval = sub_80BF674(arg1);
+ StringCopy(gUnknown_083D1464[arg0], gSpeciesNames[retval]);
+ return retval;
+}
+
+u16 sub_80BF674(u16 species)
+{
+ u16 rspecies;
+ u16 cspecies;
+ rspecies = (Random() % (NUM_SPECIES - 1)) + 1;
+ cspecies = rspecies;
+ while ((s8)GetNationalPokedexFlag(SpeciesToNationalPokedexNum(cspecies), 0) != 1 || cspecies == species) {
+ if (cspecies == SPECIES_BULBASAUR)
+ cspecies = NUM_SPECIES - 1;
+ else
+ cspecies --;
+ if (cspecies == rspecies) {
+ cspecies = species;
+ return cspecies;
+ }
+ }
+ return cspecies;
+}
+
+void sub_80BF6D8(void)
+{
+ gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows.shows);
+ gSpecialVar_0x8006 = gUnknown_03005D38.var0;
+ if (gUnknown_03005D38.var0 == -1)
+ gScriptResult = 1;
+ else
+ gScriptResult = 0;
+}
+
+s8 sub_80BF720(TVShow tvShow[])
+{
+ u8 idx;
+ for (idx=0; idx<5; idx++) {
+ if (tvShow[idx].common.var00 == 0)
+ return idx;
+ }
+ return -1;
+}
+
+s8 sub_80BF74C(TVShow tvShow[])
+{
+ s8 idx;
+ for (idx=5; idx<24; idx++) {
+ if (tvShow[idx].common.var00 == 0)
+ return idx;
+ }
+ return -1;
+}
+
+bool8 sub_80BF77C(u16 value)
+{
+ if (Random() <= value)
+ return FALSE;
+ return TRUE;
+}
+
+void sub_80BF79C(TVShow *arg0)
+{
+ u8 i = Random() % 6;
+ while (1) {
+ if (i == 6)
+ i = 0;
+ if (arg0->recentHappenings.var04[i] != 0xFFFF)
+ break;
+ i ++;
+ }
+ sub_80EB3FC(gStringVar3, arg0->recentHappenings.var04[i]);
+}
+
+u8 sub_80BF7E8(struct TVShowNameRaterShow *arg0)
+{
+ u16 flagsum = 0;
+ u8 i = 0;
+ if (arg0->pokemonName[0] != 0xFF) {
+ while (i < 11 && arg0->pokemonName[i] != 0xFF) {
+ flagsum += arg0->pokemonName[i];
+ i++;
+ }
+ }
+ return flagsum & 0x7;
+}
+
+void sub_80BF820(u8 arg0, u8 arg1, u8 arg2, u16 arg3, u16 arg4, struct TVShowNameRaterShow *tvShow)
+{
+ u8 flags[3];
+ u16 nameLength;
+ u8 i;
+ for (i=0; i<3; i++)
+ flags[i] = EOS;
+ if (arg3 == 0) {
+ nameLength = StringLength(tvShow->trainerName);
+ if (arg2 == 0) {
+ flags[0] = tvShow->trainerName[arg1];
+ } else if (arg2 == 1) {
+ flags[0] = tvShow->trainerName[nameLength - arg1];
+ } else if (arg2 == 2) {
+ flags[0] = tvShow->trainerName[arg1];
+ flags[1] = tvShow->trainerName[arg1 + 1];
+ } else {
+ flags[0] = tvShow->trainerName[nameLength - (arg1 + 2)];
+ flags[1] = tvShow->trainerName[nameLength - (arg1 + 1)];
+ }
+ } else if (arg3 == 1) {
+ nameLength = StringLength(tvShow->pokemonName);
+ if (arg2 == 0) {
+ flags[0] = tvShow->pokemonName[arg1];
+ } else if (arg2 == 1) {
+ flags[0] = tvShow->pokemonName[nameLength - arg1];
+ } else if (arg2 == 2) {
+ flags[0] = tvShow->pokemonName[arg1];
+ flags[1] = tvShow->pokemonName[arg1 + 1];
+ } else {
+ flags[0] = tvShow->pokemonName[nameLength - (arg1 + 2)];
+ flags[1] = tvShow->pokemonName[nameLength - (arg1 + 1)];
+ }
+ } else {
+ nameLength = StringLength(gSpeciesNames[arg4]);
+ if (arg2 == 0) {
+ flags[0] = gSpeciesNames[arg4][arg1];
+ } else if (arg2 == 1) {
+ flags[0] = gSpeciesNames[arg4][nameLength - arg1];
+ } else if (arg2 == 2) {
+ flags[0] = gSpeciesNames[arg4][arg1];
+ flags[1] = gSpeciesNames[arg4][arg1 + 1];
+ } else {
+ flags[0] = gSpeciesNames[arg4][nameLength - (arg1 + 2)];
+ flags[1] = gSpeciesNames[arg4][nameLength - (arg1 + 1)];
+ }
+ }
+ StringCopy(gUnknown_083D1464[arg0], flags);
+}
+
+bool8 sub_80BF974(void)
+{
+ u8 i;
+ for (i=0; i<5; i++)
+ {
+ if (gSaveBlock1.tvShows.shows[i].common.var00 == gSpecialVar_0x8004)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80BF9B4(void)
+{
+ GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1);
+ if (!StringCompareWithoutExtCtrlCodes(gStringVar3, gStringVar1))
+ return FALSE;
+ sub_80BE478();
+ return TRUE;
+}
+
+void c2_080CC144(void);
+
+void sub_80BF9F8(void)
+{
+ u16 spec;
+ u16 gender;
+ u32 pval;
+ GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar3);
+ GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar2);
+ spec = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_SPECIES, 0);
+ gender = GetMonGender(&(gPlayerParty[gSpecialVar_0x8004]));
+ pval = GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_PERSONALITY, 0);
+ DoNamingScreen(3, gStringVar2, spec, gender, pval, c2_080CC144);
+}
+
+void c2_080CC144(void)
+{
+ SetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, gStringVar2);
+ c2_exit_to_overworld_1_continue_scripts_restart_music();
+}
+
+void sub_80BFAE0(void)
+{
+ GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_NICKNAME, &gStringVar1);
+ StringGetEnd10(gStringVar1);
+}
+
+void sub_80BFB10(void)
+{
+ if (GetPlayerTrainerId() == GetMonData(&(gPlayerParty[gSpecialVar_0x8004]), MON_DATA_OT_ID, 0))
+ gScriptResult = 0;
+ else
+ gScriptResult = 1;
+}
+
+u8 sub_80BFB54(u8 arg0)
+{
+ if (arg0 == 0)
+ return 0;
+ else if (arg0 > 0 && arg0 <= 20)
+ return 2;
+ else if (arg0 > 20 && arg0 <= 40)
+ return 3;
+ else if (arg0 > 40 && arg0 <= 60)
+ return 4;
+ else
+ return 0;
+}
+
+u32 GetPlayerTrainerId(void)
+{
+ return (gSaveBlock2.playerTrainerId[3] << 24) | (gSaveBlock2.playerTrainerId[2] << 16) | (gSaveBlock2.playerTrainerId[1] << 8) | (gSaveBlock2.playerTrainerId[0]);
+}
+
+u8 CheckForBigMovieOrEmergencyNewsOnTV(void)
+{
+ if (gSaveBlock1.location.mapGroup != MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ return 0;
+ if (gSaveBlock2.playerGender == MALE) {
+ if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)
+ return 0;
+ } else {
+ if (gSaveBlock1.location.mapNum != MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F)
+ return 0;
+ }
+ if (FlagGet(SYS_TV_LATI) == 1)
+ return 1;
+ if (FlagGet(SYS_TV_HOME) == 1)
+ return 2;
+ return 1;
+}
+
+#ifdef NONMATCHING
+void GetMomOrDadStringForTVMessage(void)
+{
+ if (gSaveBlock1.location.mapGroup == MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) {
+ if (gSaveBlock2.playerGender == MALE) {
+ if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F) {
+ StringCopy(gStringVar1, gOtherText_Mom);
+ VarSet(VAR_0x4003, 1);
+ }
+ } else {
+ if (gSaveBlock1.location.mapNum == MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_1F) {
+ StringCopy(gStringVar1, gOtherText_Mom);
+ VarSet(VAR_0x4003, 1);
+ }
+ }
+ }
+ if (VarGet(VAR_0x4003) == 1) {
+ StringCopy(gStringVar1, gOtherText_Mom);
+ } else if (VarGet(VAR_0x4003) == 2) {
+ StringCopy(gStringVar1, gOtherText_Dad);
+ } else if (VarGet(VAR_0x4003) > 2) {
+ if ((u16)(VarGet(VAR_0x4003) & 1) == 0) {
+ StringCopy(gStringVar1, gOtherText_Mom);
+ } else {
+ StringCopy(gStringVar1, gOtherText_Dad);
+ }
+ } else {
+ if ((u16)(Random() & 1) != 0) {
+ StringCopy(gStringVar1, gOtherText_Mom);
+ VarSet(VAR_0x4003, 1);
+ } else {
+ StringCopy(gStringVar1, gOtherText_Dad);
+ VarSet(VAR_0x4003, 2);
+ }
+ }
+}
+#else
+__attribute__((naked))
+void GetMomOrDadStringForTVMessage(void)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ ldr r1, _080BFC40 @ =gSaveBlock1\n\
+ movs r0, 0x4\n\
+ ldrsb r0, [r1, r0]\n\
+ cmp r0, 0x1\n\
+ bne _080BFC6C\n\
+ ldr r0, _080BFC44 @ =gSaveBlock2\n\
+ ldrb r0, [r0, 0x8]\n\
+ cmp r0, 0\n\
+ bne _080BFC54\n\
+ movs r0, 0x5\n\
+ ldrsb r0, [r1, r0]\n\
+ cmp r0, 0\n\
+ bne _080BFC6C\n\
+ ldr r0, _080BFC48 @ =gStringVar1\n\
+ ldr r1, _080BFC4C @ =gOtherText_Mom\n\
+ bl StringCopy\n\
+ ldr r0, _080BFC50 @ =0x00004003\n\
+ movs r1, 0x1\n\
+ bl VarSet\n\
+ b _080BFC6C\n\
+ .align 2, 0\n\
+_080BFC40: .4byte gSaveBlock1\n\
+_080BFC44: .4byte gSaveBlock2\n\
+_080BFC48: .4byte gStringVar1\n\
+_080BFC4C: .4byte gOtherText_Mom\n\
+_080BFC50: .4byte 0x00004003\n\
+_080BFC54:\n\
+ movs r0, 0x5\n\
+ ldrsb r0, [r1, r0]\n\
+ cmp r0, 0x2\n\
+ bne _080BFC6C\n\
+ ldr r0, _080BFCB4 @ =gStringVar1\n\
+ ldr r1, _080BFCB8 @ =gOtherText_Mom\n\
+ bl StringCopy\n\
+ ldr r0, _080BFCBC @ =0x00004003\n\
+ movs r1, 0x1\n\
+ bl VarSet\n\
+_080BFC6C:\n\
+ ldr r4, _080BFCBC @ =0x00004003\n\
+ adds r0, r4, 0\n\
+ bl VarGet\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x1\n\
+ beq _080BFCAA\n\
+ adds r0, r4, 0\n\
+ bl VarGet\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x2\n\
+ beq _080BFCC0\n\
+ adds r0, r4, 0\n\
+ bl VarGet\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x2\n\
+ bls _080BFCD4\n\
+ adds r0, r4, 0\n\
+ bl VarGet\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080BFCC0\n\
+_080BFCAA:\n\
+ ldr r0, _080BFCB4 @ =gStringVar1\n\
+ ldr r1, _080BFCB8 @ =gOtherText_Mom\n\
+ bl StringCopy\n\
+ b _080BFD10\n\
+ .align 2, 0\n\
+_080BFCB4: .4byte gStringVar1\n\
+_080BFCB8: .4byte gOtherText_Mom\n\
+_080BFCBC: .4byte 0x00004003\n\
+_080BFCC0:\n\
+ ldr r0, _080BFCCC @ =gStringVar1\n\
+ ldr r1, _080BFCD0 @ =gOtherText_Dad\n\
+ bl StringCopy\n\
+ b _080BFD10\n\
+ .align 2, 0\n\
+_080BFCCC: .4byte gStringVar1\n\
+_080BFCD0: .4byte gOtherText_Dad\n\
+_080BFCD4:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080BFD00\n\
+ ldr r0, _080BFCF8 @ =gStringVar1\n\
+ ldr r1, _080BFCFC @ =gOtherText_Mom\n\
+ bl StringCopy\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x1\n\
+ bl VarSet\n\
+ b _080BFD10\n\
+ .align 2, 0\n\
+_080BFCF8: .4byte gStringVar1\n\
+_080BFCFC: .4byte gOtherText_Mom\n\
+_080BFD00:\n\
+ ldr r0, _080BFD18 @ =gStringVar1\n\
+ ldr r1, _080BFD1C @ =gOtherText_Dad\n\
+ bl StringCopy\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x2\n\
+ bl VarSet\n\
+_080BFD10:\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080BFD18: .4byte gStringVar1\n\
+_080BFD1C: .4byte gOtherText_Dad\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80BFD20(void)
+{
+ VarSet(VAR_0x40BC, 0);
+ RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
+}
+
+extern u8 ewram[];
+#define gUnknown_02007000 (*(struct ewramStruct_0207000 *)(ewram + 0x7000))
+extern u8 gUnknown_020387E4;
+
+struct ewramStruct_0207000 {
+ struct SaveTVStruct tvshows[4];
+};
+
+void sub_80BFE24(struct SaveTVStruct *arg0, struct SaveTVStruct *arg1, struct SaveTVStruct *arg2, struct SaveTVStruct *arg3);
+
+void sub_80C04A0(void);
+void sub_80C01D4(void);
+void sub_80C0408(void);
+
+void sub_80BFD44(u8 *arg0, u32 arg1, u8 arg2)
+{
+ u8 i;
+ struct ewramStruct_0207000 *ewramTVShows;
+ for (i=0; i<4; i++) {
+ memcpy(&gUnknown_02007000.tvshows[i], &arg0[i * arg1], sizeof(struct SaveTVStruct));
+ }
+ ewramTVShows = &gUnknown_02007000;
+ switch (arg2) {
+ case 0:
+ sub_80BFE24(&gSaveBlock1.tvShows, &ewramTVShows->tvshows[1], &ewramTVShows->tvshows[2], &ewramTVShows->tvshows[3]);
+ break;
+ case 1:
+ sub_80BFE24(&ewramTVShows->tvshows[0], &gSaveBlock1.tvShows, &ewramTVShows->tvshows[2], &ewramTVShows->tvshows[3]);
+ break;
+ case 2:
+ sub_80BFE24(&ewramTVShows->tvshows[0], &ewramTVShows->tvshows[1], &gSaveBlock1.tvShows, &ewramTVShows->tvshows[3]);
+ break;
+ case 3:
+ sub_80BFE24(&ewramTVShows->tvshows[0], &ewramTVShows->tvshows[1], &ewramTVShows->tvshows[2], &gSaveBlock1.tvShows);
+ break;
+ }
+ sub_80BF588(gSaveBlock1.tvShows.shows);
+ sub_80C04A0();
+ sub_80BF588(gSaveBlock1.tvShows.shows);
+ sub_80C01D4();
+ sub_80C0408();
+}
+
+extern u8 gUnknown_03000720;
+extern s8 gUnknown_03000722;
+s8 sub_80C019C(TVShow tvShows[]);
+bool8 sub_80BFF68(struct SaveTVStruct ** tv1, struct SaveTVStruct ** tv2, u8 idx);
+u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx);
+u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx);
+u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx);
+
+void sub_80BFE24(struct SaveTVStruct *arg0, struct SaveTVStruct *arg1, struct SaveTVStruct *arg2, struct SaveTVStruct *arg3)
+{
+ u8 i, j;
+ struct SaveTVStruct ** argslist[4];
+ argslist[0] = &arg0;
+ argslist[1] = &arg1;
+ argslist[2] = &arg2;
+ argslist[3] = &arg3;
+ gUnknown_03000720 = GetLinkPlayerCount();
+ while (1) {
+ for (i=0; i<gUnknown_03000720; i++) {
+ if (i == 0)
+ gUnknown_020387E4 = i;
+ gUnknown_03000722 = sub_80C019C(argslist[i][0]->shows);
+ if (gUnknown_03000722 == -1) {
+ gUnknown_020387E4++;
+ if (gUnknown_020387E4 == gUnknown_03000720)
+ return;
+ } else {
+ for (j=0; j<gUnknown_03000720-1; j++) {
+ gUnknown_03005D38.var0 = sub_80BF74C(argslist[(i + j + 1) % gUnknown_03000720][0]->shows);
+ if (gUnknown_03005D38.var0 != -1 && sub_80BFF68(argslist[(i + j + 1) % gUnknown_03000720], argslist[i], (i + j + 1) % gUnknown_03000720) == 1) {
+ break;
+ }
+ }
+ if (j == gUnknown_03000720 - 1) {
+ sub_80BF55C(argslist[i][0]->shows, gUnknown_03000722);
+ }
+ }
+ }
+ }
+}
+
+#ifdef NONMATCHING
+bool8 sub_80BFF68(struct SaveTVStruct ** arg1, struct SaveTVStruct ** arg2, u8 idx) {
+ u8 value;
+ u8 switchval;
+ struct SaveTVStruct *tv1;
+ struct SaveTVStruct *tv2;
+ tv1 = *arg1;
+ tv2 = *arg2;
+ value = FALSE;
+ switchval = sub_80BFB54(tv2->shows[gUnknown_03000722].common.var00);
+ switch (switchval) {
+ case 2:
+ value = sub_80C004C(&tv1->shows[gUnknown_03005D38.var0], &tv2->shows[gUnknown_03000722], idx);
+ break;
+ case 3:
+ value = sub_80C00B4(&tv1->shows[gUnknown_03005D38.var0], &tv2->shows[gUnknown_03000722], idx);
+ break;
+ case 4:
+ value = sub_80C0134(&tv1->shows[gUnknown_03005D38.var0], &tv2->shows[gUnknown_03000722], idx);
+ break;
+ }
+ if (value == TRUE) {
+ sub_80BF55C(tv2->shows, gUnknown_03000722);
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+#else
+__attribute__((naked))
+bool8 sub_80BFF68(struct SaveTVStruct ** arg1, struct SaveTVStruct ** arg2, u8 idx) {
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ sub sp, 0x4\n\
+ lsls r2, 24\n\
+ lsrs r7, r2, 24\n\
+ ldr r4, [r0]\n\
+ ldr r6, [r1]\n\
+ movs r5, 0\n\
+ ldr r2, _080BFFA4 @ =gUnknown_03000722\n\
+ movs r1, 0\n\
+ ldrsb r1, [r2, r1]\n\
+ lsls r0, r1, 3\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r6 @ this is the only mimsmatch\n\
+ ldrb r0, [r0]\n\
+ str r2, [sp]\n\
+ bl sub_80BFB54\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ adds r1, r0, 0\n\
+ ldr r2, [sp]\n\
+ cmp r0, 0x3\n\
+ beq _080BFFD8\n\
+ cmp r0, 0x3\n\
+ bgt _080BFFA8\n\
+ cmp r0, 0x2\n\
+ beq _080BFFAE\n\
+ b _080C0026\n\
+ .align 2, 0\n\
+_080BFFA4: .4byte gUnknown_03000722\n\
+_080BFFA8:\n\
+ cmp r1, 0x4\n\
+ beq _080C0000\n\
+ b _080C0026\n\
+_080BFFAE:\n\
+ ldr r0, _080BFFD4 @ =gUnknown_03005D38\n\
+ movs r1, 0\n\
+ ldrsb r1, [r0, r1]\n\
+ lsls r0, r1, 3\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r4, r0\n\
+ ldrb r2, [r2]\n\
+ lsls r2, 24\n\
+ asrs r2, 24\n\
+ lsls r1, r2, 3\n\
+ adds r1, r2\n\
+ lsls r1, 2\n\
+ adds r1, r6, r1\n\
+ adds r2, r7, 0\n\
+ bl sub_80C004C\n\
+ b _080C0022\n\
+ .align 2, 0\n\
+_080BFFD4: .4byte gUnknown_03005D38\n\
+_080BFFD8:\n\
+ ldr r0, _080BFFFC @ =gUnknown_03005D38\n\
+ movs r1, 0\n\
+ ldrsb r1, [r0, r1]\n\
+ lsls r0, r1, 3\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r4, r0\n\
+ ldrb r2, [r2]\n\
+ lsls r2, 24\n\
+ asrs r2, 24\n\
+ lsls r1, r2, 3\n\
+ adds r1, r2\n\
+ lsls r1, 2\n\
+ adds r1, r6, r1\n\
+ adds r2, r7, 0\n\
+ bl sub_80C00B4\n\
+ b _080C0022\n\
+ .align 2, 0\n\
+_080BFFFC: .4byte gUnknown_03005D38\n\
+_080C0000:\n\
+ ldr r0, _080C0030 @ =gUnknown_03005D38\n\
+ movs r1, 0\n\
+ ldrsb r1, [r0, r1]\n\
+ lsls r0, r1, 3\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r4, r0\n\
+ ldrb r2, [r2]\n\
+ lsls r2, 24\n\
+ asrs r2, 24\n\
+ lsls r1, r2, 3\n\
+ adds r1, r2\n\
+ lsls r1, 2\n\
+ adds r1, r6, r1\n\
+ adds r2, r7, 0\n\
+ bl sub_80C0134\n\
+_080C0022:\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+_080C0026:\n\
+ cmp r5, 0x1\n\
+ beq _080C0034\n\
+ movs r0, 0\n\
+ b _080C0040\n\
+ .align 2, 0\n\
+_080C0030: .4byte gUnknown_03005D38\n\
+_080C0034:\n\
+ ldr r0, _080C0048 @ =gUnknown_03000722\n\
+ ldrb r1, [r0]\n\
+ adds r0, r6, 0\n\
+ bl sub_80BF55C\n\
+ movs r0, 0x1\n\
+_080C0040:\n\
+ add sp, 0x4\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_080C0048: .4byte gUnknown_03000722\n\
+.syntax divided\n");
+}
+#endif
+
+u8 sub_80C004C(TVShow *tv1, TVShow *tv2, u8 idx) {
+ u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
+ if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) {
+ return FALSE;
+ }
+ tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo;
+ tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi;
+ tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF;
+ tv2->common.srcTrainerIdHi = linkTrainerId >> 8;
+ *tv1 = *tv2;
+ tv1->common.var01 = 1;
+ return TRUE;
+}
+
+u8 sub_80C00B4(TVShow *tv1, TVShow *tv2, u8 idx) {
+ u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
+ if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi) {
+ return FALSE;
+ }
+ if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) {
+ return FALSE;
+ }
+ tv2->common.srcTrainerIdLo = tv2->common.srcTrainerId2Lo;
+ tv2->common.srcTrainerIdHi = tv2->common.srcTrainerId2Hi;
+ tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF;
+ tv2->common.srcTrainerId2Hi = linkTrainerId >> 8;
+ *tv1 = *tv2;
+ tv1->common.var01 = 1;
+ return TRUE;
+}
+
+u8 sub_80C0134(TVShow *tv1, TVShow *tv2, u8 idx) {
+ u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
+ if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) {
+ return FALSE;
+ }
+ tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo;
+ tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi;
+ tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF;
+ tv2->common.srcTrainerIdHi = linkTrainerId >> 8;
+ *tv1 = *tv2;
+ tv1->common.var01 = 1;
+ tv1->common.var16[0] = 1;
+ return TRUE;
+}
+
+s8 sub_80C019C(TVShow tvShows[]) {
+ u8 i;
+ for (i=0; i<24; i++) {
+ if (tvShows[i].common.var01 == 0 && (u8)(tvShows[i].common.var00 - 1) < 60) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+void sub_80C03A8(u8 showidx);
+void sub_80C03C8(u16 species, u8 showidx);
+
+#ifdef NONMATCHING
+void sub_80C01D4(void) {
+ u8 i;
+ for (i=0; i<24; i++) {
+ switch (gSaveBlock1.tvShows.shows[i].common.var00) {
+ case 0:
+ break;
+ case TVSHOW_FAN_CLUB_LETTER:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].fanclubLetter.species, i);
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].fanclubOpinions.var02, i);
+ break;
+ case TVSHOW_UNKN_SHOWTYPE_04:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].worldOfMasters.var06, i);
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].nameRaterShow.species, i);
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].nameRaterShow.var1C, i);
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].bravoTrainer.species, i);
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].bravoTrainerTower.var0a, i);
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].bravoTrainerTower.var14, i);
+ break;
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].pokemonToday.species, i);
+ break;
+ case TVSHOW_SMART_SHOPPER:
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].pokemonTodayFailed.species, i);
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].pokemonTodayFailed.species2, i);
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].pokemonAngler.var04, i);
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].worldOfMasters.var08, i);
+ sub_80C03C8(gSaveBlock1.tvShows.shows[i].worldOfMasters.var04, i);
+ break;
+ case TVSHOW_MASS_OUTBREAK:
+ break;
+ default:
+ sub_80C03A8(i);
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80C01D4(void) {
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ movs r6, 0\n\
+_080C01D8:\n\
+ ldr r0, _080C01F8 @ =gSaveBlock1\n\
+ lsls r2, r6, 3\n\
+ adds r1, r2, r6\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ ldr r0, _080C01FC @ =0x00002738\n\
+ adds r1, r0\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x29\n\
+ bls _080C01EE\n\
+ b _default\n\
+_080C01EE:\n\
+ lsls r0, 2\n\
+ ldr r1, _080C0200 @ =_080C0204\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_080C01F8: .4byte gSaveBlock1\n\
+_080C01FC: .4byte 0x00002738\n\
+_080C0200: .4byte _080C0204\n\
+ .align 2, 0\n\
+_080C0204:\n\
+ .4byte _break\n\
+ .4byte _fanclubLetter @ TVSHOW_FAN_CLUB_LETTER\n\
+ .4byte _break @ TVSHOW_RECENT_HAPPENINGS\n\
+ .4byte _fanclubOpinions @ TVSHOW_PKMN_FAN_CLUB_OPINIONS\n\
+ .4byte _showtype4 @ TVSHOW_UNKN_SHOWTYPE_04\n\
+ .4byte _nameRater @ TVSHOW_NAME_RATER_SHOW\n\
+ .4byte _bravoTrainerContest @ TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE\n\
+ .4byte _bravoTrainerTower @ TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _pokemonTodayS @ TVSHOW_POKEMON_TODAY_CAUGHT\n\
+ .4byte _break @ TVSHOW_SMART_SHOPPER\n\
+ .4byte _pokemonTodayF @ TVSHOW_POKEMON_TODAY_FAILED\n\
+ .4byte _fishing @ TVSHOW_FISHING_ADVICE\n\
+ .4byte _worldOfMasters @ TVSHOW_WORLD_OF_MASTERS\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _default\n\
+ .4byte _break @ TVSHOW_MASS_OUTBREAK\n\
+_fanclubLetter:\n\
+ adds r0, r2, r6\n\
+ lsls r0, 2\n\
+ ldr r1, _080C02B8 @ =gSaveBlock1 + 0x2738\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x2]\n\
+ b _checkSpecies1 @ sub_80C03C8(r0, i)\n\
+ .align 2, 0\n\
+_080C02B8: .4byte gSaveBlock1 + 0x2738\n\
+_fanclubOpinions:\n\
+ adds r0, r2, r6\n\
+ lsls r0, 2\n\
+ ldr r1, _080C02C8 @ =gSaveBlock1 + 0x2738\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x2]\n\
+ b _checkSpecies1 @ sub_80C03C8(r0, i)\n\
+ .align 2, 0\n\
+_080C02C8: .4byte gSaveBlock1 + 0x2738\n\
+_showtype4:\n\
+ adds r0, r2, r6\n\
+ lsls r0, 2\n\
+ ldr r1, _080C02D8 @ =gSaveBlock1 + 0x2738\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x6]\n\
+ b _checkSpecies1 @ sub_80C03C8(r0, i)\n\
+ .align 2, 0\n\
+_080C02D8: .4byte gSaveBlock1 + 0x2738\n\
+_nameRater:\n\
+ adds r4, r2, r6\n\
+ lsls r4, 2\n\
+ ldr r0, _080C02F4 @ =gSaveBlock1 + 0x2738\n\
+ adds r4, r0\n\
+ ldrh r0, [r4, 0x2]\n\
+ lsls r5, r6, 24\n\
+ lsrs r5, 24\n\
+ adds r1, r5, 0\n\
+ bl sub_80C03C8\n\
+ ldrh r0, [r4, 0x1C]\n\
+ b _checkSpecies2 @ sub_80C03C8(r0, i)\n\
+ .align 2, 0\n\
+_080C02F4: .4byte gSaveBlock1 + 0x2738\n\
+_bravoTrainerContest:\n\
+ adds r0, r2, r6\n\
+ lsls r0, 2\n\
+ ldr r1, _080C0304 @ =gSaveBlock1 + 0x2738\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x2]\n\
+ b _checkSpecies1 @ sub_80C03C8(r0, i)\n\
+ .align 2, 0\n\
+_080C0304: .4byte gSaveBlock1 + 0x2738\n\
+_bravoTrainerTower:\n\
+ adds r4, r2, r6\n\
+ lsls r4, 2\n\
+ ldr r0, _080C0320 @ =gSaveBlock1 + 0x2738\n\
+ adds r4, r0\n\
+ ldrh r0, [r4, 0xA]\n\
+ lsls r5, r6, 24\n\
+ lsrs r5, 24\n\
+ adds r1, r5, 0\n\
+ bl sub_80C03C8\n\
+ ldrh r0, [r4, 0x14]\n\
+ b _checkSpecies2 @ sub_80C03C8(r0, i)\n\
+ .align 2, 0\n\
+_080C0320: .4byte gSaveBlock1 + 0x2738\n\
+_pokemonTodayS:\n\
+ adds r0, r2, r6\n\
+ lsls r0, 2\n\
+ ldr r1, _080C0330 @ =gSaveBlock1 + 0x2738\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x10]\n\
+ b _checkSpecies1 @ sub_80C03C8(r0, i)\n\
+ .align 2, 0\n\
+_080C0330: .4byte gSaveBlock1 + 0x2738\n\
+_pokemonTodayF:\n\
+ adds r4, r2, r6\n\
+ lsls r4, 2\n\
+ ldr r0, _080C034C @ =gSaveBlock1 + 0x2738\n\
+ adds r4, r0\n\
+ ldrh r0, [r4, 0xC]\n\
+ lsls r5, r6, 24\n\
+ lsrs r5, 24\n\
+ adds r1, r5, 0\n\
+ bl sub_80C03C8\n\
+ ldrh r0, [r4, 0xE]\n\
+ b _checkSpecies2 @ sub_80C03C8(r0, i)\n\
+ .align 2, 0\n\
+_080C034C: .4byte gSaveBlock1 + 0x2738\n\
+_fishing:\n\
+ adds r0, r2, r6\n\
+ lsls r0, 2\n\
+ ldr r1, _080C0364 @ =gSaveBlock1 + 0x2738\n\
+ adds r0, r1\n\
+ ldrh r0, [r0, 0x4]\n\
+_checkSpecies1:\n\
+ lsls r1, r6, 24\n\
+ lsrs r1, 24\n\
+ bl sub_80C03C8\n\
+ b _break\n\
+ .align 2, 0\n\
+_080C0364: .4byte gSaveBlock1 + 0x2738\n\
+_worldOfMasters:\n\
+ adds r4, r2, r6\n\
+ lsls r4, 2\n\
+ ldr r0, _080C0388 @ =gSaveBlock1 + 0x2738\n\
+ adds r4, r0\n\
+ ldrh r0, [r4, 0x8]\n\
+ lsls r5, r6, 24\n\
+ lsrs r5, 24\n\
+ adds r1, r5, 0\n\
+ bl sub_80C03C8\n\
+ ldrh r0, [r4, 0x4]\n\
+_checkSpecies2:\n\
+ adds r1, r5, 0\n\
+ bl sub_80C03C8\n\
+ b _break\n\
+ .align 2, 0\n\
+_080C0388: .4byte gSaveBlock1 + 0x2738\n\
+_default:\n\
+ lsls r0, r6, 24\n\
+ lsrs r0, 24\n\
+ bl sub_80C03A8\n\
+_break:\n\
+ adds r0, r6, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+ cmp r6, 0x17\n\
+ bhi _080C03A0\n\
+ b _080C01D8\n\
+_080C03A0:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80C03A8(u8 showidx) {
+ gSaveBlock1.tvShows.shows[showidx].common.var01 = 0;
+}
+
+void sub_80C03C8(u16 species, u8 showidx) {
+ if (GetNationalPokedexFlag(SpeciesToNationalPokedexNum(species), 0) == 0) {
+ gSaveBlock1.tvShows.shows[showidx].common.var01 = 0;
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80C0408(void) {
+ u16 i;
+ if (FlagGet(SYS_GAME_CLEAR) != 1) {
+ for (i=0; i<24; i++) {
+ if (gSaveBlock1.tvShows.shows[i].common.var00 == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE || gSaveBlock1.tvShows.shows[i].common.var00 == TVSHOW_MASS_OUTBREAK) {
+ gSaveBlock1.tvShows.shows[i].common.var01 = 0;
+ }
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80C0408(void) {
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ ldr r0, _080C044C @ =0x00000804\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ beq _080C0444\n\
+ movs r2, 0\n\
+ ldr r6, _080C0450 @ =gSaveBlock1\n\
+ ldr r4, _080C0454 @ =0x00002739\n\
+ movs r3, 0\n\
+ ldr r5, _080C0458 @ =0x00002738\n\
+_080C0422:\n\
+ lsls r0, r2, 3\n\
+ adds r0, r2\n\
+ lsls r0, 2\n\
+ adds r1, r0, r6\n\
+ adds r0, r1, r5\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x7\n\
+ beq _080C0436\n\
+ cmp r0, 0x29\n\
+ bne _080C043A\n\
+_080C0436:\n\
+ adds r0, r1, r4\n\
+ strb r3, [r0]\n\
+_080C043A:\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r2, r0, 16\n\
+ cmp r2, 0x17\n\
+ bls _080C0422\n\
+_080C0444:\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080C044C: .4byte 0x00000804\n\
+_080C0450: .4byte gSaveBlock1\n\
+_080C0454: .4byte 0x00002739\n\
+_080C0458: .4byte 0x00002738\n\
+.syntax divided\n");
+}
+#endif
+
+void sub_80C045C(void) {
+ u8 i;
+ for (i=0; i<5; i++) {
+ if (sub_80BFB54(gSaveBlock1.tvShows.shows[i].common.var00) == 2) {
+ gSaveBlock1.tvShows.shows[i].common.var01 = 0;
+ }
+ }
+}
+
+asm(".section .dotvshow\n");
+
+void DoTVShowPokemonFanClubLetter(void);
+void DoTVShowRecentHappenings(void);
+void DoTVShowPokemonFanClubOpinions(void);
+void nullsub_22(void);
+void DoTVShowPokemonNewsMassOutbreak(void);
+void DoTVShowBravoTrainerPokemonProfile(void);
+void DoTVShowBravoTrainerBattleTowerProfile(void);
+void DoTVShowPokemonTodaySuccessfulCapture(void);
+void DoTVShowTodaysSmartShopper(void);
+void DoTVShowTheNameRaterShow(void);
+void DoTVShowPokemonTodayFailedCapture(void);
+void DoTVShowPokemonAngler(void);
+void DoTVShowTheWorldOfMasters(void);
+
+bool8 sub_80C06E8(struct UnknownSaveStruct2ABC *arg0, struct UnknownSaveStruct2ABC *arg1, s8 arg2);
+
+void sub_80C06BC(int *arg0, int *arg1) {
+ struct UnknownSaveStruct2ABC *str0;
+ struct UnknownSaveStruct2ABC *str1;
+ str0 = (void *)arg0[0];
+ str1 = (void *)arg1[0];
+ str1 += gUnknown_03000722;
+ sub_80C06E8(str0, str1, gUnknown_03005D38.var0);
+}
+
+bool8 sub_80C06E8(struct UnknownSaveStruct2ABC *arg0, struct UnknownSaveStruct2ABC *arg1, s8 arg2) {
+ u8 i;
+ if (arg1->val0 == 0) {
+ return FALSE;
+ }
+ for (i=0; i<16; i++) {
+ if (arg0[i].val0 == arg1->val0) {
+ return FALSE;
+ }
+ }
+ arg0[arg2].val0 = arg1->val0;
+ arg0[arg2].val1 = 1;
+ arg0[arg2].val2 = arg1->val2;
+ return TRUE;
+}
+
+s8 sub_80C0730(struct UnknownSaveStruct2ABC *arg0, u8 arg1) {
+ if (arg0[arg1].val0 == 0) {
+ return -1;
+ }
+ return arg1;
+}
+
+void sub_80C0750(void) {
+ u8 i;
+ for (i=0; i<16; i++) {
+ if (gSaveBlock1.unknown_2ABC[i].val0 > 3) {
+ sub_80BEC10(i);
+ }
+ }
+ sub_80BEC40();
+}
+
+void sub_80C0788(void) {
+ u8 i;
+ if (FlagGet(SYS_GAME_CLEAR) != 1) {
+ for (i=0; i<16; i++) {
+ gSaveBlock1.unknown_2ABC[i].val1 = 0;
+ }
+ }
+}
+
+void DoTVShow(void) {
+ if (gSaveBlock1.tvShows.shows[gSpecialVar_0x8004].common.var01 != 0) {
+ switch (gSaveBlock1.tvShows.shows[gSpecialVar_0x8004].common.var00) {
+ case TVSHOW_FAN_CLUB_LETTER:
+ DoTVShowPokemonFanClubLetter();
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ DoTVShowRecentHappenings();
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ DoTVShowPokemonFanClubOpinions();
+ break;
+ case TVSHOW_UNKN_SHOWTYPE_04:
+ nullsub_22();
+ break;
+ case TVSHOW_MASS_OUTBREAK:
+ DoTVShowPokemonNewsMassOutbreak();
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ DoTVShowBravoTrainerPokemonProfile();
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ DoTVShowBravoTrainerBattleTowerProfile();
+ break;
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ DoTVShowPokemonTodaySuccessfulCapture();
+ break;
+ case TVSHOW_SMART_SHOPPER:
+ DoTVShowTodaysSmartShopper();
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ DoTVShowTheNameRaterShow();
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ DoTVShowPokemonTodayFailedCapture();
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ DoTVShowPokemonAngler();
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ DoTVShowTheWorldOfMasters();
+ break;
+ }
+ }
+}
+
+void TVShowConvertInternationalString(u8 *dest, u8 *src, u8 language) {
+ StringCopy(dest, src);
+ if (language < LANGUAGE_ENGLISH) {
+ ConvertInternationalString(dest, LANGUAGE_JAPANESE);
+ }
+}
+
asm(".section .text_c");
+void TVShowConvertInternationalString(u8 *, u8 *, u8);
+
+void TakeTVShowInSearchOfTrainersOffTheAir(void);
+
+void DoTVShowTheNameRaterShow(void) {
+ TVShow *tvShow;
+ u8 switchval;
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
+ gScriptResult = 0;
+ switchval = gUnknown_020387E8;
+ switch (switchval) {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->nameRaterShow.species]);
+ TVShowConvertInternationalString(gStringVar3, tvShow->nameRaterShow.pokemonName, tvShow->nameRaterShow.pokemonNameLanguage);
+ gUnknown_020387E8 = sub_80BF7E8(&tvShow->nameRaterShow) + 1;
+ break;
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (tvShow->nameRaterShow.random == 0) {
+ gUnknown_020387E8 = 9;
+ } else if (tvShow->nameRaterShow.random == 1) {
+ gUnknown_020387E8 = 10;
+ } else if (tvShow->nameRaterShow.random == 2) {
+ gUnknown_020387E8 = 11;
+ }
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language);
+ if (tvShow->nameRaterShow.random == 0) {
+ gUnknown_020387E8 = 9;
+ } else if (tvShow->nameRaterShow.random == 1) {
+ gUnknown_020387E8 = 10;
+ } else if (tvShow->nameRaterShow.random == 2) {
+ gUnknown_020387E8 = 11;
+ }
+ break;
+ case 9:
+ case 10:
+ case 11:
+ sub_80BF820(0, 1, 0, 1, 0, &tvShow->nameRaterShow);
+ TVShowConvertInternationalString(gStringVar3, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage);
+ sub_80BF820(0, 0, 0, 1, 0, &tvShow->nameRaterShow);
+ TVShowConvertInternationalString(gStringVar2, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage);
+ TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.pokemonName, tvShow->nameRaterShow.pokemonNameLanguage);
+ gUnknown_020387E8 = 12;
+ break;
+ case 13:
+ sub_80BF820(0, 0, 3, 1, 0, &tvShow->nameRaterShow);
+ TVShowConvertInternationalString(gStringVar3, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage);
+ sub_80BF820(0, 0, 2, 0, 0, &tvShow->nameRaterShow);
+ TVShowConvertInternationalString(gStringVar2, gStringVar1, tvShow->nameRaterShow.language);
+ TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language);
+ gUnknown_020387E8 = 14;
+ break;
+ case 14:
+ sub_80BF820(0, 0, 3, 0, 0, &tvShow->nameRaterShow);
+ TVShowConvertInternationalString(gStringVar3, gStringVar1, tvShow->nameRaterShow.language);
+ sub_80BF820(0, 0, 2, 1, 0, &tvShow->nameRaterShow);
+ TVShowConvertInternationalString(gStringVar2, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage);
+ TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language);
+ gUnknown_020387E8 = 18;
+ break;
+ case 15:
+ sub_80BF820(1, 0, 2, 1, 0, &tvShow->nameRaterShow);
+ TVShowConvertInternationalString(gStringVar1, gStringVar2, tvShow->nameRaterShow.pokemonNameLanguage);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->nameRaterShow.species]);
+ sub_80BF820(2, 0, 3, 2, tvShow->nameRaterShow.species, &tvShow->nameRaterShow);
+ gUnknown_020387E8 = 16;
+ break;
+ case 16:
+ sub_80BF820(0, 0, 3, 1, 0, &tvShow->nameRaterShow);
+ TVShowConvertInternationalString(gStringVar3, gStringVar1, tvShow->nameRaterShow.pokemonNameLanguage);
+ sub_80BF820(0, 0, 2, 2, tvShow->nameRaterShow.species, &tvShow->nameRaterShow);
+ gUnknown_020387E8 = 17;
+ break;
+ case 17:
+ sub_80BF820(1, 0, 2, 1, 0, &tvShow->nameRaterShow);
+ TVShowConvertInternationalString(gStringVar1, gStringVar2, tvShow->nameRaterShow.pokemonNameLanguage);
+ sub_80BF820(2, 0, 3, 2, tvShow->nameRaterShow.var1C, &tvShow->nameRaterShow);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->nameRaterShow.var1C]);
+ gUnknown_020387E8 = 18;
+ break;
+ case 12:
+ switchval = 18;
+ gUnknown_020387E8 = 18;
+ case 18:
+ TVShowConvertInternationalString(gStringVar1, tvShow->nameRaterShow.pokemonName, tvShow->nameRaterShow.pokemonNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, tvShow->nameRaterShow.trainerName, tvShow->nameRaterShow.language);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(gTVNameRaterTextGroup[switchval]);
+}
+
+void DoTVShowPokemonTodaySuccessfulCapture(void) {
+ TVShow *tvShow;
+ u8 switchval;
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
+ gScriptResult = 0;
+ switchval = gUnknown_020387E8;
+ switch (switchval) {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonToday.playerName, tvShow->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar3, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2);
+ if (tvShow->pokemonToday.ball == ITEM_MASTER_BALL) {
+ gUnknown_020387E8 = 5;
+ } else {
+ gUnknown_020387E8 = 1;
+ }
+ break;
+ case 1:
+ gUnknown_020387E8 = 2;
+ break;
+ case 2:
+ StringCopy(gStringVar2, ItemId_GetItem(tvShow->pokemonToday.ball)->name);
+ sub_80BF088(2, tvShow->pokemonToday.var12);
+ if (tvShow->pokemonToday.var12 < 4) {
+ gUnknown_020387E8 = 3;
+ } else {
+ gUnknown_020387E8 = 4;
+ }
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonToday.playerName, tvShow->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar3, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2);
+ gUnknown_020387E8 = 6;
+ break;
+ case 4:
+ gUnknown_020387E8 = 6;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonToday.playerName, tvShow->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonToday.species]);
+ gUnknown_020387E8 = 6;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonToday.playerName, tvShow->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar3, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2);
+ gUnknown_020387E8 += (Random() % 4) + 1;
+ break;
+ case 7:
+ case 8:
+ StringCopy(gStringVar1, gSpeciesNames[tvShow->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar2, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2);
+ sub_80BF638(2, tvShow->pokemonToday.species);
+ gUnknown_020387E8 = 11;
+ break;
+ case 9:
+ case 10:
+ StringCopy(gStringVar1, gSpeciesNames[tvShow->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar2, tvShow->pokemonToday.nickname, tvShow->pokemonToday.language2);
+ gUnknown_020387E8 = 11;
+ break;
+ case 11:
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(gTVPokemonTodayTextGroup[switchval]);
+}
+
+void DoTVShowPokemonTodayFailedCapture(void) {
+ TVShow *tvShow;
+ u8 switchval;
+ u16 rval;
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
+ gScriptResult = 0;
+ switchval = gUnknown_020387E8;
+ switch (switchval) {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonTodayFailed.playerName, tvShow->pokemonTodayFailed.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonTodayFailed.species]);
+ gUnknown_020387E8 = 1;
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonTodayFailed.playerName, tvShow->pokemonTodayFailed.language);
+ sub_80FBFB4(gStringVar2, tvShow->pokemonTodayFailed.var12, 0);
+ StringCopy(gStringVar3, gSpeciesNames[tvShow->pokemonTodayFailed.species2]);
+ if (tvShow->pokemonTodayFailed.var11 == 1) {
+ gUnknown_020387E8 = 3;
+ } else {
+ gUnknown_020387E8 = 2;
+ }
+ break;
+ case 2:
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonTodayFailed.playerName, tvShow->pokemonTodayFailed.language);
+ sub_80BF088(1, tvShow->pokemonTodayFailed.var10);
+ rval = (Random() % 3);
+ if (rval == 0) {
+ gUnknown_020387E8 = 5;
+ } else {
+ gUnknown_020387E8 = 4;
+ }
+ break;
+ case 4:
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonTodayFailed.playerName, tvShow->pokemonTodayFailed.language);
+ gUnknown_020387E8 = 6;
+ break;
+ case 6:
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(gTVPokemonTodayFailedCaptureTextGroup[switchval]);
+}
+
+void DoTVShowPokemonFanClubLetter(void) {
+ TVShow *tvShow;
+ u8 switchval;
+ u16 rval;
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
+ gScriptResult = 0;
+ switchval = gUnknown_020387E8;
+ switch (switchval) {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, tvShow->fanclubLetter.playerName, tvShow->fanclubLetter.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->fanclubLetter.species]);
+ gUnknown_020387E8 = 50;
+ break;
+ case 1:
+ rval = (Random() % 4) + 1;
+ if (rval == 1) {
+ gUnknown_020387E8 = 2;
+ } else {
+ gUnknown_020387E8 = rval + 2;
+ }
+ break;
+ case 2:
+ gUnknown_020387E8 = 51;
+ break;
+ case 3:
+ gUnknown_020387E8 += (Random() % 3) + 1;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ sub_80BF79C(tvShow);
+ gUnknown_020387E8 = 7;
+ break;
+ case 7:
+ rval = (Random() % 0x1f) + 0x46;
+ sub_80BF088(2, rval);
+ TVShowDone();
+ break;
+ case 50:
+ ConvertEasyChatWordsToString(gStringVar4, tvShow->fanclubLetter.pad04, 2, 2);
+ ShowFieldMessage(gStringVar4);
+ gUnknown_020387E8 = 1;
+ return;
+ case 51:
+ ConvertEasyChatWordsToString(gStringVar4, tvShow->fanclubLetter.pad04, 2, 2);
+ ShowFieldMessage(gStringVar4);
+ gUnknown_020387E8 = 3;
+ return;
+ }
+ ShowFieldMessage(gTVFanClubTextGroup[switchval]);
+}
+
+void DoTVShowRecentHappenings(void) {
+ TVShow *tvShow;
+ u8 switchval;
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
+ gScriptResult = 0;
+ switchval = gUnknown_020387E8;
+ switch (switchval) {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, tvShow->recentHappenings.playerName, tvShow->recentHappenings.language);
+ sub_80BF79C(tvShow);
+ gUnknown_020387E8 = 50;
+ break;
+ case 1:
+ gUnknown_020387E8 += 1 + (Random() % 3);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ gUnknown_020387E8 = 5;
+ break;
+ case 5:
+ TVShowDone();
+ break;
+ case 50:
+ ConvertEasyChatWordsToString(gStringVar4, tvShow->recentHappenings.var04, 2, 2);
+ ShowFieldMessage(gStringVar4);
+ gUnknown_020387E8 = 1;
+ return;
+ }
+ ShowFieldMessage(gTVRecentHappeningsTextGroup[switchval]);
+}
+
+void DoTVShowPokemonFanClubOpinions(void) {
+ TVShow *tvShow;
+ u8 switchval;
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
+ gScriptResult = 0;
+ switchval = gUnknown_020387E8;
+ switch (switchval) {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, tvShow->fanclubOpinions.playerName, tvShow->fanclubOpinions.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->fanclubOpinions.var02]);
+ TVShowConvertInternationalString(gStringVar3, tvShow->fanclubOpinions.var10, tvShow->fanclubOpinions.var0E);
+ gUnknown_020387E8 = tvShow->fanclubOpinions.var04B + 1;
+ break;
+ case 1:
+ case 2:
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, tvShow->fanclubOpinions.playerName, tvShow->fanclubOpinions.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->fanclubOpinions.var02]);
+ sub_80EB3FC(gStringVar3, tvShow->fanclubOpinions.var1C[0]);
+ gUnknown_020387E8 = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, tvShow->fanclubOpinions.playerName, tvShow->fanclubOpinions.language);
+ sub_80EB3FC(gStringVar3, tvShow->fanclubOpinions.var1C[1]);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(gTVFanClubOpinionsTextGroup[switchval]);
+}
+
+void nullsub_22(void) {
+
+}
+
void DoTVShowPokemonNewsMassOutbreak(void)
{
TVShow *tvShow;
- tvShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004];
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
sub_80FBFB4(gStringVar1, tvShow->massOutbreak.locationMapNum, 0);
@@ -300,14 +2907,122 @@ void DoTVShowPokemonNewsMassOutbreak(void)
ShowFieldMessage(gTVPokemonOutbreakTextGroup[gUnknown_020387E8]);
}
-asm(".section .text_d");
+void DoTVShowInSearchOfTrainers(void) {
+ u8 switchval;
+ gScriptResult = 0;
+ switchval = gUnknown_020387E8;
+ switch (switchval) {
+ case 0:
+ sub_80FBFB4(gStringVar1, gSaveBlock1.gabbyAndTyData.mapnum, 0);
+ if (gSaveBlock1.gabbyAndTyData.val9 > 1) {
+ gUnknown_020387E8 = 1;
+ } else {
+ gUnknown_020387E8 = 2;
+ }
+ break;
+ case 1:
+ gUnknown_020387E8 = 2;
+ break;
+ case 2:
+ if (gSaveBlock1.gabbyAndTyData.valA_0 == 0) {
+ gUnknown_020387E8 = 4;
+ } else if (gSaveBlock1.gabbyAndTyData.valA_3 != 0) {
+ gUnknown_020387E8 = 5;
+ } else if (gSaveBlock1.gabbyAndTyData.valA_2 != 0) {
+ gUnknown_020387E8 = 6;
+ } else if (gSaveBlock1.gabbyAndTyData.valA_1 != 0) {
+ gUnknown_020387E8 = 7;
+ } else {
+ gUnknown_020387E8 = 3;
+ }
+ break;
+ case 3:
+ StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]);
+ StringCopy(gStringVar2, gMoveNames[gSaveBlock1.gabbyAndTyData.move1]);
+ StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]);
+ gUnknown_020387E8 = 8;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ gUnknown_020387E8 = 8;
+ break;
+ case 8:
+ sub_80EB3FC(gStringVar1, gSaveBlock1.gabbyAndTyData.move2);
+ StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon1]);
+ StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1.gabbyAndTyData.mon2]);
+ gScriptResult = 1;
+ gUnknown_020387E8 = 0;;
+ TakeTVShowInSearchOfTrainersOffTheAir();
+ break;
+ }
+ ShowFieldMessage(gTVGabbyAndTyTextGroup[switchval]);
+}
+
+void DoTVShowPokemonAngler(void) {
+ TVShow *tvShow;
+ u8 switchval;
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
+ gScriptResult = 0;
+ if (tvShow->pokemonAngler.var02 < tvShow->pokemonAngler.var03) {
+ gUnknown_020387E8 = 0;
+ } else {
+ gUnknown_020387E8 = 1;
+ }
+ switchval = gUnknown_020387E8;
+ switch (switchval) {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonAngler.playerName, tvShow->pokemonAngler.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonAngler.var04]);
+ sub_80BF088(2, tvShow->pokemonAngler.var03);
+ TVShowDone();
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, tvShow->pokemonAngler.playerName, tvShow->pokemonAngler.language);
+ StringCopy(gStringVar2, gSpeciesNames[tvShow->pokemonAngler.var04]);
+ sub_80BF088(2, tvShow->pokemonAngler.var02);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(gTVFishingGuruAdviceTextGroup[switchval]);
+}
+
+void DoTVShowTheWorldOfMasters(void) {
+ TVShow *tvShow;
+ u8 switchval;
+ tvShow = &gSaveBlock1.tvShows.shows[gSpecialVar_0x8004];
+ gScriptResult = 0;
+ switchval = gUnknown_020387E8;
+ switch (switchval) {
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, tvShow->worldOfMasters.playerName,
+ tvShow->worldOfMasters.language);
+ sub_80BF088(1, tvShow->worldOfMasters.var06);
+ sub_80BF088(2, tvShow->worldOfMasters.var02);
+ gUnknown_020387E8 = 1;
+ break;
+ case 1:
+ StringCopy(gStringVar1, gSpeciesNames[tvShow->worldOfMasters.var08]);
+ gUnknown_020387E8 = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, tvShow->worldOfMasters.playerName,
+ tvShow->worldOfMasters.language);
+ sub_80FBFB4(gStringVar2, tvShow->worldOfMasters.var0a, 0);
+ StringCopy(gStringVar3, gSpeciesNames[tvShow->worldOfMasters.var04]);
+ TVShowDone();
+ break;
+ }
+ ShowFieldMessage(gTVWorldOfMastersTextGroup[switchval]);
+}
void TVShowDone(void)
{
gScriptResult = 1;
gUnknown_020387E8 = 0;
- gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 = 0;
+ gSaveBlock1.tvShows.shows[gSpecialVar_0x8004].common.var01 = 0;
}
void sub_80C2014(void)
diff --git a/src/wallclock.c b/src/wallclock.c
index dafb37442..d55d14edb 100644
--- a/src/wallclock.c
+++ b/src/wallclock.c
@@ -8,6 +8,7 @@
#include "rtc.h"
#include "songs.h"
#include "sound.h"
+#include "strings2.h"
#include "task.h"
#include "trig.h"
@@ -15,7 +16,6 @@ extern u16 gSpecialVar_0x8004;
extern u8 gMiscClock_Gfx[];
extern u8 gUnknown_08E95774[];
extern u8 gUnknown_08E954B0[];
-extern u8 gOtherText_CorrectTimePrompt[];
extern const struct MenuAction gMenuYesNoItems[];
extern u16 gMiscClockMale_Pal[];
extern u16 gMiscClockFemale_Pal[];
@@ -428,17 +428,17 @@ static void Task_SetClock4(u8 taskId)
{
switch (ProcessMenuInputNoWrap_())
{
- case 0: //YES
- PlaySE(SE_SELECT);
- gTasks[taskId].func = Task_SetClock5; //Move on
- return;
- case -1: //B button
- case 1: //NO
- HandleDestroyMenuCursors();
- PlaySE(SE_SELECT);
- MenuZeroFillWindowRect(23, 8, 29, 13);
- MenuZeroFillWindowRect(2, 16, 27, 19);
- gTasks[taskId].func = Task_SetClock2; //Go back and let player adjust clock
+ case 0: //YES
+ PlaySE(SE_SELECT);
+ gTasks[taskId].func = Task_SetClock5; //Move on
+ return;
+ case -1: //B button
+ case 1: //NO
+ HandleDestroyMenuCursors();
+ PlaySE(SE_SELECT);
+ MenuZeroFillWindowRect(23, 8, 29, 13);
+ MenuZeroFillWindowRect(2, 16, 27, 19);
+ gTasks[taskId].func = Task_SetClock2; //Go back and let player adjust clock
}
}
@@ -501,18 +501,18 @@ static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed)
switch (direction)
{
- case MVMT_BACKWARD:
- if (angle)
- angle = angle - delta;
- else
- angle = 360 - delta;
- break;
- case MVMT_FORWARD:
- if (angle < 360 - delta)
- angle = angle + delta;
- else
- angle = 0;
- break;
+ case MVMT_BACKWARD:
+ if (angle)
+ angle = angle - delta;
+ else
+ angle = 360 - delta;
+ break;
+ case MVMT_FORWARD:
+ if (angle < 360 - delta)
+ angle = angle + delta;
+ else
+ angle = 0;
+ break;
}
return angle;
}
@@ -522,32 +522,32 @@ static u8 AdvanceClock(u8 taskId, u8 direction)
{
switch (direction)
{
- case MVMT_BACKWARD:
- if (gTasks[taskId].tMinutes > 0)
- gTasks[taskId].tMinutes--;
+ case MVMT_BACKWARD:
+ if (gTasks[taskId].tMinutes > 0)
+ gTasks[taskId].tMinutes--;
+ else
+ {
+ gTasks[taskId].tMinutes = 59;
+ if (gTasks[taskId].tHours > 0)
+ gTasks[taskId].tHours--;
else
- {
- gTasks[taskId].tMinutes = 59;
- if (gTasks[taskId].tHours > 0)
- gTasks[taskId].tHours--;
- else
- gTasks[taskId].tHours = 23;
- UpdateClockPeriod(taskId, direction);
- }
- break;
- case MVMT_FORWARD:
- if (gTasks[taskId].tMinutes < 59)
- gTasks[taskId].tMinutes++;
+ gTasks[taskId].tHours = 23;
+ UpdateClockPeriod(taskId, direction);
+ }
+ break;
+ case MVMT_FORWARD:
+ if (gTasks[taskId].tMinutes < 59)
+ gTasks[taskId].tMinutes++;
+ else
+ {
+ gTasks[taskId].tMinutes = 0;
+ if (gTasks[taskId].tHours < 23)
+ gTasks[taskId].tHours++;
else
- {
- gTasks[taskId].tMinutes = 0;
- if (gTasks[taskId].tHours < 23)
- gTasks[taskId].tHours++;
- else
- gTasks[taskId].tHours = 0;
- UpdateClockPeriod(taskId, direction);
- }
- break;
+ gTasks[taskId].tHours = 0;
+ UpdateClockPeriod(taskId, direction);
+ }
+ break;
}
return 0;
}
@@ -559,28 +559,28 @@ static void UpdateClockPeriod(u8 taskId, u8 direction)
switch (direction)
{
- case MVMT_BACKWARD:
- switch (hours)
- {
- case 11:
- gTasks[taskId].tPeriod = PERIOD_AM;
- break;
- case 23:
- gTasks[taskId].tPeriod = PERIOD_PM;
- break;
- }
+ case MVMT_BACKWARD:
+ switch (hours)
+ {
+ case 11:
+ gTasks[taskId].tPeriod = PERIOD_AM;
break;
- case MVMT_FORWARD:
- switch (hours)
- {
- case 0:
- gTasks[taskId].tPeriod = PERIOD_AM;
- break;
- case 12:
- gTasks[taskId].tPeriod = PERIOD_PM;
- break;
- }
+ case 23:
+ gTasks[taskId].tPeriod = PERIOD_PM;
break;
+ }
+ break;
+ case MVMT_FORWARD:
+ switch (hours)
+ {
+ case 0:
+ gTasks[taskId].tPeriod = PERIOD_AM;
+ break;
+ case 12:
+ gTasks[taskId].tPeriod = PERIOD_PM;
+ break;
+ }
+ break;
}
}