summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoryenatch <yenatch@gmail.com>2017-03-22 18:34:29 -0400
committeryenatch <yenatch@gmail.com>2017-03-22 18:34:29 -0400
commit7acbfe40778bfbd03b0e2d357efef9ee9b0a34e9 (patch)
tree90c0b95146f3d768b536658eac6a63ff9adcaaec /src
parentc0a27d5455014bfe54f7ea73e8a38ce0ed8da6da (diff)
parente3c26e52ae6ab881ade913ca1fad2cd9629bbcb1 (diff)
Merge remote-tracking branch 'origin/master'
Conflicts: Makefile
Diffstat (limited to 'src')
-rw-r--r--src/agb_flash.c8
-rw-r--r--src/bard_music.c12
-rw-r--r--src/battle_811DA74.c713
-rw-r--r--src/battle_ai.c1875
-rw-r--r--src/battle_anim.c2257
-rw-r--r--src/battle_anim_80A7E7C.c1633
-rw-r--r--src/battle_party_menu.c483
-rw-r--r--src/battle_setup.c484
-rw-r--r--src/berry.c838
-rw-r--r--src/berry_tag_screen.c480
-rw-r--r--src/bike.c1015
-rw-r--r--src/braille_puzzles.c259
-rw-r--r--src/calculate_base_damage.c2102
-rw-r--r--src/clear_save_data_menu.c10
-rw-r--r--src/clock.c7
-rw-r--r--src/coins.c14
-rw-r--r--src/contest_painting.c699
-rw-r--r--src/credits.c2124
-rw-r--r--src/daycare.c26
-rw-r--r--src/decompress.c21
-rw-r--r--src/decoration.c5
-rw-r--r--src/dewford_trend.c590
-rw-r--r--src/diploma.c39
-rw-r--r--src/event_data.c15
-rw-r--r--src/field_camera.c138
-rw-r--r--src/field_control_avatar.c890
-rw-r--r--src/field_door.c31
-rw-r--r--src/field_effect.c3
-rw-r--r--src/field_map_obj.c1549
-rw-r--r--src/field_map_obj_helpers.c4
-rw-r--r--src/field_message_box.c6
-rw-r--r--src/field_player_avatar.c657
-rw-r--r--src/field_poison.c29
-rw-r--r--src/field_region_map.c134
-rw-r--r--src/field_special_scene.c63
-rw-r--r--src/fieldmap.c1686
-rw-r--r--src/fldeff_cut.c300
-rw-r--r--src/fldeff_strength.c19
-rw-r--r--src/fldeff_teleport.c51
-rw-r--r--src/heal_location.c37
-rw-r--r--src/intro.c1338
-rw-r--r--src/item.c52
-rw-r--r--src/item_use.c434
-rw-r--r--src/libc.c28
-rw-r--r--src/link.c44
-rw-r--r--src/load_save.c42
-rw-r--r--src/lottery_corner.c59
-rw-r--r--src/mail.c863
-rw-r--r--src/main.c5
-rw-r--r--src/main_menu.c11
-rw-r--r--src/map_name_popup.c106
-rw-r--r--src/map_obj_lock.c1
-rw-r--r--src/matsuda_debug_menu.c228
-rw-r--r--src/mauville_old_man.c406
-rw-r--r--src/menu.c12
-rw-r--r--src/menu_cursor.c28
-rw-r--r--src/metatile_behavior.c516
-rw-r--r--src/money.c82
-rw-r--r--src/mori_debug_menu.c20
-rw-r--r--src/mystery_event_menu.c18
-rw-r--r--src/mystery_event_script.c1
-rw-r--r--src/name_string_util.c39
-rw-r--r--src/naming_screen.c2008
-rw-r--r--src/new_game.c30
-rw-r--r--src/option_menu.c112
-rw-r--r--src/party_menu.c342
-rw-r--r--src/player_pc.c1216
-rw-r--r--src/pokedex.c636
-rw-r--r--src/pokemon_1.c10
-rw-r--r--src/pokemon_2.c142
-rw-r--r--src/pokemon_3.c24
-rw-r--r--src/pokemon_size_record.c27
-rw-r--r--src/pokemon_summary_screen.c47
-rw-r--r--src/record_mixing.c407
-rw-r--r--src/rom3.c1408
-rw-r--r--src/rom4.c68
-rw-r--r--src/rom6.c204
-rw-r--r--src/rom_800D42C.c81
-rw-r--r--src/rom_8080874.c97
-rw-r--r--src/rom_8094928.c135
-rw-r--r--src/safari_zone.c5
-rw-r--r--src/save.c435
-rw-r--r--src/save_failed_screen.c82
-rw-r--r--src/save_menu_util.c29
-rw-r--r--src/scrcmd.c43
-rw-r--r--src/script_menu.c637
-rw-r--r--src/script_movement.c226
-rw-r--r--src/script_pokemon_util_80C4BF0.c722
-rw-r--r--src/script_pokemon_util_80F99CC.c455
-rw-r--r--src/shop.c358
-rw-r--r--src/sound.c14
-rw-r--r--src/sprite.c148
-rw-r--r--src/start_menu.c169
-rw-r--r--src/starter_choose.c380
-rw-r--r--src/string_util.c91
-rw-r--r--src/strings.c923
-rw-r--r--src/task.c70
-rw-r--r--src/text.c24
-rw-r--r--src/text_window.c2
-rw-r--r--src/tileset_anim.c963
-rw-r--r--src/title_screen.c424
-rw-r--r--src/trainer_card.c2318
-rw-r--r--src/trainer_see.c46
-rw-r--r--src/tv.c85
-rw-r--r--src/unknown_debug_menu.c52
-rw-r--r--src/wallclock.c809
-rw-r--r--src/weather.c575
-rw-r--r--src/wild_encounter.c2910
108 files changed, 34827 insertions, 10801 deletions
diff --git a/src/agb_flash.c b/src/agb_flash.c
index 34fb4e84a..340d469a7 100644
--- a/src/agb_flash.c
+++ b/src/agb_flash.c
@@ -217,7 +217,7 @@ u32 VerifyFlashSector(u16 sectorNum, u8 *src)
tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift);
size = gFlash->sector.size;
- return verifyFlashSector_Core(src, tgt, size);
+ return verifyFlashSector_Core(src, tgt, size); // return 0 if verified.
}
u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n)
@@ -256,12 +256,12 @@ u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n)
return verifyFlashSector_Core(src, tgt, n);
}
-u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src)
+u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) // 3rd is unused
{
u8 i;
u32 result;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++) // 3 attempts
{
result = ProgramFlashSector(sectorNum, src);
if (result != 0)
@@ -272,7 +272,7 @@ u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src)
break;
}
- return result;
+ return result; // return 0 if verified and programmed.
}
u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, u8 *src, u32 n)
diff --git a/src/bard_music.c b/src/bard_music.c
index ee70f5319..43c2923d2 100644
--- a/src/bard_music.c
+++ b/src/bard_music.c
@@ -48,7 +48,7 @@ static s16 sub_814A2B8(u32 arg0, u32 arg1)
struct BardSound *sub_814A2D0(u16 arg0, u16 arg1)
{
struct BardSound *sounds = gBardMusicTable[arg0];
-
+
return &sounds[arg1];
}
@@ -57,28 +57,28 @@ s32 sub_814A2EC(struct UnkBard2 *dest, struct UnkBard *src, u16 arg2)
s32 i;
s32 j;
s32 thirty;
-
+
for (i = 0; i < 6; i++)
{
dest->var18[i].var00 = src[i].var00;
if (src[i].var00 != 0xFF)
{
s32 r1 = src[i].var01 +gUnknown_084170F4[src[i].var00];
-
+
dest->var18[i].var02 = r1;
dest->var18[i].var06 = src[i].var04;
dest->var04 += r1;
}
}
-
+
for (j = 0, thirty = 30; j < i; j++)
dest->var18[j].var04 = sub_814A2B8(thirty + arg2, j);
-
+
dest->var00++;
dest->var01 = 0;
dest->var02 = 0;
dest->var03 = 0;
dest->var0A = 0;
-
+
//warning: no return statement in function returning non-void
}
diff --git a/src/battle_811DA74.c b/src/battle_811DA74.c
new file mode 100644
index 000000000..1ceb129fe
--- /dev/null
+++ b/src/battle_811DA74.c
@@ -0,0 +1,713 @@
+#include "global.h"
+#include "asm.h"
+#include "link.h"
+#include "m4a.h"
+#include "main.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "text.h"
+
+struct UnknownStruct1
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2[0x1FE];
+};
+
+struct UnknownStruct2
+{
+ u8 unk0;
+ u8 unk1;
+ u8 filler2[7];
+ u8 unk9;
+ u8 fillerA[2];
+};
+
+//Possibly PokemonSubstruct1
+struct UnknownStruct3
+{
+ u16 moves[4];
+ u8 pp[4];
+ u8 ppBonuses;
+};
+
+extern u32 gBitTable[];
+extern u16 gBattleTypeFlags;
+
+extern u8 gUnknown_02023A60[][0x200];
+extern u8 gUnknown_02024A60;
+extern u32 gUnknown_02024A64;
+extern u16 gUnknown_02024A6A[];
+extern u8 gUnknown_02024BE0[];
+extern u8 gUnknown_02024E6D;
+extern struct Window gUnknown_03004210;
+extern MainCallback gUnknown_030042D0;
+extern void (*gUnknown_03004330[])(void);
+extern u8 gUnknown_03004340[];
+extern u8 gUnknown_0300434C[];
+extern void (*const gUnknown_083FE4F4[])(void);
+
+extern u8 unk_2000000[];
+
+#define EWRAM_17800 ((u8 *)(unk_2000000 + 0x17800))
+#define EWRAM_17810 ((struct UnknownStruct2 *)(unk_2000000 + 0x17810))
+
+extern void nullsub_10();
+extern void sub_8045A5C();
+extern void sub_804777C();
+extern void sub_8043DFC();
+extern s16 sub_8045C78();
+extern void sub_80440EC();
+extern void sub_80324F8();
+extern void nullsub_9(u16);
+extern void sub_8043DB0();
+extern void move_anim_start_t4();
+extern void c3_0802FDF4(u8);
+extern void sub_8031F88();
+extern void sub_8141828();
+extern void c2_8011A1C(void);
+extern void sub_800832C();
+extern void dp01_prepare_buffer_wireless_probably();
+extern void dp01_build_cmdbuf_x1D_1D_numargs_varargs(int, u16, void *);
+
+void sub_811DA94(void);
+void sub_811E0A0(void);
+void dp01_tbl3_exec_completed(void);
+u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *b);
+void sub_811EC68(u8);
+
+void nullsub_74(void)
+{
+}
+
+void sub_811DA78(void)
+{
+ gUnknown_03004330[gUnknown_02024A60] = sub_811DA94;
+}
+
+void sub_811DA94(void)
+{
+ if (gUnknown_02024A64 & gBitTable[gUnknown_02024A60])
+ {
+ if (gUnknown_02023A60[gUnknown_02024A60][0] <= 0x38)
+ gUnknown_083FE4F4[gUnknown_02023A60[gUnknown_02024A60][0]]();
+ else
+ dp01_tbl3_exec_completed();
+ }
+}
+
+void sub_811DAE4(void)
+{
+ if (gSprites[gUnknown_02024BE0[gUnknown_02024A60]].callback == SpriteCallbackDummy)
+ dp01_tbl3_exec_completed();
+}
+
+void sub_811DB1C(void)
+{
+ if (gSprites[gUnknown_02024BE0[gUnknown_02024A60]].callback == SpriteCallbackDummy)
+ {
+ nullsub_10(0);
+ FreeSpriteOamMatrix(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]);
+ DestroySprite(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]);
+ dp01_tbl3_exec_completed();
+ }
+}
+
+void sub_811DB84(void)
+{
+ if ((--EWRAM_17810[gUnknown_02024A60].unk9) == 0xFF)
+ {
+ EWRAM_17810[gUnknown_02024A60].unk9 = 0;
+ dp01_tbl3_exec_completed();
+ }
+}
+
+void sub_811DBC0(void)
+{
+ bool8 r6 = FALSE;
+
+ if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & 0x40)))
+ {
+ if (gSprites[gUnknown_03004340[gUnknown_02024A60]].callback == SpriteCallbackDummy)
+ r6 = TRUE;
+ }
+ else
+ {
+ if (gSprites[gUnknown_03004340[gUnknown_02024A60]].callback == SpriteCallbackDummy
+ && gSprites[gUnknown_03004340[gUnknown_02024A60 ^ 2]].callback == SpriteCallbackDummy)
+ r6 = TRUE;
+ }
+ if (IsCryPlayingOrClearCrySongs())
+ r6 = FALSE;
+ if (r6)
+ {
+ EWRAM_17810[gUnknown_02024A60].unk9 = 3;
+ gUnknown_03004330[gUnknown_02024A60] = sub_811DB84;
+ }
+}
+
+void sub_811DCA0(void)
+{
+ u8 r2;
+
+ if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 8))
+ {
+ r2 = EWRAM_17810[gUnknown_02024A60 ^ 2].unk0 & 8;
+ if (!r2 && (++EWRAM_17810[gUnknown_02024A60].unk9) != 1)
+ {
+ EWRAM_17810[gUnknown_02024A60].unk9 = r2;
+ if (IsDoubleBattle() && !(gBattleTypeFlags & 0x40))
+ {
+ DestroySprite(&gSprites[gUnknown_0300434C[gUnknown_02024A60 ^ 2]]);
+ sub_8045A5C(gUnknown_03004340[gUnknown_02024A60 ^ 2], &gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60 ^ 2]], 0);
+ sub_804777C(gUnknown_02024A60 ^ 2);
+ sub_8043DFC(gUnknown_03004340[gUnknown_02024A60 ^ 2]);
+ }
+ DestroySprite(&gSprites[gUnknown_0300434C[gUnknown_02024A60]]);
+ sub_8045A5C(gUnknown_03004340[gUnknown_02024A60], &gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], 0);
+ sub_804777C(gUnknown_02024A60);
+ sub_8043DFC(gUnknown_03004340[gUnknown_02024A60]);
+ (s8)EWRAM_17810[4].unk9 &= ~1;
+ gUnknown_03004330[gUnknown_02024A60] = sub_811DBC0;
+ }
+ }
+}
+
+void sub_811DDE8(void)
+{
+ if (gSprites[gUnknown_02024BE0[gUnknown_02024A60]].animEnded
+ && gSprites[gUnknown_02024BE0[gUnknown_02024A60]].pos2.x == 0)
+ dp01_tbl3_exec_completed();
+}
+
+void bx_t3_healthbar_update(void)
+{
+ s16 r4;
+
+ r4 = sub_8045C78(gUnknown_02024A60, gUnknown_03004340[gUnknown_02024A60], 0, 0);
+ sub_8043DFC(gUnknown_03004340[gUnknown_02024A60]);
+ if (r4 != -1)
+ {
+ sub_80440EC(gUnknown_03004340[gUnknown_02024A60], r4, 0);
+ }
+ else
+ {
+ sub_80324F8(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], gUnknown_02024A60);
+ dp01_tbl3_exec_completed();
+ }
+}
+
+void sub_811DE98(void)
+{
+ if (gSprites[gUnknown_02024BE0[gUnknown_02024A60]].pos1.y + gSprites[gUnknown_02024BE0[gUnknown_02024A60]].pos2.y > 160)
+ {
+ nullsub_9(GetMonData(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], MON_DATA_SPECIES));
+ FreeOamMatrix(gSprites[gUnknown_02024BE0[gUnknown_02024A60]].oam.matrixNum);
+ DestroySprite(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]);
+ sub_8043DB0(gUnknown_03004340[gUnknown_02024A60]);
+ dp01_tbl3_exec_completed();
+ }
+}
+
+void sub_811DF34(void)
+{
+ if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x40))
+ {
+ FreeSpriteOamMatrix(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]);
+ DestroySprite(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]]);
+ sub_8043DB0(gUnknown_03004340[gUnknown_02024A60]);
+ dp01_tbl3_exec_completed();
+ }
+}
+
+void sub_811DFA0(void)
+{
+ if (gUnknown_03004210.state == 0)
+ dp01_tbl3_exec_completed();
+}
+
+void bx_blink_t3(void)
+{
+ u8 spriteId = gUnknown_02024BE0[gUnknown_02024A60];
+ if (gSprites[spriteId].data1 == 32)
+ {
+ gSprites[spriteId].data1 = 0;
+ gSprites[spriteId].invisible = FALSE;
+ gUnknown_02024E6D = 0;
+ dp01_tbl3_exec_completed();
+ }
+ else
+ {
+ if ((gSprites[spriteId].data1 % 4) == 0)
+ {
+ gSprites[spriteId].invisible ^= 1;
+ }
+ gSprites[spriteId].data1++;
+ }
+}
+
+void sub_811E034(void)
+{
+ if (gSprites[gUnknown_03004340[gUnknown_02024A60]].callback == SpriteCallbackDummy)
+ {
+ if (EWRAM_17800[gUnknown_02024A60 * 4] & 4)
+ move_anim_start_t4(gUnknown_02024A60, gUnknown_02024A60, gUnknown_02024A60, 6);
+ gUnknown_03004330[gUnknown_02024A60] = sub_811E0A0;
+ }
+}
+
+void sub_811E0A0(void)
+{
+ if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x40))
+ dp01_tbl3_exec_completed();
+}
+
+void sub_811E0CC(void)
+{
+ if (EWRAM_17810[gUnknown_02024A60].unk1 & 1)
+ {
+ EWRAM_17810[gUnknown_02024A60].unk0 &= 0x7F;
+ (s8)EWRAM_17810[gUnknown_02024A60].unk1 &= ~1;
+ FreeSpriteTilesByTag(0x27F9);
+ FreeSpritePaletteByTag(0x27F9);
+ CreateTask(c3_0802FDF4, 10);
+ sub_80324F8(&gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], gUnknown_02024A60);
+ StartSpriteAnim(&gSprites[gUnknown_02024BE0[gUnknown_02024A60]], 0);
+ sub_8045A5C(gUnknown_03004340[gUnknown_02024A60], &gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]], 0);
+ sub_804777C(gUnknown_02024A60);
+ sub_8043DFC(gUnknown_03004340[gUnknown_02024A60]);
+ sub_8031F88(gUnknown_02024A60);
+ gUnknown_03004330[gUnknown_02024A60] = sub_811E034;
+ }
+}
+
+void sub_811E1BC(void)
+{
+ if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x88))
+ sub_8141828(gUnknown_02024A60, &gPlayerParty[gUnknown_02024A6A[gUnknown_02024A60]]);
+ if (gSprites[gUnknown_0300434C[gUnknown_02024A60]].callback == SpriteCallbackDummy
+ && !(EWRAM_17810[gUnknown_02024A60].unk0 & 8))
+ {
+ DestroySprite(&gSprites[gUnknown_0300434C[gUnknown_02024A60]]);
+ gUnknown_03004330[gUnknown_02024A60] = sub_811E0CC;
+ }
+}
+
+void sub_811E258(void)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ m4aSongNumStop(0x5A);
+ gMain.inBattle = FALSE;
+ gMain.callback1 = gUnknown_030042D0;
+ SetMainCallback2(c2_8011A1C);
+ }
+}
+
+void sub_811E29C(void)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gBattleTypeFlags & 2)
+ {
+ sub_800832C();
+ gUnknown_03004330[gUnknown_02024A60] = sub_811E258;
+ }
+ else
+ {
+ m4aSongNumStop(0x5A);
+ gMain.inBattle = FALSE;
+ gMain.callback1 = gUnknown_030042D0;
+ SetMainCallback2(gMain.savedCallback);
+ }
+ }
+}
+
+void dp01_tbl3_exec_completed(void)
+{
+ u8 multiplayerId;
+
+ gUnknown_03004330[gUnknown_02024A60] = sub_811DA94;
+ if (gBattleTypeFlags & 2)
+ {
+ multiplayerId = GetMultiplayerId();
+ dp01_prepare_buffer_wireless_probably(2, 4, &multiplayerId);
+ gUnknown_02023A60[gUnknown_02024A60][0] = 0x38;
+ }
+ else
+ {
+ gUnknown_02024A64 &= ~gBitTable[gUnknown_02024A60];
+ }
+}
+
+void sub_811E38C(void)
+{
+ if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x10))
+ dp01_tbl3_exec_completed();
+}
+
+void sub_811E3B8(void)
+{
+ if (!(EWRAM_17810[gUnknown_02024A60].unk0 & 0x20))
+ dp01_tbl3_exec_completed();
+}
+
+void dp01t_00_3_getattr(void)
+{
+ u8 unk[256];
+ int r6 = 0;
+ s32 i;
+
+ if (gUnknown_02023A60[gUnknown_02024A60][2] == 0)
+ {
+ r6 = dp01_getattr_by_ch1_for_player_pokemon(gUnknown_02024A6A[gUnknown_02024A60], unk);
+ }
+ else
+ {
+ u8 r4 = gUnknown_02023A60[gUnknown_02024A60][2];
+
+ for (i = 0; i < 6; i++)
+ {
+ if (r4 & 1)
+ r6 += dp01_getattr_by_ch1_for_player_pokemon(i, unk + r6);
+ r4 >>= 1;
+ }
+ }
+ dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, unk);
+ dp01_tbl3_exec_completed();
+}
+
+u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer)
+{
+ struct BattlePokemon battlePokemon;
+ struct UnknownStruct3 moveData;
+ u8 nickname[20];
+ u8 *src;
+ s16 data16;
+ u32 data32;
+ s32 size = 0;
+
+ switch (gUnknown_02023A60[gUnknown_02024A60][1])
+ {
+ case 0:
+ battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES);
+ battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM);
+ for (size = 0; size < 4; size++)
+ {
+ battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size);
+ battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size);
+ }
+ battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES);
+ battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP);
+ battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP);
+ battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV);
+ battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV);
+ battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV);
+ battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV);
+ battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV);
+ battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV);
+ battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY);
+ battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS);
+ battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL);
+ battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP);
+ battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP);
+ battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK);
+ battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF);
+ battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD);
+ battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK);
+ battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF);
+ battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG);
+ battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY);
+ battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID);
+ GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname);
+ StringCopy10(battlePokemon.nickname, nickname);
+ GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName);
+ src = (u8 *)&battlePokemon;
+ for (size = 0; size < sizeof(battlePokemon); size++)
+ buffer[size] = src[size];
+ break;
+ case 1:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 2:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 3:
+ for (size = 0; size < 4; size++)
+ {
+ moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size);
+ moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size);
+ }
+ moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES);
+ src = (u8 *)&moveData;
+ for (size = 0; size < sizeof(moveData); size++)
+ buffer[size] = src[size];
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ data16 = GetMonData(&gPlayerParty[a], gUnknown_02023A60[gUnknown_02024A60][1] + MON_DATA_CHECKSUM);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 8:
+ for (size = 0; size < 4; size++)
+ buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size);
+ buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES);
+ size++;
+ break;
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ buffer[0] = GetMonData(&gPlayerParty[a], gUnknown_02023A60[gUnknown_02024A60][1] + MON_DATA_MARKINGS);
+ size = 1;
+ break;
+ case 17:
+ data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID);
+ buffer[0] = (data32 & 0x000000FF);
+ buffer[1] = (data32 & 0x0000FF00) >> 8;
+ buffer[2] = (data32 & 0x00FF0000) >> 16;
+ size = 3;
+ break;
+ case 18:
+ data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP);
+ buffer[0] = (data32 & 0x000000FF);
+ buffer[1] = (data32 & 0x0000FF00) >> 8;
+ buffer[2] = (data32 & 0x00FF0000) >> 16;
+ size = 3;
+ break;
+ case 19:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV);
+ size = 1;
+ break;
+ case 20:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV);
+ size = 1;
+ break;
+ case 21:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV);
+ size = 1;
+ break;
+ case 22:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV);
+ size = 1;
+ break;
+ case 23:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV);
+ size = 1;
+ break;
+ case 24:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV);
+ size = 1;
+ break;
+ case 25:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP);
+ size = 1;
+ break;
+ case 26:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS);
+ size = 1;
+ break;
+ case 27:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION);
+ size = 1;
+ break;
+ case 28:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL);
+ size = 1;
+ break;
+ case 29:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME);
+ size = 1;
+ break;
+ case 30:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL);
+ size = 1;
+ break;
+ case 31:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV);
+ buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV);
+ buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV);
+ buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV);
+ buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV);
+ buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV);
+ size = 6;
+ break;
+ case 32:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV);
+ size = 1;
+ break;
+ case 33:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV);
+ size = 1;
+ break;
+ case 34:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV);
+ size = 1;
+ break;
+ case 35:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV);
+ size = 1;
+ break;
+ case 36:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV);
+ size = 1;
+ break;
+ case 37:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV);
+ size = 1;
+ break;
+ case 38:
+ data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY);
+ buffer[0] = (data32 & 0x000000FF);
+ buffer[1] = (data32 & 0x0000FF00) >> 8;
+ buffer[2] = (data32 & 0x00FF0000) >> 16;
+ buffer[3] = (data32 & 0xFF000000) >> 24;
+ size = 4;
+ break;
+ case 39:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 40:
+ data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS);
+ buffer[0] = (data32 & 0x000000FF);
+ buffer[1] = (data32 & 0x0000FF00) >> 8;
+ buffer[2] = (data32 & 0x00FF0000) >> 16;
+ buffer[3] = (data32 & 0xFF000000) >> 24;
+ size = 4;
+ break;
+ case 41:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL);
+ size = 1;
+ break;
+ case 42:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 43:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 44:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 45:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 46:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 47:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 48:
+ data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF);
+ buffer[0] = data16;
+ buffer[1] = data16 >> 8;
+ size = 2;
+ break;
+ case 49:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL);
+ size = 1;
+ break;
+ case 50:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY);
+ size = 1;
+ break;
+ case 51:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE);
+ size = 1;
+ break;
+ case 52:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART);
+ size = 1;
+ break;
+ case 53:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH);
+ size = 1;
+ break;
+ case 54:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN);
+ size = 1;
+ break;
+ case 55:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON);
+ size = 1;
+ break;
+ case 56:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON);
+ size = 1;
+ break;
+ case 57:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON);
+ size = 1;
+ break;
+ case 58:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON);
+ size = 1;
+ break;
+ case 59:
+ buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON);
+ size = 1;
+ break;
+ }
+ return size;
+}
+
+void sub_811EC04(void)
+{
+ dp01_tbl3_exec_completed();
+}
+
+void sub_811EC10(void)
+{
+ u8 i;
+ u8 r4;
+
+ if (gUnknown_02023A60[gUnknown_02024A60][2] == 0)
+ {
+ sub_811EC68(gUnknown_02024A6A[gUnknown_02024A60]);
+ }
+ else
+ {
+ r4 = gUnknown_02023A60[gUnknown_02024A60][2];
+ for (i = 0; i < 6; i++)
+ {
+ if (r4 & 1)
+ sub_811EC68(i);
+ r4 >>= 1;
+ }
+ }
+ dp01_tbl3_exec_completed();
+}
diff --git a/src/battle_ai.c b/src/battle_ai.c
index 7c9b7f17e..07f319e40 100644
--- a/src/battle_ai.c
+++ b/src/battle_ai.c
@@ -1,38 +1,35 @@
#include "global.h"
-#include "battle.h"
+#include "abilities.h"
#include "asm.h"
+#include "battle.h"
+#include "battle_move_effects.h"
+#include "item.h"
#include "pokemon.h"
#include "rng.h"
-#include "abilities.h"
#include "species.h"
+#include "moves.h"
+#include "battle_ai.h"
-#define AIScriptRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24)
-#define AIScriptRead16(ptr) ((ptr)[0] | (ptr)[1] << 8)
-#define AIScriptRead8(ptr) ((ptr)[0])
-#define AIScriptReadPtr(ptr) (u8*) AIScriptRead32(ptr)
-
-enum
-{
- TARGET,
- USER
-};
+extern void sub_801CAF8(u8, u8);
extern void move_effectiveness_something(u16, u8, u8);
extern u16 gBattleTypeFlags;
+extern u16 gBattleWeather;
extern u8 gUnknown_02024A60;
extern u8 gUnknown_02024A6A[][2];
extern u16 gUnknown_02024BE6;
-extern u32 gUnknown_02024BEC;
-extern u8 gUnknown_02024C07; // something player?
-extern u8 gUnknown_02024C08; // something opponent?
+extern int gBattleMoveDamage;
+extern u8 gPlayerMonIndex;
+extern u8 gEnemyMonIndex;
extern u8 gUnknown_02024C0C;
-extern u8 gUnknown_02024C68;
+extern u8 gBattleMoveFlags;
extern u16 gUnknown_02024DEC;
extern u16 gUnknown_02024C34[];
extern u32 gUnknown_02024ACC[];
extern u32 gUnknown_02024C98[];
extern u16 gUnknown_02024C7A[];
+extern struct BattlePokemon gBattleMons[];
extern struct BattlePokemon gUnknown_02024A8C[];
extern u8 gUnknown_030042E0[];
extern u8 gCritMultiplier;
@@ -40,10 +37,8 @@ extern u16 gTrainerBattleOpponent;
extern u32 gBitTable[];
extern u8 *BattleAIs[];
extern struct Trainer gTrainers[];
-extern struct BattlePokemon gBattleMons[];
extern struct BattleMove gBattleMoves[];
extern struct BaseStats gBaseStats[];
-extern void (*gBattleAICmdTable[])(void);
/*
gAIScriptPtr is a pointer to the next battle AI cmd command to read.
@@ -54,46 +49,240 @@ AI scripts.
*/
extern u8 *gAIScriptPtr;
-struct UnknownStruct1
+static void BattleAICmd_if_random_less_than(void);
+static void BattleAICmd_if_random_greater_than(void);
+static void BattleAICmd_if_random_equal(void);
+static void BattleAICmd_if_random_not_equal(void);
+static void BattleAICmd_score(void);
+static void BattleAICmd_if_hp_less_than(void);
+static void BattleAICmd_if_hp_more_than(void);
+static void BattleAICmd_if_hp_equal(void);
+static void BattleAICmd_if_hp_not_equal(void);
+static void BattleAICmd_if_status(void);
+static void BattleAICmd_if_not_status(void);
+static void BattleAICmd_if_status2(void);
+static void BattleAICmd_if_not_status2(void);
+static void BattleAICmd_if_status3(void);
+static void BattleAICmd_if_not_status3(void);
+static void BattleAICmd_if_status4(void);
+static void BattleAICmd_if_not_status4(void);
+static void BattleAICmd_if_less_than(void);
+static void BattleAICmd_if_more_than(void);
+static void BattleAICmd_if_equal(void);
+static void BattleAICmd_if_not_equal(void);
+static void BattleAICmd_if_less_than_32(void);
+static void BattleAICmd_if_more_than_32(void);
+static void BattleAICmd_if_equal_32(void);
+static void BattleAICmd_if_not_equal_32(void);
+static void BattleAICmd_if_move(void);
+static void BattleAICmd_if_not_move(void);
+static void BattleAICmd_if_in_bytes(void);
+static void BattleAICmd_if_not_in_bytes(void);
+static void BattleAICmd_if_in_words(void);
+static void BattleAICmd_if_not_in_words(void);
+static void BattleAICmd_if_user_can_damage(void);
+static void BattleAICmd_if_user_cant_damage(void);
+static void BattleAICmd_get_turn_count(void);
+static void BattleAICmd_get_type(void);
+static void BattleAICmd_get_move_power(void);
+static void BattleAICmd_is_most_powerful_move(void);
+static void BattleAICmd_get_move(void);
+static void BattleAICmd_if_arg_equal(void);
+static void BattleAICmd_if_arg_not_equal(void);
+static void BattleAICmd_if_would_go_first(void);
+static void BattleAICmd_if_would_not_go_first(void);
+static void BattleAICmd_nullsub_2A(void);
+static void BattleAICmd_nullsub_2B(void);
+static void BattleAICmd_count_alive_pokemon(void);
+static void BattleAICmd_get_considered_move(void);
+static void BattleAICmd_get_considered_move_effect(void);
+static void BattleAICmd_get_ability(void);
+static void BattleAICmd_get_highest_possible_damage(void);
+static void BattleAICmd_if_damage_bonus(void);
+static void BattleAICmd_nullsub_32(void);
+static void BattleAICmd_nullsub_33(void);
+static void BattleAICmd_if_status_in_party(void);
+static void BattleAICmd_if_status_not_in_party(void);
+static void BattleAICmd_get_weather(void);
+static void BattleAICmd_if_effect(void);
+static void BattleAICmd_if_not_effect(void);
+static void BattleAICmd_if_stat_level_less_than(void);
+static void BattleAICmd_if_stat_level_more_than(void);
+static void BattleAICmd_if_stat_level_equal(void);
+static void BattleAICmd_if_stat_level_not_equal(void);
+static void BattleAICmd_if_can_faint(void);
+static void BattleAICmd_if_cant_faint(void);
+static void BattleAICmd_if_has_move(void);
+static void BattleAICmd_if_dont_have_move(void);
+static void BattleAICmd_if_move_effect(void);
+static void BattleAICmd_if_not_move_effect(void);
+static void BattleAICmd_if_last_move_did_damage(void);
+static void BattleAICmd_if_encored(void);
+static void BattleAICmd_flee(void);
+static void BattleAICmd_if_random_100(void);
+static void BattleAICmd_watch(void);
+static void BattleAICmd_get_hold_effect(void);
+static void BattleAICmd_get_gender(void);
+static void BattleAICmd_is_first_turn(void);
+static void BattleAICmd_get_stockpile_count(void);
+static void BattleAICmd_is_double_battle(void);
+static void BattleAICmd_get_item(void);
+static void BattleAICmd_get_move_type_from_result(void);
+static void BattleAICmd_get_move_power_from_result(void);
+static void BattleAICmd_get_move_effect_from_result(void);
+static void BattleAICmd_get_protect_count(void);
+static void BattleAICmd_nullsub_52(void);
+static void BattleAICmd_nullsub_53(void);
+static void BattleAICmd_nullsub_54(void);
+static void BattleAICmd_nullsub_55(void);
+static void BattleAICmd_nullsub_56(void);
+static void BattleAICmd_nullsub_57(void);
+static void BattleAICmd_call(void);
+static void BattleAICmd_jump(void);
+static void BattleAICmd_end(void);
+static void BattleAICmd_if_level_compare(void);
+static void BattleAICmd_if_taunted(void);
+static void BattleAICmd_if_not_taunted(void);
+
+typedef void (*BattleAICmdFunc)(void);
+
+static const BattleAICmdFunc sBattleAICmdTable[] =
{
-/* 0x00 */ u16 unk0[2][8];
-/* 0x20 */ u8 unk20[2];
-/* 0x22 */ u8 unk22[2];
-/* 0x24 */ u16 items[4];
-/* 0x2C */ u8 unk8;
+ BattleAICmd_if_random_less_than,
+ BattleAICmd_if_random_greater_than,
+ BattleAICmd_if_random_equal,
+ BattleAICmd_if_random_not_equal,
+ BattleAICmd_score,
+ BattleAICmd_if_hp_less_than,
+ BattleAICmd_if_hp_more_than,
+ BattleAICmd_if_hp_equal,
+ BattleAICmd_if_hp_not_equal,
+ BattleAICmd_if_status,
+ BattleAICmd_if_not_status,
+ BattleAICmd_if_status2,
+ BattleAICmd_if_not_status2,
+ BattleAICmd_if_status3,
+ BattleAICmd_if_not_status3,
+ BattleAICmd_if_status4,
+ BattleAICmd_if_not_status4,
+ BattleAICmd_if_less_than,
+ BattleAICmd_if_more_than,
+ BattleAICmd_if_equal,
+ BattleAICmd_if_not_equal,
+ BattleAICmd_if_less_than_32,
+ BattleAICmd_if_more_than_32,
+ BattleAICmd_if_equal_32,
+ BattleAICmd_if_not_equal_32,
+ BattleAICmd_if_move,
+ BattleAICmd_if_not_move,
+ BattleAICmd_if_in_bytes,
+ BattleAICmd_if_not_in_bytes,
+ BattleAICmd_if_in_words,
+ BattleAICmd_if_not_in_words,
+ BattleAICmd_if_user_can_damage,
+ BattleAICmd_if_user_cant_damage,
+ BattleAICmd_get_turn_count,
+ BattleAICmd_get_type,
+ BattleAICmd_get_move_power,
+ BattleAICmd_is_most_powerful_move,
+ BattleAICmd_get_move,
+ BattleAICmd_if_arg_equal,
+ BattleAICmd_if_arg_not_equal,
+ BattleAICmd_if_would_go_first,
+ BattleAICmd_if_would_not_go_first,
+ BattleAICmd_nullsub_2A,
+ BattleAICmd_nullsub_2B,
+ BattleAICmd_count_alive_pokemon,
+ BattleAICmd_get_considered_move,
+ BattleAICmd_get_considered_move_effect,
+ BattleAICmd_get_ability,
+ BattleAICmd_get_highest_possible_damage,
+ BattleAICmd_if_damage_bonus,
+ BattleAICmd_nullsub_32,
+ BattleAICmd_nullsub_33,
+ BattleAICmd_if_status_in_party,
+ BattleAICmd_if_status_not_in_party,
+ BattleAICmd_get_weather,
+ BattleAICmd_if_effect,
+ BattleAICmd_if_not_effect,
+ BattleAICmd_if_stat_level_less_than,
+ BattleAICmd_if_stat_level_more_than,
+ BattleAICmd_if_stat_level_equal,
+ BattleAICmd_if_stat_level_not_equal,
+ BattleAICmd_if_can_faint,
+ BattleAICmd_if_cant_faint,
+ BattleAICmd_if_has_move,
+ BattleAICmd_if_dont_have_move,
+ BattleAICmd_if_move_effect,
+ BattleAICmd_if_not_move_effect,
+ BattleAICmd_if_last_move_did_damage,
+ BattleAICmd_if_encored,
+ BattleAICmd_flee,
+ BattleAICmd_if_random_100,
+ BattleAICmd_watch,
+ BattleAICmd_get_hold_effect,
+ BattleAICmd_get_gender,
+ BattleAICmd_is_first_turn,
+ BattleAICmd_get_stockpile_count,
+ BattleAICmd_is_double_battle,
+ BattleAICmd_get_item,
+ BattleAICmd_get_move_type_from_result,
+ BattleAICmd_get_move_power_from_result,
+ BattleAICmd_get_move_effect_from_result,
+ BattleAICmd_get_protect_count,
+ BattleAICmd_nullsub_52,
+ BattleAICmd_nullsub_53,
+ BattleAICmd_nullsub_54,
+ BattleAICmd_nullsub_55,
+ BattleAICmd_nullsub_56,
+ BattleAICmd_nullsub_57,
+ BattleAICmd_call,
+ BattleAICmd_jump,
+ BattleAICmd_end,
+ BattleAICmd_if_level_compare,
+ BattleAICmd_if_taunted,
+ BattleAICmd_if_not_taunted,
};
-struct UnknownStruct3
+#ifdef NONMATCHING
+static
+#endif
+const u16 sDiscouragedPowerfulMoveEffects[] =
{
- u8 filler0[0x20];
- u8 unk20;
+ EFFECT_EXPLOSION,
+ EFFECT_DREAM_EATER,
+ EFFECT_RAZOR_WIND,
+ EFFECT_SKY_ATTACK,
+ EFFECT_RECHARGE,
+ EFFECT_SKULL_BASH,
+ EFFECT_SOLARBEAM,
+ EFFECT_SPIT_UP,
+ EFFECT_FOCUS_PUNCH,
+ EFFECT_SUPERPOWER,
+ EFFECT_ERUPTION,
+ EFFECT_OVERHEAT,
+ 0xFFFF
};
-extern struct UnknownStruct1 unk_2016A00;
-extern struct UnknownStruct3 unk_2016C00;
-
-void BattleAI_SetupAIData(void);
-void BattleAI_DoAIProcessing(void);
-void sub_810745C(void);
-
// if the AI is a Link battle, safari, battle tower, or ereader, it will ignore considering item uses.
void BattleAI_HandleItemUseBeforeAISetup(void)
{
s32 i;
- u8 *data = (u8 *)&unk_2016A00;
+ u8 *data = (u8 *)UNK_2016A00_STRUCT;
- for (i = 0; (u32)i < 48; i++)
+ for (i = 0; (u32)i < sizeof(struct UnknownStruct1); i++)
data[i] = 0;
+
if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
&& gTrainerBattleOpponent != 0x400
&& !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)))
{
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_TRAINER_ITEMS; i++)
{
if (gTrainers[gTrainerBattleOpponent].items[i] != 0)
{
- unk_2016A00.items[unk_2016A00.unk8] = gTrainers[gTrainerBattleOpponent].items[i];
- unk_2016A00.unk8++;
+ UNK_2016A00_STRUCT->items[UNK_2016A00_STRUCT->numOfItems] = gTrainers[gTrainerBattleOpponent].items[i];
+ UNK_2016A00_STRUCT->numOfItems++;
}
}
}
@@ -104,130 +293,136 @@ void BattleAI_HandleItemUseBeforeAISetup(void)
void BattleAI_SetupAIData(void)
{
s32 i;
- u8 *data = (u8 *)&gAIThinkingSpace;
+ u8 *data = (u8 *)AI_THINKING_STRUCT;
u8 r7;
- // clear AI data and set default move score to 100.
- for(i = 0; (u32)i < 28; i++)
+ // clear AI data and set default move score to 100. strange that they didn't use memset here.
+ for (i = 0; (u32)i < sizeof(struct AI_ThinkingStruct); i++)
data[i] = 0;
- for(i = 0; i < 4; i++)
- gAIThinkingSpace.score[i] = 100;
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ AI_THINKING_STRUCT->score[i] = 100;
r7 = sub_8015A98(gUnknown_02024A60, 0, 0xFF);
- for(i = 0; i < 4; i++)
+ // probably sets up the moves to consider and ignores non-valid moves such as NO_MOVE or glitch moves.
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
- u16 rand;
+ if (gBitTable[i] & r7)
+ AI_THINKING_STRUCT->score[i] = 0;
- if(gBitTable[i] & r7)
- gAIThinkingSpace.score[i] = 0;
- rand = Random();
- gAIThinkingSpace.unk18[i] = 100 - (rand & 0xF);
+ AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16);
}
- unk_2016C00.unk20 = 0;
- gUnknown_02024C07 = gUnknown_02024A60;
+ // clear AI stack.
+ AI_STACK->size = 0;
+ gPlayerMonIndex = gUnknown_02024A60;
- if(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
+ if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- gUnknown_02024C08 = Random() & 2;
+ gEnemyMonIndex = Random() & 2; // just pick somebody to target.
- if(gUnknown_02024C0C & gBitTable[gUnknown_02024C08])
- gUnknown_02024C08 ^= 2;
+ if (gUnknown_02024C0C & gBitTable[gEnemyMonIndex])
+ gEnemyMonIndex ^= 2;
}
else
- gUnknown_02024C08 = gUnknown_02024A60 ^ 1;
+ gEnemyMonIndex = gUnknown_02024A60 ^ 1;
// special AI flag cases.
- if(gBattleTypeFlags & BATTLE_TYPE_SAFARI)
- gAIThinkingSpace.aiFlags = 0x40000000;
- else if(gBattleTypeFlags & BATTLE_TYPE_ROAMER)
- gAIThinkingSpace.aiFlags = 0x20000000;
- else if(gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
- gAIThinkingSpace.aiFlags = 0x80000000;
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ AI_THINKING_STRUCT->aiFlags = 0x40000000;
+ else if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)
+ AI_THINKING_STRUCT->aiFlags = 0x20000000;
+ else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
+ AI_THINKING_STRUCT->aiFlags = 0x80000000;
else // otherwise, just set aiFlags to whatever flags the trainer has set in their data.
- gAIThinkingSpace.aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags;
+ AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent].aiFlags;
}
u8 BattleAI_GetAIActionToUse(void)
{
- u8 arr1[4];
- u8 arr2[4];
- u8 r5;
+ u8 currentMoveArray[MAX_MON_MOVES];
+ u8 consideredMoveArray[MAX_MON_MOVES];
+ u8 numOfBestMoves;
s32 i;
sub_810745C();
- while(gAIThinkingSpace.aiFlags != 0)
+ while (AI_THINKING_STRUCT->aiFlags != 0)
{
- if(gAIThinkingSpace.aiFlags & 1)
+ if (AI_THINKING_STRUCT->aiFlags & 1)
{
- gAIThinkingSpace.unk0 = 0;
+ AI_THINKING_STRUCT->aiState = AIState_SettingUp;
BattleAI_DoAIProcessing();
}
- gAIThinkingSpace.aiFlags >>= 1;
- gAIThinkingSpace.aiLogicId++;
- gAIThinkingSpace.moveConsidered = 0;
+ AI_THINKING_STRUCT->aiFlags >>= 1;
+ AI_THINKING_STRUCT->aiLogicId++;
+ AI_THINKING_STRUCT->movesetIndex = 0;
}
- if(gAIThinkingSpace.unk10 & 2)
+
+ // special flee or watch cases for safari.
+ if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_FLEE)) // flee
return 4;
- if(gAIThinkingSpace.unk10 & 4)
+ if (AI_THINKING_STRUCT->aiAction & (AI_ACTION_WATCH)) // watch
return 5;
- r5 = 1;
- arr1[0] = gAIThinkingSpace.score[0];
- arr2[0] = 0;
- for(i = 1; i < 4; i++)
+
+ numOfBestMoves = 1;
+ currentMoveArray[0] = AI_THINKING_STRUCT->score[0];
+ consideredMoveArray[0] = 0;
+
+ for (i = 1; i < MAX_MON_MOVES; i++)
{
- if(arr1[0] < (s8)gAIThinkingSpace.score[i])
+ if (currentMoveArray[0] < AI_THINKING_STRUCT->score[i])
{
- r5 = 1;
- arr1[0] = gAIThinkingSpace.score[i];
- arr2[0] = i;
+ numOfBestMoves = 1;
+ currentMoveArray[0] = AI_THINKING_STRUCT->score[i];
+ consideredMoveArray[0] = i;
}
- if(arr1[0] == (s8)gAIThinkingSpace.score[i])
+ if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i])
{
- arr1[r5] = gAIThinkingSpace.score[i];
- arr2[r5++] = i;
+ currentMoveArray[numOfBestMoves] = AI_THINKING_STRUCT->score[i];
+ consideredMoveArray[numOfBestMoves++] = i;
}
}
- return arr2[Random() % r5];
+
+ return consideredMoveArray[Random() % numOfBestMoves]; // break any ties that exist.
}
void BattleAI_DoAIProcessing(void)
{
- while(gAIThinkingSpace.unk0 != 2)
+ while (AI_THINKING_STRUCT->aiState != AIState_FinishedProcessing)
{
- switch(gAIThinkingSpace.unk0)
+ switch (AI_THINKING_STRUCT->aiState)
{
- case 3: //Needed to match.
+ case AIState_DoNotProcess: //Needed to match.
break;
- case 0:
- gAIScriptPtr = BattleAIs[gAIThinkingSpace.aiLogicId];
- if(gBattleMons[gUnknown_02024C07].pp[gAIThinkingSpace.moveConsidered] == 0)
+ case AIState_SettingUp:
+ gAIScriptPtr = BattleAIs[AI_THINKING_STRUCT->aiLogicId]; // set the AI ptr.
+ if (gBattleMons[gPlayerMonIndex].pp[AI_THINKING_STRUCT->movesetIndex] == 0)
{
- gAIThinkingSpace.unk2 = 0;
+ AI_THINKING_STRUCT->moveConsidered = MOVE_NONE; // don't consider a move you have 0 PP for, idiot.
}
else
{
- gAIThinkingSpace.unk2 = gBattleMons[gUnknown_02024C07].moves[gAIThinkingSpace.moveConsidered];
+ AI_THINKING_STRUCT->moveConsidered = gBattleMons[gPlayerMonIndex].moves[AI_THINKING_STRUCT->movesetIndex];
}
- gAIThinkingSpace.unk0++;
+ AI_THINKING_STRUCT->aiState++;
break;
- case 1:
- if(gAIThinkingSpace.unk2 != 0)
- gBattleAICmdTable[*(u8 *)gAIScriptPtr](); // run AI command.
+ case AIState_Processing:
+ if (AI_THINKING_STRUCT->moveConsidered != MOVE_NONE)
+ sBattleAICmdTable[*(u8 *)gAIScriptPtr](); // run AI command.
else
{
- gAIThinkingSpace.score[gAIThinkingSpace.moveConsidered] = 0;
- gAIThinkingSpace.unk10 |= 1;
+ AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; // definitely do not consider any move that has 0 PP.
+ AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE;
}
- if(gAIThinkingSpace.unk10 & 1)
+ if (AI_THINKING_STRUCT->aiAction & AI_ACTION_DONE)
{
- gAIThinkingSpace.moveConsidered++;
- if(gAIThinkingSpace.moveConsidered < 4 && !(gAIThinkingSpace.unk10 & 8))
- gAIThinkingSpace.unk0 = 0;
+ AI_THINKING_STRUCT->movesetIndex++;
+ if (AI_THINKING_STRUCT->movesetIndex < MAX_MON_MOVES && (AI_THINKING_STRUCT->aiAction & AI_ACTION_DO_NOT_ATTACK) == 0)
+ AI_THINKING_STRUCT->aiState = AIState_SettingUp; // as long as their are more moves to process, keep setting this to setup state.
else
- gAIThinkingSpace.unk0++;
- gAIThinkingSpace.unk10 &= 0xFE;
+ AI_THINKING_STRUCT->aiState++; // done processing.
+ AI_THINKING_STRUCT->aiAction &= (AI_ACTION_FLEE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK |
+ AI_ACTION_UNK5 | AI_ACTION_UNK6 | AI_ACTION_UNK7 | AI_ACTION_UNK8); // disable AI_ACTION_DONE.
}
break;
}
@@ -238,12 +433,11 @@ void sub_810745C(void)
{
s32 i;
- for(i = 0; i < 8; i++)
+ for (i = 0; i < 8; i++)
{
- // this is the same as dividing it by 2, but for some reason, >> 1 is needed to match the asm.
- if(unk_2016A00.unk0[gUnknown_02024C08 >> 1][i] == 0)
+ if (UNK_2016A00_STRUCT->movesUsed[gEnemyMonIndex >> 1][i] == 0)
{
- unk_2016A00.unk0[gUnknown_02024C08 >> 1][i] = gUnknown_02024C34[gUnknown_02024C08];
+ UNK_2016A00_STRUCT->movesUsed[gEnemyMonIndex >> 1][i] = gUnknown_02024C34[gEnemyMonIndex];
return;
}
}
@@ -253,507 +447,558 @@ void unref_sub_81074A0(u8 a)
{
s32 i;
- for(i = 0; i < 8; i++)
- unk_2016A00.unk0[a / 2][i] = 0;
+ for (i = 0; i < 8; i++)
+ UNK_2016A00_STRUCT->movesUsed[a / 2][i] = 0;
}
void sub_81074C4(u8 a, u8 b)
{
- if(battle_side_get_owner(a) == 0)
- unk_2016A00.unk20[battle_get_per_side_status(a) & 1] = b;
+ if (battle_side_get_owner(a) == 0)
+ UNK_2016A00_STRUCT->unk20[battle_get_per_side_status(a) & 1] = b;
}
void sub_81074F8(u8 a, u8 b)
{
- if(battle_side_get_owner(a) == 0)
- unk_2016A00.unk22[battle_get_per_side_status(a) & 1] = b;
+ if (battle_side_get_owner(a) == 0)
+ UNK_2016A00_STRUCT->unk22[battle_get_per_side_status(a) & 1] = b;
}
-void BattleAICmd_if_random(void)
+static void BattleAICmd_if_random_less_than(void)
{
- u16 random = Random();
-
- if (!(random % 256 >= gAIScriptPtr[1])) // roll a random value. is it less than the parameter of the if_random call? (96 on if_random 80 will return true)
+ if (Random() % 256 < gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_if_not_random(void)
+static void BattleAICmd_if_random_greater_than(void)
{
- u16 random = Random();
-
- if (!(random % 256 <= gAIScriptPtr[1])) // roll a random value. is it greater than the parameter of the if_random call? (96 on if_random 80 will return true)
+ if (Random() % 256 > gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_if_random_1(void) // if RNG Value equal to
+static void BattleAICmd_if_random_equal(void)
{
- u16 random = Random();
-
- if (random % 256 == gAIScriptPtr[1]) // roll a random value. is it greater than the parameter of the if_random call? (96 on if_random 80 will return true)
+ if (Random() % 256 == gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_if_not_random_1(void) // if RNG value not equal to
+static void BattleAICmd_if_random_not_equal(void)
{
- u16 random = Random();
-
- if (random % 256 != gAIScriptPtr[1]) // roll a random value. is it greater than the parameter of the if_random call? (96 on if_random 80 will return true)
+ if (Random() % 256 != gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_score(void)
+static void BattleAICmd_score(void)
{
- gAIThinkingSpace.score[gAIThinkingSpace.moveConsidered] += gAIScriptPtr[1]; // add the result to the array of the move consider's score.
+ AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += gAIScriptPtr[1]; // add the result to the array of the move consider's score.
- if(gAIThinkingSpace.score[gAIThinkingSpace.moveConsidered] < 0) // if the score is negative, flatten it to 0.
- gAIThinkingSpace.score[gAIThinkingSpace.moveConsidered] = 0;
+ if (AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] < 0) // if the score is negative, flatten it to 0.
+ AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0;
gAIScriptPtr += 2; // AI return.
}
-void BattleAICmd_if_hp_less_than(void)
+static void BattleAICmd_if_hp_less_than(void)
{
- u16 var;
+ u16 index;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- if ((u32)(100 * gBattleMons[var].hp / gBattleMons[var].maxHP) < gAIScriptPtr[2])
+ if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) < gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
-void BattleAICmd_if_hp_more_than(void)
+static void BattleAICmd_if_hp_more_than(void)
{
- u16 var;
+ u16 index;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- if ((u32)(100 * gBattleMons[var].hp / gBattleMons[var].maxHP) > gAIScriptPtr[2])
+ if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) > gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
-void BattleAICmd_if_hp_equal(void)
+static void BattleAICmd_if_hp_equal(void)
{
- u16 var;
+ u16 index;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- if ((u32)(100 * gBattleMons[var].hp / gBattleMons[var].maxHP) == gAIScriptPtr[2])
+ if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) == gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
-void BattleAICmd_if_hp_not_equal(void)
+static void BattleAICmd_if_hp_not_equal(void)
{
- u16 var;
+ u16 index;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- if ((u32)(100 * gBattleMons[var].hp / gBattleMons[var].maxHP) != gAIScriptPtr[2])
+ if ((u32)(100 * gBattleMons[index].hp / gBattleMons[index].maxHP) != gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
-void BattleAICmd_if_status(void)
+static void BattleAICmd_if_status(void)
{
- u16 var;
- u32 temp;
+ u16 index;
+ u32 arg;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- temp = AIScriptRead32(gAIScriptPtr + 2);
+ arg = AIScriptRead32(gAIScriptPtr + 2);
- if (gBattleMons[var].status1 & temp)
+ if ((gBattleMons[index].status1 & arg) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
-void BattleAICmd_if_not_status(void)
+static void BattleAICmd_if_not_status(void)
{
- u16 var;
- u32 temp;
+ u16 index;
+ u32 arg;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- temp = AIScriptRead32(gAIScriptPtr + 2);
+ arg = AIScriptRead32(gAIScriptPtr + 2);
- if (!(gBattleMons[var].status1 & temp))
+ if ((gBattleMons[index].status1 & arg) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
-void BattleAICmd_if_status2(void)
+static void BattleAICmd_if_status2(void)
{
- u8 var;
- u32 temp;
+ u16 index;
+ u32 arg;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- temp = AIScriptRead32(gAIScriptPtr + 2);
+ arg = AIScriptRead32(gAIScriptPtr + 2);
- if (gBattleMons[var].status2 & temp)
+ if ((gBattleMons[index].status2 & arg) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
-void BattleAICmd_if_not_status2(void)
+static void BattleAICmd_if_not_status2(void)
{
- u8 var;
- u32 temp;
+ u16 index;
+ u32 arg;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- temp = AIScriptRead32(gAIScriptPtr + 2);
+ arg = AIScriptRead32(gAIScriptPtr + 2);
- if (!(gBattleMons[var].status2 & temp))
+ if ((gBattleMons[index].status2 & arg) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
-void BattleAICmd_if_status3(void)
+static void BattleAICmd_if_status3(void)
{
- u8 var;
- u32 temp;
+ u16 index;
+ u32 arg;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- temp = AIScriptRead32(gAIScriptPtr + 2);
+ arg = AIScriptRead32(gAIScriptPtr + 2);
- if ( gUnknown_02024C98[var] & temp )
+ if ((gUnknown_02024C98[index] & arg) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
-void BattleAICmd_if_not_status3(void)
+static void BattleAICmd_if_not_status3(void)
{
- u8 var;
- u32 temp;
+ u16 index;
+ u32 arg;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- temp = AIScriptRead32(gAIScriptPtr + 2);
+ arg = AIScriptRead32(gAIScriptPtr + 2);
- if (!(gUnknown_02024C98[var] & temp))
+ if ((gUnknown_02024C98[index] & arg) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
-void BattleAICmd_if_status4(void)
+static void BattleAICmd_if_status4(void)
{
- u8 var;
- u32 temp;
- u32 temp2;
+ u16 index;
+ u32 arg1, arg2;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- temp = battle_get_per_side_status(var) & 1;
- temp2 = AIScriptRead32(gAIScriptPtr + 2);
+ arg1 = battle_get_per_side_status(index) & 1;
+ arg2 = AIScriptRead32(gAIScriptPtr + 2);
- if ( gUnknown_02024C7A[temp] & temp2 )
+ if ((gUnknown_02024C7A[arg1] & arg2) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
-void BattleAICmd_if_not_status4(void)
+static void BattleAICmd_if_not_status4(void)
{
- u8 var;
- u32 temp;
- u32 temp2;
+ u16 index;
+ u32 arg1, arg2;
if (gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- temp = battle_get_per_side_status(var) & 1;
- temp2 = AIScriptRead32(gAIScriptPtr + 2);
+ arg1 = battle_get_per_side_status(index) & 1;
+ arg2 = AIScriptRead32(gAIScriptPtr + 2);
- if (!(gUnknown_02024C7A[temp] & temp2))
+ if ((gUnknown_02024C7A[arg1] & arg2) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
}
-void BattleAICmd_if_less_than(void)
+static void BattleAICmd_if_less_than(void)
{
- if (gAIThinkingSpace.unk8 < gAIScriptPtr[1])
+ if (AI_THINKING_STRUCT->funcResult < gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_if_more_than(void)
+static void BattleAICmd_if_more_than(void)
{
- if (gAIThinkingSpace.unk8 > gAIScriptPtr[1])
+ if (AI_THINKING_STRUCT->funcResult > gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_if_equal(void)
+static void BattleAICmd_if_equal(void)
{
- if (gAIThinkingSpace.unk8 == gAIScriptPtr[1])
+ if (AI_THINKING_STRUCT->funcResult == gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_if_not_equal(void)
+static void BattleAICmd_if_not_equal(void)
{
- if (gAIThinkingSpace.unk8 != gAIScriptPtr[1])
+ if (AI_THINKING_STRUCT->funcResult != gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_if_less_than_32(void)
+static void BattleAICmd_if_less_than_32(void)
{
u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
- if (gAIThinkingSpace.unk8 < *temp)
+ if (AI_THINKING_STRUCT->funcResult < *temp)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
else
gAIScriptPtr += 9;
}
-void BattleAICmd_if_more_than_32(void)
+static void BattleAICmd_if_more_than_32(void)
{
u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
- if (gAIThinkingSpace.unk8 > *temp)
+ if (AI_THINKING_STRUCT->funcResult > *temp)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
else
gAIScriptPtr += 9;
}
-void BattleAICmd_if_equal_32(void)
+static void BattleAICmd_if_equal_32(void)
{
u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
- if (gAIThinkingSpace.unk8 == *temp)
+ if (AI_THINKING_STRUCT->funcResult == *temp)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
else
gAIScriptPtr += 9;
}
-void BattleAICmd_if_not_equal_32(void)
+static void BattleAICmd_if_not_equal_32(void)
{
u8 *temp = AIScriptReadPtr(gAIScriptPtr + 1);
- if (gAIThinkingSpace.unk8 != *temp)
+ if (AI_THINKING_STRUCT->funcResult != *temp)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
else
gAIScriptPtr += 9;
}
-void BattleAICmd_if_move(void)
+static void BattleAICmd_if_move(void)
{
u16 move = AIScriptRead16(gAIScriptPtr + 1);
- if (gAIThinkingSpace.unk2 == move)
+ if (AI_THINKING_STRUCT->moveConsidered == move)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
-void BattleAICmd_if_not_move(void)
+static void BattleAICmd_if_not_move(void)
{
u16 move = AIScriptRead16(gAIScriptPtr + 1);
- if (gAIThinkingSpace.unk2 != move)
+ if (AI_THINKING_STRUCT->moveConsidered != move)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
}
-void BattleAICmd_if_in_bytes(void)
+static void BattleAICmd_if_in_bytes(void)
{
u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1);
- while(*ptr != 0xFF)
- {
- if(gAIThinkingSpace.unk8 == *ptr)
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
- return;
- }
- ptr++;
- }
- gAIScriptPtr += 9;
+ while (*ptr != 0xFF)
+ {
+ if (AI_THINKING_STRUCT->funcResult == *ptr)
+ {
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ return;
+ }
+ ptr++;
+ }
+ gAIScriptPtr += 9;
}
-void BattleAICmd_if_not_in_bytes(void)
+static void BattleAICmd_if_not_in_bytes(void)
{
u8 *ptr = AIScriptReadPtr(gAIScriptPtr + 1);
- while(*ptr != 0xFF)
- {
- if(gAIThinkingSpace.unk8 == *ptr)
- {
- gAIScriptPtr += 9;
- return;
- }
- ptr++;
- }
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ while (*ptr != 0xFF)
+ {
+ if (AI_THINKING_STRUCT->funcResult == *ptr)
+ {
+ gAIScriptPtr += 9;
+ return;
+ }
+ ptr++;
+ }
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
}
-void BattleAICmd_if_in_words(void)
+static void BattleAICmd_if_in_words(void)
{
u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1);
- while(*ptr != 0xFFFF)
- {
- if(gAIThinkingSpace.unk8 == *ptr)
- {
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
- return;
- }
- ptr++;
- }
- gAIScriptPtr += 9;
+ while (*ptr != 0xFFFF)
+ {
+ if (AI_THINKING_STRUCT->funcResult == *ptr)
+ {
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ return;
+ }
+ ptr++;
+ }
+ gAIScriptPtr += 9;
}
-void BattleAICmd_if_not_in_words(void)
+static void BattleAICmd_if_not_in_words(void)
{
u16 *ptr = (u16 *)AIScriptReadPtr(gAIScriptPtr + 1);
- while(*ptr != 0xFFFF)
- {
- if(gAIThinkingSpace.unk8 == *ptr)
- {
- gAIScriptPtr += 9;
- return;
- }
- ptr++;
- }
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
+ while (*ptr != 0xFFFF)
+ {
+ if (AI_THINKING_STRUCT->funcResult == *ptr)
+ {
+ gAIScriptPtr += 9;
+ return;
+ }
+ ptr++;
+ }
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 5);
}
-void BattleAICmd_if_user_can_damage(void)
+static void BattleAICmd_if_user_can_damage(void)
{
- s32 i;
+ s32 i;
- for(i = 0; i < 4; i++)
- {
- if (gBattleMons[gUnknown_02024C07].moves[i] != 0
- && gBattleMoves[gBattleMons[gUnknown_02024C07].moves[i]].power != 0)
- break;
- }
- if(i == 4)
- gAIScriptPtr += 5;
- else
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ if (gBattleMons[gPlayerMonIndex].moves[i] != 0
+ && gBattleMoves[gBattleMons[gPlayerMonIndex].moves[i]].power != 0)
+ break;
+ }
+ if (i == MAX_MON_MOVES)
+ gAIScriptPtr += 5;
+ else
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
}
-void BattleAICmd_if_user_cant_damage(void)
+static void BattleAICmd_if_user_cant_damage(void)
{
- s32 i;
+ s32 i;
- for(i = 0; i < 4; i++)
- {
- if (gBattleMons[gUnknown_02024C07].moves[i] != 0
- && gBattleMoves[gBattleMons[gUnknown_02024C07].moves[i]].power != 0)
- break;
- }
- if(i != 4)
- gAIScriptPtr += 5;
- else
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ if (gBattleMons[gPlayerMonIndex].moves[i] != 0
+ && gBattleMoves[gBattleMons[gPlayerMonIndex].moves[i]].power != 0)
+ break;
+ }
+ if (i != MAX_MON_MOVES)
+ gAIScriptPtr += 5;
+ else
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
}
-void BattleAICmd_unk_21(void)
+static void BattleAICmd_get_turn_count(void)
{
- gAIThinkingSpace.unk8 = gUnknown_030042E0[19];
+ AI_THINKING_STRUCT->funcResult = gUnknown_030042E0[19];
gAIScriptPtr += 1;
}
-void BattleAICmd_get_type(void)
+static void BattleAICmd_get_type(void)
{
- u8 typeVar = gAIScriptPtr[1];
-
- switch(typeVar)
+ switch (gAIScriptPtr[1])
{
- case 1:
- gAIThinkingSpace.unk8 = gBattleMons[gUnknown_02024C07].type1;
- break;
- case 0:
- gAIThinkingSpace.unk8 = gBattleMons[gUnknown_02024C08].type1;
- break;
- case 3:
- gAIThinkingSpace.unk8 = gBattleMons[gUnknown_02024C07].type2;
- break;
- case 2:
- gAIThinkingSpace.unk8 = gBattleMons[gUnknown_02024C08].type2;
- break;
- case 4:
- gAIThinkingSpace.unk8 = gBattleMoves[gAIThinkingSpace.unk2].type;
- break;
+ case 1: // player primary type
+ AI_THINKING_STRUCT->funcResult = gBattleMons[gPlayerMonIndex].type1;
+ break;
+ case 0: // enemy primary type
+ AI_THINKING_STRUCT->funcResult = gBattleMons[gEnemyMonIndex].type1;
+ break;
+ case 3: // player secondary type
+ AI_THINKING_STRUCT->funcResult = gBattleMons[gPlayerMonIndex].type2;
+ break;
+ case 2: // enemy secondary type
+ AI_THINKING_STRUCT->funcResult = gBattleMons[gEnemyMonIndex].type2;
+ break;
+ case 4: // type of move being pointed to
+ AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type;
+ break;
}
gAIScriptPtr += 2;
}
-void BattleAICmd_unk_23(void)
+static void BattleAICmd_get_move_power(void)
{
- gAIThinkingSpace.unk8 = gBattleMoves[gAIThinkingSpace.unk2].power;
+ AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power;
gAIScriptPtr += 1;
}
+#ifdef NONMATCHING
+static void BattleAICmd_is_most_powerful_move(void)
+{
+ int i, j;
+ s32 damages[MAX_MON_MOVES];
+
+ for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
+ if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i])
+ break;
+
+ if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1
+ && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
+ {
+ gUnknown_02024DEC = 0;
+ unk_2000000[0x1601C] = 0; // why is this a manual array?
+ unk_2000000[0x1601F] = 1;
+ gBattleMoveFlags = 0;
+ gCritMultiplier = 1;
+
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++)
+ { // _08108276
+ if (gBattleMoves[gBattleMons[gPlayerMonIndex].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j])
+ break;
+ }
+
+ // _081082BA
+ if (gBattleMons[gPlayerMonIndex].moves[i]
+ && sDiscouragedPowerfulMoveEffects[j] == 0xFFFF
+ && gBattleMoves[gBattleMons[gPlayerMonIndex].moves[i]].power > 1)
+ {
+ gUnknown_02024BE6 = gBattleMons[gPlayerMonIndex].moves[i];
+ sub_801CAF8(gPlayerMonIndex, gEnemyMonIndex);
+ move_effectiveness_something(gUnknown_02024BE6, gPlayerMonIndex, gEnemyMonIndex);
+ damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100;
+
+ if (damages[i] == 0) // moves always do at least 1 damage.
+ damages[i] = 1;
+ }
+ else
+ {
+ damages[i] = 0;
+ }
+ }
+
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex])
+ break;
+
+ if (i == MAX_MON_MOVES)
+ AI_THINKING_STRUCT->funcResult = 2;
+ else
+ AI_THINKING_STRUCT->funcResult = 1;
+ }
+ else
+ {
+ AI_THINKING_STRUCT->funcResult = 0;
+ }
+
+ gAIScriptPtr += 1;
+}
+#else
__attribute__((naked))
-void BattleAICmd_unk_24(void)
+static void BattleAICmd_is_most_powerful_move(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@@ -763,7 +1008,7 @@ void BattleAICmd_unk_24(void)
push {r5-r7}\n\
sub sp, 0x14\n\
movs r3, 0\n\
- ldr r0, _08108328 @ =gUnknown_083F62BC\n\
+ ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
ldrh r1, [r0]\n\
ldr r4, _0810832C @ =0x0000ffff\n\
ldr r6, _08108330 @ =gBattleMoves\n\
@@ -776,7 +1021,7 @@ void BattleAICmd_unk_24(void)
lsls r0, 2\n\
adds r0, r6\n\
ldrb r2, [r0]\n\
- ldr r1, _08108328 @ =gUnknown_083F62BC\n\
+ ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
_0810821E:\n\
ldrh r0, [r1]\n\
cmp r2, r0\n\
@@ -798,7 +1043,7 @@ _0810822E:\n\
b _081083B2\n\
_08108240:\n\
lsls r0, r3, 1\n\
- ldr r1, _08108328 @ =gUnknown_083F62BC\n\
+ ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
adds r0, r1\n\
ldrh r3, [r0]\n\
ldr r0, _0810832C @ =0x0000ffff\n\
@@ -816,20 +1061,20 @@ _08108250:\n\
adds r0, r5, r2\n\
movs r2, 0x1\n\
strb r2, [r0]\n\
- ldr r0, _08108340 @ =gUnknown_02024C68\n\
+ ldr r0, _08108340 @ =gBattleMoveFlags\n\
strb r1, [r0]\n\
ldr r0, _08108344 @ =gCritMultiplier\n\
strb r2, [r0]\n\
movs r6, 0\n\
mov r9, r3\n\
- ldr r0, _08108328 @ =gUnknown_083F62BC\n\
+ ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
ldrh r0, [r0]\n\
str r0, [sp, 0x10]\n\
_08108276:\n\
movs r3, 0\n\
ldr r5, _08108348 @ =gBattleMons\n\
lsls r4, r6, 1\n\
- ldr r7, _0810834C @ =gUnknown_02024C07\n\
+ ldr r7, _0810834C @ =gPlayerMonIndex\n\
lsls r1, r6, 2\n\
mov r8, r1\n\
adds r2, r6, 0x1\n\
@@ -851,7 +1096,7 @@ _08108276:\n\
lsls r0, 2\n\
adds r0, r2\n\
ldrb r2, [r0]\n\
- ldr r1, _08108328 @ =gUnknown_083F62BC\n\
+ ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
_081082AA:\n\
ldrh r0, [r1]\n\
cmp r2, r0\n\
@@ -873,7 +1118,7 @@ _081082BA:\n\
cmp r0, 0\n\
beq _0810835C\n\
lsls r0, r3, 1\n\
- ldr r2, _08108328 @ =gUnknown_083F62BC\n\
+ ldr r2, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
adds r0, r2\n\
ldrh r0, [r0]\n\
cmp r0, r9\n\
@@ -890,7 +1135,7 @@ _081082BA:\n\
ldr r5, _08108350 @ =gUnknown_02024BE6\n\
strh r2, [r5]\n\
ldrb r0, [r7]\n\
- ldr r4, _08108354 @ =gUnknown_02024C08\n\
+ ldr r4, _08108354 @ =gEnemyMonIndex\n\
ldrb r1, [r4]\n\
bl sub_801CAF8\n\
ldrh r0, [r5]\n\
@@ -899,7 +1144,7 @@ _081082BA:\n\
bl move_effectiveness_something\n\
mov r4, sp\n\
add r4, r8\n\
- ldr r2, _08108358 @ =gUnknown_02024BEC\n\
+ ldr r2, _08108358 @ =gBattleMoveDamage\n\
ldr r0, _08108334 @ =0x02016800\n\
adds r0, 0x18\n\
adds r0, r6, r0\n\
@@ -915,19 +1160,19 @@ _081082BA:\n\
str r0, [r4]\n\
b _08108364\n\
.align 2, 0\n\
-_08108328: .4byte gUnknown_083F62BC\n\
+_08108328: .4byte sDiscouragedPowerfulMoveEffects\n\
_0810832C: .4byte 0x0000ffff\n\
_08108330: .4byte gBattleMoves\n\
_08108334: .4byte 0x02016800\n\
_08108338: .4byte gUnknown_02024DEC\n\
_0810833C: .4byte 0xfffff81c\n\
-_08108340: .4byte gUnknown_02024C68\n\
+_08108340: .4byte gBattleMoveFlags\n\
_08108344: .4byte gCritMultiplier\n\
_08108348: .4byte gBattleMons\n\
-_0810834C: .4byte gUnknown_02024C07\n\
+_0810834C: .4byte gPlayerMonIndex\n\
_08108350: .4byte gUnknown_02024BE6\n\
-_08108354: .4byte gUnknown_02024C08\n\
-_08108358: .4byte gUnknown_02024BEC\n\
+_08108354: .4byte gEnemyMonIndex\n\
+_08108358: .4byte gBattleMoveDamage\n\
_0810835C:\n\
mov r1, sp\n\
add r1, r8\n\
@@ -995,69 +1240,71 @@ _081083B8:\n\
_081083D0: .4byte gAIScriptPtr\n\
.syntax divided\n");
}
+#endif // NONMATCHING
-void BattleAICmd_get_move(void)
+static void BattleAICmd_get_move(void)
{
if (gAIScriptPtr[1] == USER)
- gAIThinkingSpace.unk8 = gUnknown_02024C34[gUnknown_02024C07];
+ AI_THINKING_STRUCT->funcResult = gUnknown_02024C34[gPlayerMonIndex];
else
- gAIThinkingSpace.unk8 = gUnknown_02024C34[gUnknown_02024C08];
+ AI_THINKING_STRUCT->funcResult = gUnknown_02024C34[gEnemyMonIndex];
gAIScriptPtr += 2;
}
-void BattleAICmd_if_type(void)
+static void BattleAICmd_if_arg_equal(void)
{
- if ( gAIScriptPtr[1] == gAIThinkingSpace.unk8 )
+ if (gAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_unk_27(void) // if_not_type
+static void BattleAICmd_if_arg_not_equal(void)
{
- if ( gAIScriptPtr[1] != gAIThinkingSpace.unk8 )
+ if (gAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_if_would_go_first(void)
+static void BattleAICmd_if_would_go_first(void)
{
- if ( b_first_side(gUnknown_02024C07, gUnknown_02024C08, 1) == gAIScriptPtr[1] )
+ if (b_first_side(gPlayerMonIndex, gEnemyMonIndex, 1) == gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_if_would_not_go_first(void)
+static void BattleAICmd_if_would_not_go_first(void)
{
- if ( b_first_side(gUnknown_02024C07, gUnknown_02024C08, 1) != gAIScriptPtr[1] )
+ if (b_first_side(gPlayerMonIndex, gEnemyMonIndex, 1) != gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
}
-void BattleAICmd_unk_2A(void)
-{}
+static void BattleAICmd_nullsub_2A(void)
+{
+}
-void BattleAICmd_unk_2B(void)
-{}
+static void BattleAICmd_nullsub_2B(void)
+{
+}
-void BattleAICmd_count_alive_pokemon(void)
+static void BattleAICmd_count_alive_pokemon(void)
{
- u8 index;
struct Pokemon *party;
- struct AI_ThinkingStruct *ai = &battle_2000000.ai;
int i;
+ u8 index;
u8 var, var2;
- ai->unk8 = 0;
+ AI_THINKING_STRUCT->funcResult = 0;
if (gAIScriptPtr[1] == USER)
- index = gUnknown_02024C07;
+ index = gPlayerMonIndex;
else
- index = gUnknown_02024C08;
+ index = gEnemyMonIndex;
if (battle_side_get_owner(index) == 0)
party = gPlayerParty;
@@ -1079,277 +1326,228 @@ void BattleAICmd_count_alive_pokemon(void)
for (i = 0; i < 6; i++)
{
- struct AI_ThinkingStruct *ai2 = &battle_2000000.ai;
if (i != var && i != var2
&& GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG)
{
- ai2->unk8++;
+ AI_THINKING_STRUCT->funcResult++;
}
}
gAIScriptPtr += 2;
}
-void BattleAICmd_unk_2D(void)
+static void BattleAICmd_get_considered_move(void)
{
- gAIThinkingSpace.unk8 = gAIThinkingSpace.unk2;
+ AI_THINKING_STRUCT->funcResult = AI_THINKING_STRUCT->moveConsidered;
gAIScriptPtr += 1;
}
-void BattleAICmd_unk_2E(void)
+static void BattleAICmd_get_considered_move_effect(void)
{
- gAIThinkingSpace.unk8 = gBattleMoves[gAIThinkingSpace.unk2].effect;
+ AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect;
gAIScriptPtr += 1;
}
-void BattleAICmd_get_ability(void)
+static void BattleAICmd_get_ability(void)
{
- u8 var;
+ u8 index;
- if(gAIScriptPtr[1] == USER)
- var = gUnknown_02024C07;
+ if (gAIScriptPtr[1] == USER)
+ index = gPlayerMonIndex;
else
- var = gUnknown_02024C08;
+ index = gEnemyMonIndex;
- if(battle_side_get_owner(var) == TARGET)
+ if (battle_side_get_owner(index) == TARGET)
{
- u16 unk = battle_get_per_side_status(var) & 1;
+ u16 unk = battle_get_per_side_status(index) & 1;
- if(unk_2016A00.unk20[unk] != 0)
+ if (UNK_2016A00_STRUCT->unk20[unk] != 0)
{
- ((struct AI_ThinkingStruct *)((u8 *)&unk_2016A00 - 512))->unk8 = unk_2016A00.unk20[unk];
+ AI_THINKING_STRUCT->funcResult = UNK_2016A00_STRUCT->unk20[unk];
gAIScriptPtr += 2;
return;
}
// abilities that prevent fleeing.
- if(gBattleMons[var].ability == ABILITY_SHADOW_TAG || gBattleMons[var].ability == ABILITY_MAGNET_PULL || gBattleMons[var].ability == ABILITY_ARENA_TRAP)
+ if (gBattleMons[index].ability == ABILITY_SHADOW_TAG
+ || gBattleMons[index].ability == ABILITY_MAGNET_PULL
+ || gBattleMons[index].ability == ABILITY_ARENA_TRAP)
{
- gAIThinkingSpace.unk8 = gBattleMons[var].ability;
+ AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability;
gAIScriptPtr += 2;
return;
}
- if(gBaseStats[gBattleMons[var].species].ability1 != ABILITY_NONE)
+ if (gBaseStats[gBattleMons[index].species].ability1 != ABILITY_NONE)
{
- if(gBaseStats[gBattleMons[var].species].ability2 != ABILITY_NONE)
+ if (gBaseStats[gBattleMons[index].species].ability2 != ABILITY_NONE)
{
- // AI is guessing what ability?
- if(Random() & 1)
+ // AI has no knowledge of opponent, so it guesses which ability.
+ if (Random() % 2)
{
- ((struct AI_ThinkingStruct *)((u8 *)&unk_2016A00 - 0x200))->unk8 = gBaseStats[gBattleMons[var].species].ability1;
- gAIScriptPtr += 2;
- return;
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1;
}
else
{
- ((struct AI_ThinkingStruct *)((u8 *)&unk_2016A00 - 0x200))->unk8 = gBaseStats[gBattleMons[var].species].ability2;
- gAIScriptPtr += 2;
- return;
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2;
}
}
else
{
- ((struct AI_ThinkingStruct *)((u8 *)&unk_2016A00 - 0x200))->unk8 = gBaseStats[gBattleMons[var].species].ability1; // it's definitely ability 1.
- gAIScriptPtr += 2;
- return;
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability1; // it's definitely ability 1.
}
}
else
{
- ((struct AI_ThinkingStruct *)((u8 *)&unk_2016A00 - 0x200))->unk8 = gBaseStats[gBattleMons[var].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
- gAIScriptPtr += 2;
- return;
+ AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[index].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
}
}
else
{
// The AI knows its own ability.
- gAIThinkingSpace.unk8 = gBattleMons[var].ability;
- gAIScriptPtr += 2;
- return;
+ AI_THINKING_STRUCT->funcResult = gBattleMons[index].ability;
}
+ gAIScriptPtr += 2;
}
-void BattleAICmd_unk_30(void)
+static void BattleAICmd_get_highest_possible_damage(void)
{
s32 i;
- struct AI_ThinkingStruct *ai;
- struct AI_ThinkingStruct *ai2;
gUnknown_02024DEC = 0;
- battle_2000000.unk.unk1 = 0;
- battle_2000000.unk.unk4 = 1;
- gUnknown_02024C68 = 0;
+ BATTLE_STRUCT->unk.unk1 = 0;
+ BATTLE_STRUCT->unk.unk4 = 1;
+ gBattleMoveFlags = 0;
gCritMultiplier = 1;
- ai = &battle_2000000.ai;
- ai->unk8 = 0;
+ AI_THINKING_STRUCT->funcResult = 0;
- for(i = 0; i < 4; i++)
+ for (i = 0; i < MAX_MON_MOVES; i++)
{
- gUnknown_02024BEC = 40;
- gUnknown_02024BE6 = gBattleMons[gUnknown_02024C07].moves[i];
+ gBattleMoveDamage = 40;
+ gUnknown_02024BE6 = gBattleMons[gPlayerMonIndex].moves[i];
if (gUnknown_02024BE6)
{
- move_effectiveness_something(gUnknown_02024BE6, gUnknown_02024C07, gUnknown_02024C08);
+ move_effectiveness_something(gUnknown_02024BE6, gPlayerMonIndex, gEnemyMonIndex);
// reduce by 1/3.
- if (gUnknown_02024BEC == 120)
- gUnknown_02024BEC = 80;
- if(gUnknown_02024BEC == 240)
- gUnknown_02024BEC = 160;
- if(gUnknown_02024BEC == 30)
- gUnknown_02024BEC = 20;
- if(gUnknown_02024BEC == 15)
- gUnknown_02024BEC = 10;
-
- if(gUnknown_02024C68 & 8)
- gUnknown_02024BEC = 0;
-
- ai2 = &battle_2000000.ai;
- if (ai2->unk8 < gUnknown_02024BEC)
- ai2->unk8 = gUnknown_02024BEC;
+ if (gBattleMoveDamage == 120)
+ gBattleMoveDamage = 80;
+ if (gBattleMoveDamage == 240)
+ gBattleMoveDamage = 160;
+ if (gBattleMoveDamage == 30)
+ gBattleMoveDamage = 20;
+ if (gBattleMoveDamage == 15)
+ gBattleMoveDamage = 10;
+
+ if (gBattleMoveFlags & 8) // if it's a status move, it wont do anything.
+ gBattleMoveDamage = 0;
+
+ if (AI_THINKING_STRUCT->funcResult < gBattleMoveDamage)
+ AI_THINKING_STRUCT->funcResult = gBattleMoveDamage;
}
}
gAIScriptPtr += 1;
}
-// same function as above but no for loop.
-__attribute__((naked))
-void BattleAICmd_if_damage_bonus(void)
+static void BattleAICmd_if_damage_bonus(void)
{
- asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- ldr r0, _08108928 @ =gUnknown_02024DEC\n\
- movs r1, 0\n\
- strh r1, [r0]\n\
- ldr r2, _0810892C @ =0x02000000\n\
- ldr r3, _08108930 @ =0x0001601c\n\
- adds r0, r2, r3\n\
- strb r1, [r0]\n\
- adds r3, 0x3\n\
- adds r0, r2, r3\n\
- movs r3, 0x1\n\
- strb r3, [r0]\n\
- ldr r5, _08108934 @ =gUnknown_02024C68\n\
- strb r1, [r5]\n\
- ldr r0, _08108938 @ =gCritMultiplier\n\
- strb r3, [r0]\n\
- ldr r4, _0810893C @ =gUnknown_02024BEC\n\
- movs r0, 0x28\n\
- str r0, [r4]\n\
- ldr r1, _08108940 @ =gUnknown_02024BE6\n\
- movs r0, 0xB4\n\
- lsls r0, 9\n\
- adds r2, r0\n\
- ldrh r0, [r2, 0x2]\n\
- strh r0, [r1]\n\
- ldrh r0, [r1]\n\
- ldr r1, _08108944 @ =gUnknown_02024C07\n\
- ldrb r1, [r1]\n\
- ldr r2, _08108948 @ =gUnknown_02024C08\n\
- ldrb r2, [r2]\n\
- bl move_effectiveness_something\n\
- ldr r0, [r4]\n\
- cmp r0, 0x78\n\
- bne _081088D6\n\
- movs r0, 0x50\n\
- str r0, [r4]\n\
-_081088D6:\n\
- ldr r0, [r4]\n\
- cmp r0, 0xF0\n\
- bne _081088E0\n\
- movs r0, 0xA0\n\
- str r0, [r4]\n\
-_081088E0:\n\
- ldr r0, [r4]\n\
- cmp r0, 0x1E\n\
- bne _081088EA\n\
- movs r0, 0x14\n\
- str r0, [r4]\n\
-_081088EA:\n\
- ldr r0, [r4]\n\
- cmp r0, 0xF\n\
- bne _081088F4\n\
- movs r0, 0xA\n\
- str r0, [r4]\n\
-_081088F4:\n\
- ldrb r1, [r5]\n\
- movs r0, 0x8\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08108902\n\
- movs r0, 0\n\
- str r0, [r4]\n\
-_08108902:\n\
- ldrb r0, [r4]\n\
- ldr r3, _0810894C @ =gAIScriptPtr\n\
- ldr r2, [r3]\n\
- ldrb r1, [r2, 0x1]\n\
- cmp r0, r1\n\
- bne _08108950\n\
- ldrb r1, [r2, 0x2]\n\
- ldrb r0, [r2, 0x3]\n\
- lsls r0, 8\n\
- orrs r1, r0\n\
- ldrb r0, [r2, 0x4]\n\
- lsls r0, 16\n\
- orrs r1, r0\n\
- ldrb r0, [r2, 0x5]\n\
- lsls r0, 24\n\
- orrs r1, r0\n\
- str r1, [r3]\n\
- b _08108954\n\
- .align 2, 0\n\
-_08108928: .4byte gUnknown_02024DEC\n\
-_0810892C: .4byte 0x02000000\n\
-_08108930: .4byte 0x0001601c\n\
-_08108934: .4byte gUnknown_02024C68\n\
-_08108938: .4byte gCritMultiplier\n\
-_0810893C: .4byte gUnknown_02024BEC\n\
-_08108940: .4byte gUnknown_02024BE6\n\
-_08108944: .4byte gUnknown_02024C07\n\
-_08108948: .4byte gUnknown_02024C08\n\
-_0810894C: .4byte gAIScriptPtr\n\
-_08108950:\n\
- adds r0, r2, 0x6\n\
- str r0, [r3]\n\
-_08108954:\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided\n");
+ u8 damageVar;
+
+ gUnknown_02024DEC = 0;
+ BATTLE_STRUCT->unk.unk1 = 0;
+ BATTLE_STRUCT->unk.unk4 = 1;
+ gBattleMoveFlags = 0;
+ gCritMultiplier = 1;
+
+ gBattleMoveDamage = 40;
+ gUnknown_02024BE6 = AI_THINKING_STRUCT->moveConsidered;
+
+ move_effectiveness_something(gUnknown_02024BE6, gPlayerMonIndex, gEnemyMonIndex);
+
+ if (gBattleMoveDamage == 120)
+ gBattleMoveDamage = 80;
+ if (gBattleMoveDamage == 240)
+ gBattleMoveDamage = 160;
+ if (gBattleMoveDamage == 30)
+ gBattleMoveDamage = 20;
+ if (gBattleMoveDamage == 15)
+ gBattleMoveDamage = 10;
+
+ if (gBattleMoveFlags & 8)
+ gBattleMoveDamage = 0;
+
+ // store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8.
+ damageVar = gBattleMoveDamage;
+
+ if (damageVar == gAIScriptPtr[1])
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ else
+ gAIScriptPtr += 6;
}
-void BattleAICmd_unk_32(void)
-{}
+static void BattleAICmd_nullsub_32(void)
+{
+}
-void BattleAICmd_unk_33(void)
-{}
+static void BattleAICmd_nullsub_33(void)
+{
+}
-void BattleAICmd_if_status_in_party(void)
+static void BattleAICmd_if_status_in_party(void)
{
struct Pokemon *party;
+ struct Pokemon *partyPtr;
int i;
u32 statusToCompareTo;
- if (gAIScriptPtr[1] == USER)
+ // for whatever reason, game freak put the party pointer into 2 variables instead of 1. it's possible at some point the switch encompassed the whole function and used each respective variable creating largely duplicate code.
+ switch (gAIScriptPtr[1])
{
- party = gEnemyParty;
+ case 1:
+ party = partyPtr = gEnemyParty;
+ break;
+ default:
+ party = partyPtr = gPlayerParty;
+ break;
}
- else if (0)
+
+ statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
+
+ for (i = 0; i < 6; i++)
{
- // what is going on here?
- follow_jump:
- gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
- return;
+ u16 species = GetMonData(&party[i], MON_DATA_SPECIES);
+ u16 hp = GetMonData(&party[i], MON_DATA_HP);
+ u32 status = GetMonData(&party[i], MON_DATA_STATUS);
+
+ if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo)
+ {
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6); // WHAT. why is this being merged into the above switch
+ return;
+ }
}
- else
+
+ gAIScriptPtr += 10;
+}
+
+// bugged, doesnt return properly. also unused
+static void BattleAICmd_if_status_not_in_party(void)
+{
+ struct Pokemon *party;
+ struct Pokemon *partyPtr;
+ int i;
+ u32 statusToCompareTo;
+
+ switch (gAIScriptPtr[1])
{
- party = gPlayerParty;
+ case 1:
+ party = partyPtr = gEnemyParty;
+ break;
+ default:
+ party = partyPtr = gPlayerParty;
+ break;
}
statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
@@ -1360,9 +1558,590 @@ void BattleAICmd_if_status_in_party(void)
u16 hp = GetMonData(&party[i], MON_DATA_HP);
u32 status = GetMonData(&party[i], MON_DATA_STATUS);
+ // everytime the status is found, the AI's logic jumps further and further past its intended destination. this results in a broken AI macro and is probably why it is unused.
if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo)
- goto follow_jump;
+ gAIScriptPtr += 10; // doesnt return?
}
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
+}
- gAIScriptPtr += 10;
+static void BattleAICmd_get_weather(void)
+{
+ if (gBattleWeather & 7)
+ AI_THINKING_STRUCT->funcResult = WEATHER_RAIN;
+ if (gBattleWeather & 0x18)
+ AI_THINKING_STRUCT->funcResult = WEATHER_SANDSTORM;
+ if (gBattleWeather & 0x60)
+ AI_THINKING_STRUCT->funcResult = WEATHER_SUN;
+ if (gBattleWeather & 0x80)
+ AI_THINKING_STRUCT->funcResult = WEATHER_HAIL;
+
+ gAIScriptPtr += 1;
+}
+
+static void BattleAICmd_if_effect(void)
+{
+ if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == gAIScriptPtr[1])
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ else
+ gAIScriptPtr += 6;
+}
+
+static void BattleAICmd_if_not_effect(void)
+{
+ if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect != gAIScriptPtr[1])
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ else
+ gAIScriptPtr += 6;
+}
+
+static void BattleAICmd_if_stat_level_less_than(void)
+{
+ u32 party;
+
+ if (gAIScriptPtr[1] == USER)
+ party = gPlayerMonIndex;
+ else
+ party = gEnemyMonIndex;
+
+ if (gBattleMons[party].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3])
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ else
+ gAIScriptPtr += 8;
+}
+
+static void BattleAICmd_if_stat_level_more_than(void)
+{
+ u32 party;
+
+ if (gAIScriptPtr[1] == USER)
+ party = gPlayerMonIndex;
+ else
+ party = gEnemyMonIndex;
+
+ if (gBattleMons[party].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3])
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ else
+ gAIScriptPtr += 8;
+}
+
+static void BattleAICmd_if_stat_level_equal(void)
+{
+ u32 party;
+
+ if (gAIScriptPtr[1] == USER)
+ party = gPlayerMonIndex;
+ else
+ party = gEnemyMonIndex;
+
+ if (gBattleMons[party].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3])
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ else
+ gAIScriptPtr += 8;
+}
+
+static void BattleAICmd_if_stat_level_not_equal(void)
+{
+ u32 party;
+
+ if (gAIScriptPtr[1] == USER)
+ party = gPlayerMonIndex;
+ else
+ party = gEnemyMonIndex;
+
+ if (gBattleMons[party].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3])
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ else
+ gAIScriptPtr += 8;
+}
+
+static void BattleAICmd_if_can_faint(void)
+{
+ if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2)
+ {
+ gAIScriptPtr += 5;
+ return;
+ }
+
+ gUnknown_02024DEC = 0;
+ BATTLE_STRUCT->unk.unk1 = 0;
+ BATTLE_STRUCT->unk.unk4 = 1;
+ gBattleMoveFlags = 0;
+ gCritMultiplier = 1;
+ gUnknown_02024BE6 = AI_THINKING_STRUCT->moveConsidered;
+ sub_801CAF8(gPlayerMonIndex, gEnemyMonIndex);
+ move_effectiveness_something(gUnknown_02024BE6, gPlayerMonIndex, gEnemyMonIndex);
+
+ gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;
+
+ // moves always do at least 1 damage.
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+
+ if (gBattleMons[gEnemyMonIndex].hp <= gBattleMoveDamage)
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ else
+ gAIScriptPtr += 5;
+}
+
+static void BattleAICmd_if_cant_faint(void)
+{
+ if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power < 2)
+ {
+ gAIScriptPtr += 5;
+ return;
+ }
+
+ gUnknown_02024DEC = 0;
+ BATTLE_STRUCT->unk.unk1 = 0;
+ BATTLE_STRUCT->unk.unk4 = 1;
+ gBattleMoveFlags = 0;
+ gCritMultiplier = 1;
+ gUnknown_02024BE6 = AI_THINKING_STRUCT->moveConsidered;
+ sub_801CAF8(gPlayerMonIndex, gEnemyMonIndex);
+ move_effectiveness_something(gUnknown_02024BE6, gPlayerMonIndex, gEnemyMonIndex);
+
+ gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;
+
+ // this macro is missing the damage 0 = 1 assumption.
+
+ if (gBattleMons[gEnemyMonIndex].hp > gBattleMoveDamage)
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ else
+ gAIScriptPtr += 5;
+}
+
+static void BattleAICmd_if_has_move(void)
+{
+ int i;
+ u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2);
+
+ switch (gAIScriptPtr[1])
+ {
+ case 1:
+ case 3:
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ if (gBattleMons[gPlayerMonIndex].moves[i] == *temp_ptr)
+ break;
+ }
+ if (i == MAX_MON_MOVES)
+ gAIScriptPtr += 8;
+ else
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ break;
+ case 0:
+ case 2:
+ for (i = 0; i < 8; i++)
+ {
+ if (UNK_2016A00_STRUCT->movesUsed[gEnemyMonIndex >> 1][i] == *temp_ptr)
+ break;
+ }
+ if (i == 8)
+ gAIScriptPtr += 8;
+ else
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ break;
+ }
+}
+
+static void BattleAICmd_if_dont_have_move(void)
+{
+ int i;
+ u16 *temp_ptr = (u16 *)(gAIScriptPtr + 2);
+
+ switch (gAIScriptPtr[1])
+ {
+ case 1:
+ case 3:
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ if (gBattleMons[gPlayerMonIndex].moves[i] == *temp_ptr)
+ break;
+ }
+ if (i != MAX_MON_MOVES)
+ gAIScriptPtr += 8;
+ else
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ break;
+ case 0:
+ case 2:
+ for (i = 0; i < 8; i++)
+ {
+ if (UNK_2016A00_STRUCT->movesUsed[gEnemyMonIndex >> 1][i] == *temp_ptr)
+ break;
+ }
+ if (i != 8)
+ gAIScriptPtr += 8;
+ else
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
+ break;
+ }
+}
+
+static void BattleAICmd_if_move_effect(void)
+{
+ int i;
+
+ switch (gAIScriptPtr[1])
+ {
+ case 1:
+ case 3:
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ if (gBattleMons[gPlayerMonIndex].moves[i] != 0 && gBattleMoves[gBattleMons[gPlayerMonIndex].moves[i]].effect == gAIScriptPtr[2])
+ break;
+ }
+ if (i != MAX_MON_MOVES)
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ else
+ gAIScriptPtr += 7;
+ break;
+ case 0:
+ case 2:
+ for (i = 0; i < 8; i++)
+ {
+ if (gBattleMons[gPlayerMonIndex].moves[i] != 0 && gBattleMoves[UNK_2016A00_STRUCT->movesUsed[gEnemyMonIndex >> 1][i]].effect == gAIScriptPtr[2])
+ break;
+ }
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ }
+}
+
+static void BattleAICmd_if_not_move_effect(void)
+{
+ int i;
+
+ switch (gAIScriptPtr[1])
+ {
+ case 1:
+ case 3:
+ for (i = 0; i < MAX_MON_MOVES; i++)
+ {
+ if (gBattleMons[gPlayerMonIndex].moves[i] != 0 && gBattleMoves[gBattleMons[gPlayerMonIndex].moves[i]].effect == gAIScriptPtr[2])
+ break;
+ }
+ if (i != MAX_MON_MOVES)
+ gAIScriptPtr += 7;
+ else
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ break;
+ case 0:
+ case 2:
+ for (i = 0; i < 8; i++)
+ {
+ if (UNK_2016A00_STRUCT->movesUsed[gEnemyMonIndex >> 1][i] != 0 && gBattleMoves[UNK_2016A00_STRUCT->movesUsed[gEnemyMonIndex >> 1][i]].effect == gAIScriptPtr[2])
+ break;
+ }
+ gAIScriptPtr += 7;
+ }
+}
+
+static void BattleAICmd_if_last_move_did_damage(void)
+{
+ u8 index;
+
+ if (gAIScriptPtr[1] == USER)
+ index = gPlayerMonIndex;
+ else
+ index = gEnemyMonIndex;
+
+ if (gAIScriptPtr[2] == 0)
+ {
+ if (gUnknown_02024CA8[index].unk4 == 0)
+ {
+ gAIScriptPtr += 7;
+ return;
+ }
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ return;
+ }
+ else if (gAIScriptPtr[2] != 1) // ignore the macro if its not 0 or 1.
+ {
+ gAIScriptPtr += 7;
+ return;
+ }
+ else if (gUnknown_02024CA8[index].unk6 != 0)
+ {
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
+ return;
+ }
+ gAIScriptPtr += 7;
+}
+
+static void BattleAICmd_if_encored(void)
+{
+ switch (gAIScriptPtr[1])
+ {
+ case 0: // _08109348
+ if (gUnknown_02024CA8[gUnknown_02024A60].unk4 == AI_THINKING_STRUCT->moveConsidered)
+ {
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ return;
+ }
+ gAIScriptPtr += 6;
+ return;
+ case 1: // _08109370
+ if (gUnknown_02024CA8[gUnknown_02024A60].unk6 == AI_THINKING_STRUCT->moveConsidered)
+ {
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ return;
+ }
+ gAIScriptPtr += 6;
+ return;
+ default:
+ gAIScriptPtr += 6;
+ return;
+ }
+}
+
+static void BattleAICmd_flee(void)
+{
+ AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_FLEE being enabled.
+}
+
+static void BattleAICmd_if_random_100(void)
+{
+ u8 safariFleeRate = BATTLE_STRUCT->safariFleeRate * 5; // safari flee rate, from 0-20
+
+ if ((u8)(Random() % 100) < safariFleeRate)
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ else
+ gAIScriptPtr += 5;
+}
+
+static void BattleAICmd_watch(void)
+{
+ AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); // what matters is AI_ACTION_WATCH being enabled.
+}
+
+static void BattleAICmd_get_hold_effect(void)
+{
+ u8 index;
+ u16 status;
+
+ if (gAIScriptPtr[1] == USER)
+ index = gPlayerMonIndex;
+ else
+ index = gEnemyMonIndex;
+
+ if (battle_side_get_owner(index) == 0)
+ {
+ status = (battle_get_per_side_status(index) & 1);
+ AI_THINKING_STRUCT->funcResult = UNK_2016A00_STRUCT->unk22[status];
+ }
+ else
+ AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[index].item);
+
+ gAIScriptPtr += 2;
+}
+
+static void BattleAICmd_get_gender(void)
+{
+ u8 index;
+
+ if (gAIScriptPtr[1] == USER)
+ index = gPlayerMonIndex;
+ else
+ index = gEnemyMonIndex;
+
+ AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[index].species, gBattleMons[index].personality);
+
+ gAIScriptPtr += 2;
+}
+
+static void BattleAICmd_is_first_turn(void)
+{
+ u8 index;
+
+ if (gAIScriptPtr[1] == USER)
+ index = gPlayerMonIndex;
+ else
+ index = gEnemyMonIndex;
+
+ AI_THINKING_STRUCT->funcResult = gUnknown_02024CA8[index].unk16;
+
+ gAIScriptPtr += 2;
+}
+
+static void BattleAICmd_get_stockpile_count(void)
+{
+ u8 index;
+
+ if (gAIScriptPtr[1] == USER)
+ index = gPlayerMonIndex;
+ else
+ index = gEnemyMonIndex;
+
+ AI_THINKING_STRUCT->funcResult = gUnknown_02024CA8[index].unk9;
+
+ gAIScriptPtr += 2;
+}
+
+static void BattleAICmd_is_double_battle(void)
+{
+ AI_THINKING_STRUCT->funcResult = gBattleTypeFlags & BATTLE_TYPE_DOUBLE;
+
+ gAIScriptPtr += 1;
+}
+
+static void BattleAICmd_get_item(void)
+{
+ u8 index;
+
+ if (gAIScriptPtr[1] == USER)
+ index = gPlayerMonIndex;
+ else
+ index = gEnemyMonIndex;
+
+ // this hack and a half matches. whatever. i dont care. someone else fix this mess later. PS: still cant fix this.
+ AI_THINKING_STRUCT->funcResult = unk_2000000[0x160CC + (index * 2)];
+
+ gAIScriptPtr += 2;
+}
+
+static void BattleAICmd_get_move_type_from_result(void)
+{
+ AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].type;
+
+ gAIScriptPtr += 1;
+}
+
+static void BattleAICmd_get_move_power_from_result(void)
+{
+ AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].power;
+
+ gAIScriptPtr += 1;
+}
+
+static void BattleAICmd_get_move_effect_from_result(void)
+{
+ AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->funcResult].effect;
+
+ gAIScriptPtr += 1;
+}
+
+static void BattleAICmd_get_protect_count(void)
+{
+ u8 index;
+
+ if (gAIScriptPtr[1] == USER)
+ index = gPlayerMonIndex;
+ else
+ index = gEnemyMonIndex;
+
+ AI_THINKING_STRUCT->funcResult = gUnknown_02024CA8[index].unk8;
+
+ gAIScriptPtr += 2;
+}
+
+static void BattleAICmd_nullsub_52(void)
+{
+}
+
+static void BattleAICmd_nullsub_53(void)
+{
+}
+
+static void BattleAICmd_nullsub_54(void)
+{
+}
+
+static void BattleAICmd_nullsub_55(void)
+{
+}
+
+static void BattleAICmd_nullsub_56(void)
+{
+}
+
+static void BattleAICmd_nullsub_57(void)
+{
+}
+
+static void BattleAICmd_call(void)
+{
+ AIStackPushVar(gAIScriptPtr + 5);
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+}
+
+static void BattleAICmd_jump(void)
+{
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+}
+
+static void BattleAICmd_end(void)
+{
+ if (AIStackPop() == FALSE)
+ AI_THINKING_STRUCT->aiAction |= AI_ACTION_DONE;
+}
+
+static void BattleAICmd_if_level_compare(void)
+{
+ switch (gAIScriptPtr[1])
+ {
+ case 0: // greater than
+ if (gBattleMons[gPlayerMonIndex].level > gBattleMons[gEnemyMonIndex].level)
+ {
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ return;
+ }
+ gAIScriptPtr += 6;
+ return;
+ case 1: // less than
+ if (gBattleMons[gPlayerMonIndex].level < gBattleMons[gEnemyMonIndex].level)
+ {
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ return;
+ }
+ gAIScriptPtr += 6;
+ return;
+ case 2: // equal
+ if (gBattleMons[gPlayerMonIndex].level == gBattleMons[gEnemyMonIndex].level)
+ {
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
+ return;
+ }
+ gAIScriptPtr += 6;
+ return;
+ }
+}
+
+static void BattleAICmd_if_taunted(void)
+{
+ if (gUnknown_02024CA8[gEnemyMonIndex].taunt != 0)
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ else
+ gAIScriptPtr += 5;
+}
+
+static void BattleAICmd_if_not_taunted(void)
+{
+ if (gUnknown_02024CA8[gEnemyMonIndex].taunt == 0)
+ gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
+ else
+ gAIScriptPtr += 5;
+}
+
+void AIStackPushVar(u8 *var)
+{
+ AI_STACK->ptr[AI_STACK->size++] = var;
+}
+
+// unused
+void AIStackPushAIPtr(void)
+{
+ AI_STACK->ptr[AI_STACK->size++] = gAIScriptPtr;
+}
+
+bool8 AIStackPop(void)
+{
+ if (AI_STACK->size != 0)
+ {
+ --AI_STACK->size;
+ gAIScriptPtr = AI_STACK->ptr[AI_STACK->size];
+ return TRUE;
+ }
+ else
+ return FALSE;
}
diff --git a/src/battle_anim.c b/src/battle_anim.c
new file mode 100644
index 000000000..c381f4f87
--- /dev/null
+++ b/src/battle_anim.c
@@ -0,0 +1,2257 @@
+#include "global.h"
+#include "asm.h"
+#include "decompress.h"
+#include "m4a.h"
+#include "palette.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "battle_anim.h"
+
+extern u8 unk_2000000[];
+extern u16 gUnknown_02024A6A[4];
+extern u8 gUnknown_02024BE0[];
+extern u8 gPlayerMonIndex;
+extern u8 gEnemyMonIndex;
+EWRAM_DATA const u8 *gBattleAnimScriptPtr = NULL;
+EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL;
+EWRAM_DATA void (*gUnknown_0202F7AC)(void) = NULL;
+EWRAM_DATA s8 gUnknown_0202F7B0 = 0;
+EWRAM_DATA u8 gUnknown_0202F7B1 = 0;
+EWRAM_DATA u8 gUnknown_0202F7B2 = 0;
+EWRAM_DATA u8 gUnknown_0202F7B3 = 0;
+EWRAM_DATA u32 gUnknown_0202F7B4 = 0;
+EWRAM_DATA u32 gUnknown_0202F7B8 = 0;
+EWRAM_DATA u16 gUnknown_0202F7BC = 0;
+EWRAM_DATA u8 gUnknown_0202F7BE = 0;
+EWRAM_DATA u16 gUnknown_0202F7C0 = 0;
+EWRAM_DATA u8 gUnknown_0202F7C2[2] = {0};
+EWRAM_DATA u8 gUnknown_0202F7C4 = 0;
+EWRAM_DATA u8 gUnknown_0202F7C5 = 0;
+EWRAM_DATA u16 gUnknown_0202F7C6 = 0;
+EWRAM_DATA u8 gUnknown_0202F7C8 = 0;
+EWRAM_DATA u8 gUnknown_0202F7C9 = 0;
+EWRAM_DATA u16 gUnknown_0202F7CA[4] = {0};
+EWRAM_DATA u8 gUnknown_0202F7D2 = 0;
+extern u16 gUnknown_030041B4;
+extern u16 gUnknown_03004200;
+extern u16 gUnknown_03004240;
+extern u16 gUnknown_03004244;
+extern u16 gUnknown_03004280;
+extern u16 gUnknown_03004288;
+extern u16 gUnknown_030042C0;
+extern u16 gUnknown_030042C4;
+extern u16 gUnknown_03004AF0;
+extern u16 gUnknown_03004B10[8];
+extern s16 gBattleAnimArgs[8];
+extern struct MusicPlayerInfo gMPlay_BGM;
+extern struct MusicPlayerInfo gMPlay_SE1;
+extern struct MusicPlayerInfo gMPlay_SE2;
+
+extern const u16 gUnknown_081C7160[];
+extern const u8 *const gBattleAnims_Moves[];
+extern const struct SpriteSheet gBattleAnimPicTable[];
+extern const struct SpritePalette gBattleAnimPaletteTable[];
+extern const struct BattleAnimBackground gBattleAnimBackgroundTable[];
+
+extern void sub_8079E24();
+extern void sub_8043EB4();
+extern u8 sub_8079E90();
+extern u8 sub_8077ABC();
+extern u8 sub_8078874(u8);
+extern void sub_8078914();
+extern u8 sub_80AEB1C();
+extern void sub_80E4EF8(int, int, int, int, u16, u8, int);
+extern void sub_800D238();
+extern u8 sub_80789BC();
+extern void sub_80AB2AC(void);
+extern void sub_800D7B8(void);
+extern u8 obj_id_for_side_relative_to_move();
+extern u8 battle_get_per_side_status_permutated();
+
+static void sub_80759D0(void);
+static void ScriptCmd_loadsprite(void);
+static void ScriptCmd_unloadsprite(void);
+static void ScriptCmd_sprite(void);
+static void ScriptCmd_createtask(void);
+static void ScriptCmd_delay(void);
+static void ScriptCmd_wait(void);
+static void ScriptCmd_hang1(void);
+static void ScriptCmd_hang2(void);
+static void ScriptCmd_end(void);
+static void ScriptCmd_playse(void);
+static void ScriptCmd_monbg(void);
+static void sub_8076380(void);
+static void task_pA_ma0A_obj_to_bg_pal(u8);
+static void ScriptCmd_clearmonbg(void);
+static void sub_807672C(u8);
+static void ScriptCmd_monbg_22(void);
+static void ScriptCmd_clearmonbg_23(void);
+static void sub_80769A4(u8);
+static void ScriptCmd_setalpha(void);
+static void ScriptCmd_setbldcnt(void);
+static void ScriptCmd_blendoff(void);
+static void ScriptCmd_call(void);
+static void ScriptCmd_return(void);
+static void ScriptCmd_setvar(void);
+static void ScriptCmd_ifelse(void);
+static void ScriptCmd_jumpif(void);
+static void ScriptCmd_jump(void);
+static void ScriptCmd_fadetobg(void);
+static void ScriptCmd_fadetobg_25(void);
+static void task_p5_load_battle_screen_elements(u8);
+static void sub_8076DB8(u16);
+static void dp01t_11_3_message_for_player_only(void);
+static void ScriptCmd_restorebg(void);
+static void ScriptCmd_waitbgfadeout(void);
+static void ScriptCmd_waitbgfadein(void);
+static void ScriptCmd_changebg(void);
+static void ScriptCmd_panse_19(void);
+static void ScriptCmd_setpan(void);
+static void ScriptCmd_panse_1B(void);
+static void c3_08073CEC(u8);
+static void ScriptCmd_panse_26(void);
+static void ScriptCmd_panse_27(void);
+static void ScriptCmd_panse_1C(void);
+static void sub_80774FC(u8);
+static void ScriptCmd_panse_1D(void);
+static void sub_80775CC(u8);
+static void ScriptCmd_createtask_1F(void);
+static void ScriptCmd_waitsound(void);
+static void ScriptCmd_jumpvareq(void);
+static void ScriptCmd_jumpunkcond(void);
+static void ScriptCmd_monbgprio_28(void);
+static void ScriptCmd_monbgprio_29(void);
+static void ScriptCmd_monbgprio_2A(void);
+static void ScriptCmd_invisible(void);
+static void ScriptCmd_visible(void);
+static void ScriptCmd_doublebattle_2D(void);
+static void ScriptCmd_doublebattle_2E(void);
+static void ScriptCmd_stopsound(void);
+
+static void (*const sScriptCmdTable[])(void) = {
+ ScriptCmd_loadsprite,
+ ScriptCmd_unloadsprite,
+ ScriptCmd_sprite,
+ ScriptCmd_createtask,
+ ScriptCmd_delay,
+ ScriptCmd_wait,
+ ScriptCmd_hang1,
+ ScriptCmd_hang2,
+ ScriptCmd_end,
+ ScriptCmd_playse,
+ ScriptCmd_monbg,
+ ScriptCmd_clearmonbg,
+ ScriptCmd_setalpha,
+ ScriptCmd_blendoff,
+ ScriptCmd_call,
+ ScriptCmd_return,
+ ScriptCmd_setvar,
+ ScriptCmd_ifelse,
+ ScriptCmd_jumpif,
+ ScriptCmd_jump,
+ ScriptCmd_fadetobg,
+ ScriptCmd_restorebg,
+ ScriptCmd_waitbgfadeout,
+ ScriptCmd_waitbgfadein,
+ ScriptCmd_changebg,
+ ScriptCmd_panse_19,
+ ScriptCmd_setpan,
+ ScriptCmd_panse_1B,
+ ScriptCmd_panse_1C,
+ ScriptCmd_panse_1D,
+ ScriptCmd_setbldcnt,
+ ScriptCmd_createtask_1F,
+ ScriptCmd_waitsound,
+ ScriptCmd_jumpvareq,
+ ScriptCmd_monbg_22,
+ ScriptCmd_clearmonbg_23,
+ ScriptCmd_jumpunkcond,
+ ScriptCmd_fadetobg_25,
+ ScriptCmd_panse_26,
+ ScriptCmd_panse_27,
+ ScriptCmd_monbgprio_28,
+ ScriptCmd_monbgprio_29,
+ ScriptCmd_monbgprio_2A,
+ ScriptCmd_invisible,
+ ScriptCmd_visible,
+ ScriptCmd_doublebattle_2D,
+ ScriptCmd_doublebattle_2E,
+ ScriptCmd_stopsound,
+};
+
+void battle_anim_clear_some_data(void)
+{
+ s32 i;
+
+ gUnknown_0202F7B0 = 0;
+ gUnknown_0202F7B1 = 0;
+ gUnknown_0202F7B2 = 0;
+ gUnknown_0202F7B3 = 0;
+ gUnknown_0202F7B4 = 0;
+ gUnknown_0202F7B8 = 0;
+ gUnknown_0202F7BC = 0;
+ gUnknown_0202F7BE = 0;
+ for (i = 0; i < 8; i++)
+ gUnknown_03004B10[i] |= 0xFFFF;
+ for (i = 0; i < 8; i++)
+ gBattleAnimArgs[i] = 0;
+ gUnknown_0202F7C2[0] = 0xFF;
+ gUnknown_0202F7C2[1] = -1;
+ gUnknown_0202F7C4 = 0;
+ gUnknown_0202F7C5 = 0;
+ gUnknown_0202F7C6 = 0;
+ gUnknown_0202F7C8 = 0;
+ gUnknown_0202F7C9 = 0;
+ gUnknown_0202F7D2 = 0;
+}
+
+void move_anim_start_t1(u16 a)
+{
+ gUnknown_0202F7C8 = gPlayerMonIndex;
+ gUnknown_0202F7C9 = gEnemyMonIndex;
+ move_something(gBattleAnims_Moves, a, 1);
+}
+
+void move_something(const u8 *const moveAnims[], u16 b, u8 c)
+{
+ s32 i;
+
+ if (sub_8076BE0() == 0)
+ {
+ sub_8079E24();
+ sub_8043EB4(0);
+ for (i = 0; i < 4; i++)
+ {
+ if (battle_side_get_owner(i) != 0)
+ gUnknown_0202F7CA[i] = GetMonData(&gEnemyParty[gUnknown_02024A6A[i]], 11);
+ else
+ gUnknown_0202F7CA[i] = GetMonData(&gPlayerParty[gUnknown_02024A6A[i]], 11);
+ }
+ }
+ else
+ {
+ for (i = 0; i < 4; i++)
+ gUnknown_0202F7CA[i] = EWRAM_19348;
+ }
+ if (c == 0)
+ gUnknown_0202F7C6 = 0;
+ else
+ gUnknown_0202F7C6 = b;
+ for (i = 0; i < 8; i++)
+ gBattleAnimArgs[i] = 0;
+ gUnknown_0202F7C2[0] = 0xFF;
+ gUnknown_0202F7C2[1] = -1;
+ gBattleAnimScriptPtr = moveAnims[b];
+ gUnknown_0202F7B1 = 1;
+ gUnknown_0202F7B0 = 0;
+ gUnknown_0202F7AC = sub_80759D0;
+ for (i = 0; i < 8; i++)
+ gUnknown_03004B10[i] |= 0xFFFF;
+ if (c != 0)
+ {
+ for (i = 0; gUnknown_081C7160[i] != 0xFFFF; i++)
+ {
+ if (b == gUnknown_081C7160[i])
+ {
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128);
+ break;
+ }
+ }
+ }
+ gUnknown_030042C4 = 0;
+ gUnknown_03004240 = 0;
+ gUnknown_03004200 = 0;
+ gUnknown_03004244 = 0;
+}
+
+void move_anim_8072740(struct Sprite *sprite)
+{
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ gUnknown_0202F7B2--;
+}
+
+void move_anim_task_del(u8 taskId)
+{
+ DestroyTask(taskId);
+ gUnknown_0202F7B2--;
+}
+
+void move_anim_related_task_del(u8 taskId)
+{
+ DestroyTask(taskId);
+ gUnknown_0202F7B3--;
+}
+
+static void sub_8075940(u16 a)
+{
+ s32 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (gUnknown_03004B10[i] == 0xFFFF)
+ {
+ gUnknown_03004B10[i] = a;
+ return;
+ }
+ }
+}
+
+static void sub_8075970(u16 a)
+{
+ s32 i;
+
+ for (i = 0; i < 8; i++)
+ {
+ if (gUnknown_03004B10[i] == a)
+ {
+ gUnknown_03004B10[i] |= 0xFFFF;
+ return;
+ }
+ }
+}
+
+static void move_anim_waiter(void)
+{
+ if (gUnknown_0202F7B0 <= 0)
+ {
+ gUnknown_0202F7AC = sub_80759D0;
+ gUnknown_0202F7B0 = 0;
+ }
+ else
+ {
+ gUnknown_0202F7B0--;
+ }
+}
+
+static void sub_80759D0(void)
+{
+ do
+ {
+ sScriptCmdTable[SCRIPT_READ_8(gBattleAnimScriptPtr)]();
+ } while (gUnknown_0202F7B0 == 0 && gUnknown_0202F7B1 != 0);
+}
+
+static void ScriptCmd_loadsprite(void)
+{
+ u16 r4;
+
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ LoadCompressedObjectPic(&gBattleAnimPicTable[r4 - 10000]);
+ LoadCompressedObjectPalette(&gBattleAnimPaletteTable[r4 - 10000]);
+ gBattleAnimScriptPtr += 2;
+ sub_8075940(r4 - 10000);
+ gUnknown_0202F7B0 = 1;
+ gUnknown_0202F7AC = move_anim_waiter;
+}
+
+static void ScriptCmd_unloadsprite(void)
+{
+ u16 r4;
+
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ FreeSpriteTilesByTag(gBattleAnimPicTable[r4 - 10000].tag);
+ FreeSpritePaletteByTag(gBattleAnimPicTable[r4 - 10000].tag);
+ gBattleAnimScriptPtr += 2;
+ sub_8075970(r4 - 10000);
+}
+
+#ifdef NONMATCHING
+static void ScriptCmd_sprite(void)
+{
+ s32 i;
+ struct SpriteTemplate *r7;
+ u8 r4;
+ u8 r0;
+ u8 _r0;
+ u16 r6;
+ u8 r2;
+ s8 r1;
+
+ gBattleAnimScriptPtr++;
+ r7 = (struct SpriteTemplate *)(SCRIPT_READ_32(gBattleAnimScriptPtr));
+ gBattleAnimScriptPtr += 4;
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ for (i = 0; i < r0; i++)
+ {
+ gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 2;
+ }
+ if (r4 & 0x80)
+ {
+ r4 ^= 0x80;
+ if (r4 > 0x3F)
+ r4 -= 0x40;
+ else
+ r4 = -r4;
+ _r0 = sub_8079E90(gUnknown_0202F7C9);
+ r1 = r4;
+
+ }
+ else
+ {
+ //_08075B44
+ if (r4 > 0x3F)
+ r4 -= 0x40;
+ else
+ r4 = -r4;
+ _r0 = sub_8079E90(gUnknown_0202F7C8);
+ r1 = r4;
+ }
+ r6 = _r0 + r1;
+ if ((s16)r6 < 3)
+ r6 = 3;
+
+ r4 = sub_8077ABC(gUnknown_0202F7C9, 2);
+ r2 = sub_8077ABC(gUnknown_0202F7C9, 3);
+ CreateSpriteAndAnimate(r7, r4, r2, r6);
+ gUnknown_0202F7B2++;
+}
+#else
+__attribute__((naked))
+static void ScriptCmd_sprite(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ ldr r5, _08075B2C @ =gBattleAnimScriptPtr\n\
+ ldr r1, [r5]\n\
+ adds r3, r1, 0x1\n\
+ str r3, [r5]\n\
+ ldrb r2, [r1, 0x1]\n\
+ ldrb r0, [r3, 0x1]\n\
+ lsls r0, 8\n\
+ adds r2, r0\n\
+ ldrb r0, [r3, 0x2]\n\
+ lsls r0, 16\n\
+ adds r2, r0\n\
+ ldrb r0, [r3, 0x3]\n\
+ lsls r0, 24\n\
+ adds r7, r2, r0\n\
+ adds r0, r1, 0x5\n\
+ str r0, [r5]\n\
+ ldrb r4, [r1, 0x5]\n\
+ adds r0, r1, 0x6\n\
+ str r0, [r5]\n\
+ ldrb r0, [r1, 0x6]\n\
+ adds r1, 0x7\n\
+ str r1, [r5]\n\
+ cmp r0, 0\n\
+ beq _08075B14\n\
+ adds r6, r5, 0\n\
+ ldr r5, _08075B30 @ =gBattleAnimArgs\n\
+ adds r3, r0, 0\n\
+_08075AFC:\n\
+ ldr r2, [r6]\n\
+ ldrb r1, [r2]\n\
+ ldrb r0, [r2, 0x1]\n\
+ lsls r0, 8\n\
+ orrs r1, r0\n\
+ strh r1, [r5]\n\
+ adds r2, 0x2\n\
+ str r2, [r6]\n\
+ adds r5, 0x2\n\
+ subs r3, 0x1\n\
+ cmp r3, 0\n\
+ bne _08075AFC\n\
+_08075B14:\n\
+ movs r0, 0x80\n\
+ ands r0, r4\n\
+ cmp r0, 0\n\
+ beq _08075B44\n\
+ movs r0, 0x80\n\
+ eors r4, r0\n\
+ cmp r4, 0x3F\n\
+ bls _08075B34\n\
+ adds r0, r4, 0\n\
+ subs r0, 0x40\n\
+ b _08075B36\n\
+ .align 2, 0\n\
+_08075B2C: .4byte gBattleAnimScriptPtr\n\
+_08075B30: .4byte gBattleAnimArgs\n\
+_08075B34:\n\
+ negs r0, r4\n\
+_08075B36:\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldr r0, _08075B40 @ =gUnknown_0202F7C9\n\
+ b _08075B56\n\
+ .align 2, 0\n\
+_08075B40: .4byte gUnknown_0202F7C9\n\
+_08075B44:\n\
+ cmp r4, 0x3F\n\
+ bls _08075B4E\n\
+ adds r0, r4, 0\n\
+ subs r0, 0x40\n\
+ b _08075B50\n\
+_08075B4E:\n\
+ negs r0, r4\n\
+_08075B50:\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ ldr r0, _08075BAC @ =gUnknown_0202F7C8\n\
+_08075B56:\n\
+ ldrb r0, [r0]\n\
+ bl sub_8079E90\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r1, r4, 24\n\
+ asrs r1, 24\n\
+ adds r0, r1\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+ lsls r0, r6, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x2\n\
+ bgt _08075B74\n\
+ movs r6, 0x3\n\
+_08075B74:\n\
+ ldr r5, _08075BB0 @ =gUnknown_0202F7C9\n\
+ ldrb r0, [r5]\n\
+ movs r1, 0x2\n\
+ bl sub_8077ABC\n\
+ adds r4, r0, 0\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ ldrb r0, [r5]\n\
+ movs r1, 0x3\n\
+ bl sub_8077ABC\n\
+ adds r2, r0, 0\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ lsls r3, r6, 24\n\
+ lsrs r3, 24\n\
+ adds r0, r7, 0\n\
+ adds r1, r4, 0\n\
+ bl CreateSpriteAndAnimate\n\
+ ldr r1, _08075BB4 @ =gUnknown_0202F7B2\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08075BAC: .4byte gUnknown_0202F7C8\n\
+_08075BB0: .4byte gUnknown_0202F7C9\n\
+_08075BB4: .4byte gUnknown_0202F7B2\n\
+ .syntax divided\n");
+}
+#endif
+
+static void ScriptCmd_createtask(void)
+{
+ TaskFunc taskFunc;
+ u8 taskPriority;
+ u8 taskId;
+ u8 numArgs;
+ s32 i;
+
+ gBattleAnimScriptPtr++;
+ taskFunc = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 4;
+ taskPriority = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ for (i = 0; i < numArgs; i++)
+ {
+ gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 2;
+ }
+ taskId = CreateTask(taskFunc, taskPriority);
+ taskFunc(taskId);
+ gUnknown_0202F7B2++;
+}
+
+static void ScriptCmd_delay(void)
+{
+ gBattleAnimScriptPtr++;
+ gUnknown_0202F7B0 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (gUnknown_0202F7B0 == 0)
+ gUnknown_0202F7B0 = -1;
+ gBattleAnimScriptPtr++;
+ gUnknown_0202F7AC = move_anim_waiter;
+}
+
+static void ScriptCmd_wait(void)
+{
+ if (gUnknown_0202F7B2 == 0)
+ {
+ gBattleAnimScriptPtr++;
+ gUnknown_0202F7B0 = 0;
+ }
+ else
+ {
+ gUnknown_0202F7B0 = 1;
+ }
+}
+
+static void ScriptCmd_hang1(void)
+{
+}
+
+static void ScriptCmd_hang2(void)
+{
+}
+
+static void ScriptCmd_end(void)
+{
+ s32 i;
+ int zero = 0;
+
+ if (gUnknown_0202F7B2 != 0 || gUnknown_0202F7B3 != 0
+ || gUnknown_0202F7C2[0] != 0xFF || gUnknown_0202F7C2[1] != 0xFF)
+ {
+ gUnknown_03004AF0 = 0;
+ gUnknown_0202F7B0 = 1;
+ return;
+ }
+
+ if (IsSEPlaying())
+ {
+ gUnknown_03004AF0++;
+ if (gUnknown_03004AF0 <= 0x5A)
+ {
+ gUnknown_0202F7B0 = 1;
+ return;
+ }
+ else
+ {
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ }
+ }
+ gUnknown_03004AF0 = 0;
+ for (i = 0; i < 8; i++)
+ {
+ if (gUnknown_03004B10[i] != 0xFFFF)
+ {
+ FreeSpriteTilesByTag(gBattleAnimPicTable[gUnknown_03004B10[i]].tag);
+ FreeSpritePaletteByTag(gBattleAnimPicTable[gUnknown_03004B10[i]].tag);
+ gUnknown_03004B10[i] |= 0xFFFF;
+ }
+ }
+ if (zero == 0)
+ {
+ m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256);
+ if (sub_8076BE0() == 0)
+ {
+ sub_8079E24();
+ sub_8043EB4(1);
+ }
+ gUnknown_0202F7B1 = 0;
+ }
+}
+
+static void ScriptCmd_playse(void)
+{
+ gBattleAnimScriptPtr++;
+ PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr));
+ gBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_monbg(void)
+{
+ u8 r6;
+ u8 r5;
+ u8 r0;
+ u8 r7;
+ u16 r4;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r6 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (r6 == 0)
+ r6 = 2;
+ else if (r6 == 1)
+ r6 = 3;
+ if (r6 == 0 || r6 == 2)
+ r5 = gUnknown_0202F7C8;
+ else
+ r5 = gUnknown_0202F7C9;
+ if (b_side_obj__get_some_boolean(r5))
+ {
+ r0 = battle_get_per_side_status(r5);
+ r0 += 0xFF;
+ if (r0 <= 1 || sub_8076BE0() != 0)
+ r7 = 0;
+ else
+ r7 = 1;
+ sub_8076034(r5, r7);
+ r4 = gUnknown_02024BE0[r5];
+ taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x;
+ gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y;
+ if (r7 == 0)
+ {
+ gTasks[taskId].data[3] = gUnknown_030042C0;
+ gTasks[taskId].data[4] = gUnknown_030041B4;
+ }
+ else
+ {
+ gTasks[taskId].data[3] = gUnknown_03004288;
+ gTasks[taskId].data[4] = gUnknown_03004280;
+ }
+ gTasks[taskId].data[5] = r7;
+ gTasks[taskId].data[6] = r5;
+ gUnknown_0202F7C2[0] = taskId;
+
+ }
+ r5 ^= 2;
+ if (r6 > 1 && b_side_obj__get_some_boolean(r5))
+ {
+ r0 = battle_get_per_side_status(r5);
+ r0 += 0xFF;
+ if (r0 <= 1 || sub_8076BE0() != 0)
+ r7 = 0;
+ else
+ r7 = 1;
+ sub_8076034(r5, r7);
+ r4 = gUnknown_02024BE0[r5];
+ taskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[1] = gSprites[r4].pos1.x + gSprites[r4].pos2.x;
+ gTasks[taskId].data[2] = gSprites[r4].pos1.y + gSprites[r4].pos2.y;
+ if (r7 == 0)
+ {
+ gTasks[taskId].data[3] = gUnknown_030042C0;
+ gTasks[taskId].data[4] = gUnknown_030041B4;
+ }
+ else
+ {
+ gTasks[taskId].data[3] = gUnknown_03004288;
+ gTasks[taskId].data[4] = gUnknown_03004280;
+ }
+ gTasks[taskId].data[5] = r7;
+ gTasks[taskId].data[6] = r5;
+ gUnknown_0202F7C2[1] = taskId;
+ }
+ gBattleAnimScriptPtr++;
+}
+
+#ifdef NONMATCHING
+bool8 b_side_obj__get_some_boolean(u8 a)
+{
+ if (sub_8076BE0() != 0)
+ {
+ if (a == gUnknown_0202F7C8)
+ return TRUE;
+ else
+ return FALSE;
+ }
+ if (sub_8078874(a) == 0)
+ return FALSE;
+ if (sub_8076BE0() != 0)
+ return TRUE;
+ if ((EWRAM_17800[a].unk0 & 1) == 0)
+ return TRUE;
+ if (gSprites[gUnknown_02024BE0[a]].invisible)
+ return FALSE;
+ return TRUE;
+}
+#else
+__attribute__((naked))
+bool8 b_side_obj__get_some_boolean(u8 a)
+{
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ adds r5, r4, 0\n\
+ bl sub_8076BE0\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08075FDC\n\
+ ldr r0, _08075FD8 @ =gUnknown_0202F7C8\n\
+ ldrb r0, [r0]\n\
+ cmp r4, r0\n\
+ beq _0807601C\n\
+ b _0807602C\n\
+ .align 2, 0\n\
+_08075FD8: .4byte gUnknown_0202F7C8\n\
+_08075FDC:\n\
+ adds r0, r4, 0\n\
+ bl sub_8078874\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0807602C\n\
+ bl sub_8076BE0\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0807601C\n\
+ lsls r0, r5, 2\n\
+ ldr r1, _08076020 @ =0x02017800\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0807601C\n\
+ ldr r2, _08076024 @ =gSprites\n\
+ ldr r0, _08076028 @ =gUnknown_02024BE0\n\
+ adds r0, r5, r0\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r2\n\
+ adds r0, 0x3E\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 29\n\
+ cmp r0, 0\n\
+ blt _0807602C\n\
+_0807601C:\n\
+ movs r0, 0x1\n\
+ b _0807602E\n\
+ .align 2, 0\n\
+_08076020: .4byte 0x02017800\n\
+_08076024: .4byte gSprites\n\
+_08076028: .4byte gUnknown_02024BE0\n\
+_0807602C:\n\
+ movs r0, 0\n\
+_0807602E:\n\
+ pop {r4,r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_8076034(u8 a, u8 b)
+{
+ volatile u8 pointlessZero;
+ u16 *addr2;
+ u8 spriteId;
+
+ if (b == 0)
+ {
+ struct UnknownStruct2 s;
+ u8 *addr;
+ u32 size;
+ u8 r2;
+ u16 *addr3;
+
+ sub_8078914(&s);
+ addr = s.unk0;
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = (void *)s.unk4;
+ DmaFill16(3, 0xFF, addr2, 0x1000);
+
+ REG_BG1CNT_BITFIELD.priority = 2;
+ REG_BG1CNT_BITFIELD.screenSize = 1;
+ REG_BG1CNT_BITFIELD.areaOverflowMode = 0;
+
+ spriteId = gUnknown_02024BE0[a];
+ gUnknown_030042C0 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32;
+ if (sub_8076BE0() != 0 && sub_80AEB1C(EWRAM_19348) != 0)
+ gUnknown_030042C0--;
+ gUnknown_030041B4 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32;
+ gSprites[gUnknown_02024BE0[a]].invisible = TRUE;
+
+ REG_BG1HOFS = gUnknown_030042C0;
+ REG_BG1VOFS = gUnknown_030041B4;
+
+ LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, s.unk8 * 16, 32);
+ addr3 = (u16 *)PLTT + s.unk8 * 16;
+ DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32);
+
+ if (sub_8076BE0() != 0)
+ r2 = 0;
+ else
+ r2 = battle_get_per_side_status(a);
+ sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock);
+ if (sub_8076BE0() != 0)
+ sub_8076380();
+ }
+ else
+ {
+ u8 *addr;
+ u32 size;
+ u16 *addr3;
+
+ addr = (void *)(VRAM + 0x6000);
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = (void *)(VRAM + 0xF000);
+ DmaFill32(3, 0, addr2, 0x800);
+
+ REG_BG2CNT_BITFIELD.priority = 2;
+ REG_BG2CNT_BITFIELD.screenSize = 1;
+ REG_BG2CNT_BITFIELD.areaOverflowMode = 0;
+
+ spriteId = gUnknown_02024BE0[a];
+ gUnknown_03004288 = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32;
+ gUnknown_03004280 = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32;
+ gSprites[gUnknown_02024BE0[a]].invisible = TRUE;
+
+ REG_BG2HOFS = gUnknown_03004288;
+ REG_BG2VOFS = gUnknown_03004280;
+
+ LoadPalette(gPlttBufferUnfaded + 0x100 + a * 16, 0x90, 32);
+ addr3 = (void *)(PLTT + 0x120);
+ DmaCopy32(3, gPlttBufferUnfaded + 0x100 + a * 16, addr3, 32);
+
+ sub_80E4EF8(0, 0, battle_get_per_side_status(a), 9, 0x6000, 0x1E, REG_BG2CNT_BITFIELD.charBaseBlock);
+ }
+}
+
+static void sub_8076380(void)
+{
+ int i;
+ int j;
+ struct UnknownStruct2 s;
+ u16 *ptr;
+
+ if (sub_80AEB1C(EWRAM_19348) != 0)
+ {
+ sub_8078914(&s);
+ ptr = s.unk4;
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ u16 temp = ptr[j + i * 32];
+
+ ptr[j + i * 32] = ptr[7 - j + i * 32];
+ ptr[7 - j + i * 32] = temp;
+ }
+ }
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ ptr[j + i * 32] ^= 0x400;
+ }
+ }
+}
+
+void sub_80763FC(u16 a, u16 *b, u32 c, u8 d)
+{
+ u8 i;
+ u8 j;
+ u32 r9;
+
+ if (d == 0)
+ r9 = 32;
+ else
+ r9 = 64;
+ a <<= 12;
+ for (i = 0; i < r9; i++)
+ {
+ for (j = 0; j < 32; j++)
+ b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c;
+ }
+}
+
+void sub_8076464(u8 a)
+{
+ u8 *addr;
+ u32 size;
+ volatile u8 pointlessZero;
+ struct UnknownStruct2 s;
+
+ sub_8078914(&s);
+ if (a == 0 || sub_8076BE0() != 0)
+ {
+ u16 *addr2;
+
+ addr = s.unk0;
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = s.unk4;
+ DmaFill32(3, 0, addr2, 0x800);
+ gUnknown_030042C0 = 0;
+ gUnknown_030041B4 = 0;
+ }
+ else
+ {
+ u16 *addr2;
+
+ addr = (void *)(VRAM + 0x6000);
+ size = 0x2000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ pointlessZero = 0;
+ pointlessZero = 0;
+ addr2 = (void *)(VRAM + 0xF000);
+ DmaFill32(3, 0, addr2, 0x800);
+ gUnknown_03004288 = 0;
+ gUnknown_03004280 = 0;
+ }
+}
+
+static void task_pA_ma0A_obj_to_bg_pal(u8 taskId)
+{
+ u8 r4;
+ u8 r6;
+ s16 r3;
+ s16 r2;
+ struct UnknownStruct2 s;
+
+ r4 = gTasks[taskId].data[0];
+ r6 = gTasks[taskId].data[6];
+ sub_8078914(&s);
+ r3 = gTasks[taskId].data[1] - (gSprites[r4].pos1.x + gSprites[r4].pos2.x);
+ r2 = gTasks[taskId].data[2] - (gSprites[r4].pos1.y + gSprites[r4].pos2.y);
+ if (gTasks[taskId].data[5] == 0)
+ {
+ u16 *src;
+ u16 *dst;
+
+ gUnknown_030042C0 = r3 + gTasks[taskId].data[3];
+ gUnknown_030041B4 = r2 + gTasks[taskId].data[4];
+ src = gPlttBufferFaded + 0x100 + r6 * 16;
+ dst = gPlttBufferFaded + 0x100 + s.unk8 * 16 - 256;
+ DmaCopy32(3, src, dst, 32);
+ }
+ else
+ {
+ u16 *src;
+ u16 *dst;
+
+ gUnknown_03004288 = r3 + gTasks[taskId].data[3];
+ gUnknown_03004280 = r2 + gTasks[taskId].data[4];
+ src = gPlttBufferFaded + 0x100 + r6 * 16;
+ dst = gPlttBufferFaded + 0x100 - 112;
+ DmaCopy32(3, src, dst, 32);
+ }
+}
+
+static void ScriptCmd_clearmonbg(void)
+{
+ u8 r4;
+ u8 r5;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (r4 == 0)
+ r4 = 2;
+ else if (r4 == 1)
+ r4 = 3;
+ if (r4 == 0 || r4 == 2)
+ r5 = gUnknown_0202F7C8;
+ else
+ r5 = gUnknown_0202F7C9;
+ if (gUnknown_0202F7C2[0] != 0xFF)
+ gSprites[gUnknown_02024BE0[r5]].invisible = FALSE;
+ if (r4 > 1 && gUnknown_0202F7C2[1] != 0xFF)
+ gSprites[gUnknown_02024BE0[r5 ^ 2]].invisible = FALSE;
+ else
+ r4 = 0;
+ taskId = CreateTask(sub_807672C, 5);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[2] = r5;
+ gBattleAnimScriptPtr++;
+}
+
+static void sub_807672C(u8 taskId)
+{
+ u8 var;
+ u8 r4;
+
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] != 1)
+ {
+ var = battle_get_per_side_status(gTasks[taskId].data[2]);
+ var += 0xFF;
+ if (var <= 1 || sub_8076BE0() != 0)
+ r4 = 0;
+ else
+ r4 = 1;
+ if (gUnknown_0202F7C2[0] != 0xFF)
+ {
+ sub_8076464(r4);
+ DestroyTask(gUnknown_0202F7C2[0]);
+ gUnknown_0202F7C2[0] = 0xFF;
+ }
+ if (gTasks[taskId].data[0] > 1)
+ {
+ sub_8076464(r4 ^ 1);
+ DestroyTask(gUnknown_0202F7C2[1]);
+ gUnknown_0202F7C2[1] = 0xFF;
+ }
+ DestroyTask(taskId);
+ }
+}
+
+static void ScriptCmd_monbg_22(void)
+{
+ u8 r5;
+ u8 r4;
+ u8 r0;
+ u8 r1;
+
+ gBattleAnimScriptPtr++;
+ r5 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (r5 == 0)
+ r5 = 2;
+ else if (r5 == 1)
+ r5 = 3;
+ if (r5 == 0 || r5 == 2)
+ r4 = gUnknown_0202F7C8;
+ else
+ r4 = gUnknown_0202F7C9;
+ if (b_side_obj__get_some_boolean(r4))
+ {
+ r0 = battle_get_per_side_status(r4);
+ r0 += 0xFF;
+ if (r0 <= 1 || sub_8076BE0() != 0)
+ r1 = 0;
+ else
+ r1 = 1;
+ sub_8076034(r4, r1);
+ gSprites[gUnknown_02024BE0[r4]].invisible = FALSE;
+ }
+ r4 ^= 2;
+ if (r5 > 1 && b_side_obj__get_some_boolean(r4))
+ {
+ r0 = battle_get_per_side_status(r4);
+ r0 += 0xFF;
+ if (r0 <= 1 || sub_8076BE0() != 0)
+ r1 = 0;
+ else
+ r1 = 1;
+ sub_8076034(r4, r1);
+ gSprites[gUnknown_02024BE0[r4]].invisible = FALSE;
+ }
+ gBattleAnimScriptPtr++;
+}
+
+static void ScriptCmd_clearmonbg_23(void)
+{
+ u8 r5;
+ u8 r6;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r5 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ if (r5 == 0)
+ r5 = 2;
+ else if (r5 == 1)
+ r5 = 3;
+ if (r5 == 0 || r5 == 2)
+ r6 = gUnknown_0202F7C8;
+ else
+ r6 = gUnknown_0202F7C9;
+ if (b_side_obj__get_some_boolean(r6))
+ gSprites[gUnknown_02024BE0[r6]].invisible = FALSE;
+ if (r5 > 1 && b_side_obj__get_some_boolean(r6 ^ 2))
+ gSprites[gUnknown_02024BE0[r6 ^ 2]].invisible = FALSE;
+ else
+ r5 = 0;
+ taskId = CreateTask(sub_80769A4, 5);
+ gTasks[taskId].data[0] = r5;
+ gTasks[taskId].data[2] = r6;
+ gBattleAnimScriptPtr++;
+}
+
+static void sub_80769A4(u8 taskId)
+{
+ u8 r0;
+ u8 r4;
+ u8 r5;
+
+ gTasks[taskId].data[1]++;
+ if (gTasks[taskId].data[1] != 1)
+ {
+ r4 = gTasks[taskId].data[2];
+ r0 = battle_get_per_side_status(r4);
+ r0 += 0xFF;
+ if (r0 <= 1 || sub_8076BE0() != 0)
+ r5 = 0;
+ else
+ r5 = 1;
+ if (b_side_obj__get_some_boolean(r4))
+ sub_8076464(r5);
+ if (gTasks[taskId].data[0] > 1 && b_side_obj__get_some_boolean(r4 ^ 2))
+ sub_8076464(r5 ^ 1);
+ DestroyTask(taskId);
+ }
+}
+
+static void ScriptCmd_setalpha(void)
+{
+ u16 r3;
+ u16 r1;
+
+ gBattleAnimScriptPtr++;
+ r3 = *(gBattleAnimScriptPtr++);
+ r1 = *(gBattleAnimScriptPtr++) << 8;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = r3 | r1;
+}
+
+static void ScriptCmd_setbldcnt(void)
+{
+ u16 r3;
+ u16 r1;
+
+ gBattleAnimScriptPtr++;
+ r3 = *(gBattleAnimScriptPtr++);
+ r1 = *(gBattleAnimScriptPtr++) << 8;
+ REG_BLDCNT = r3 | r1;
+}
+
+static void ScriptCmd_blendoff(void)
+{
+ gBattleAnimScriptPtr++;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+}
+
+static void ScriptCmd_call(void)
+{
+ u32 addr;
+
+ gBattleAnimScriptPtr++;
+ gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4;
+ addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = (u8 *)addr;
+}
+
+static void ScriptCmd_return(void)
+{
+ gBattleAnimScriptPtr = gBattleAnimScriptRetAddr;
+}
+
+static void ScriptCmd_setvar(void)
+{
+ const u8 *addr = gBattleAnimScriptPtr;
+ u16 r4;
+ u8 r2;
+
+ gBattleAnimScriptPtr++;
+ r2 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = addr + 4;
+ gBattleAnimArgs[r2] = r4;
+}
+
+static void ScriptCmd_ifelse(void)
+{
+ u32 addr;
+
+ gBattleAnimScriptPtr++;
+ if (gUnknown_0202F7C4 & 1)
+ gBattleAnimScriptPtr += 4;
+ addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = (u8 *)addr;
+}
+
+static void ScriptCmd_jumpif(void)
+{
+ u8 r1;
+ u32 addr;
+
+ gBattleAnimScriptPtr++;
+ r1 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ if (r1 == gUnknown_0202F7C4)
+ {
+ addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = (u8 *)addr;
+ }
+ else
+ {
+ gBattleAnimScriptPtr += 4;
+ }
+}
+
+static void ScriptCmd_jump(void)
+{
+ u32 addr;
+
+ gBattleAnimScriptPtr++;
+ addr = SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = (u8 *)addr;
+}
+
+//IsContest, maybe
+bool8 sub_8076BE0(void)
+{
+ if (!gMain.inBattle)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void ScriptCmd_fadetobg(void)
+{
+ u8 r4;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ taskId = CreateTask(task_p5_load_battle_screen_elements, 5);
+ gTasks[taskId].data[0] = r4;
+ gUnknown_0202F7C5 = 1;
+}
+
+static void ScriptCmd_fadetobg_25(void)
+{
+ u8 r8;
+ u8 r7;
+ u8 r6;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r8 = gBattleAnimScriptPtr[0];
+ r7 = gBattleAnimScriptPtr[1];
+ r6 = gBattleAnimScriptPtr[2];
+ gBattleAnimScriptPtr += 3;
+ taskId = CreateTask(task_p5_load_battle_screen_elements, 5);
+ if (sub_8076BE0() != 0)
+ gTasks[taskId].data[0] = r6;
+ else if (battle_side_get_owner(gUnknown_0202F7C9) == 0)
+ gTasks[taskId].data[0] = r7;
+ else
+ gTasks[taskId].data[0] = r8;
+ gUnknown_0202F7C5 = 1;
+}
+
+static void task_p5_load_battle_screen_elements(u8 taskId)
+{
+ if (gTasks[taskId].data[10] == 0)
+ {
+ BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0);
+ gTasks[taskId].data[10]++;
+ return;
+ }
+ if (gPaletteFade.active)
+ return;
+ if (gTasks[taskId].data[10] == 1)
+ {
+ gTasks[taskId].data[10]++;
+ gUnknown_0202F7C5 = 2;
+ }
+ else if (gTasks[taskId].data[10] == 2)
+ {
+ s16 data0 = (u16)gTasks[taskId].data[0];
+
+ if (data0 == -1)
+ dp01t_11_3_message_for_player_only();
+ else
+ sub_8076DB8(data0);
+ BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1);
+ gTasks[taskId].data[10]++;
+ return;
+ }
+ if (gPaletteFade.active)
+ return;
+ if (gTasks[taskId].data[10] == 3)
+ {
+ DestroyTask(taskId);
+ gUnknown_0202F7C5 = 0;
+ }
+}
+
+static void sub_8076DB8(u16 a)
+{
+ if (sub_8076BE0())
+ {
+ void *tilemap = gBattleAnimBackgroundTable[a].tilemap;
+ void *dmaSrc;
+ void *dmaDest;
+
+ sub_800D238(tilemap, sub_8076BE0() ? EWRAM_14800 : EWRAM_18000);
+ sub_80763FC(sub_80789BC(), sub_8076BE0() ? EWRAM_14800 : EWRAM_18000, 0x100, 0);
+ dmaSrc = sub_8076BE0() ? EWRAM_14800 : EWRAM_18000;
+ dmaDest = (void *)(VRAM + 0xD000);
+ DmaCopy32(3, dmaSrc, dmaDest, 0x800);
+ LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x2000));
+ LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, sub_80789BC() * 16, 32);
+ }
+ else
+ {
+ LZDecompressVram(gBattleAnimBackgroundTable[a].tilemap, (void *)(VRAM + 0xD000));
+ LZDecompressVram(gBattleAnimBackgroundTable[a].image, (void *)(VRAM + 0x8000));
+ LoadCompressedPalette(gBattleAnimBackgroundTable[a].palette, 32, 32);
+ }
+}
+
+static void dp01t_11_3_message_for_player_only(void)
+{
+ if (sub_8076BE0())
+ sub_80AB2AC();
+ else
+ sub_800D7B8();
+}
+
+static void ScriptCmd_restorebg(void)
+{
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ taskId = CreateTask(task_p5_load_battle_screen_elements, 5);
+ gTasks[taskId].data[0] = 0xFFFF;
+ gUnknown_0202F7C5 = 1;
+}
+
+static void ScriptCmd_waitbgfadeout(void)
+{
+ if (gUnknown_0202F7C5 == 2)
+ {
+ gBattleAnimScriptPtr++;
+ gUnknown_0202F7B0 = 0;
+ }
+ else
+ {
+ gUnknown_0202F7B0 = 1;
+ }
+}
+
+static void ScriptCmd_waitbgfadein(void)
+{
+ if (gUnknown_0202F7C5 == 0)
+ {
+ gBattleAnimScriptPtr++;
+ gUnknown_0202F7B0 = 0;
+ }
+ else
+ {
+ gUnknown_0202F7B0 = 1;
+ }
+}
+
+static void ScriptCmd_changebg(void)
+{
+ gBattleAnimScriptPtr++;
+ sub_8076DB8(SCRIPT_READ_8(gBattleAnimScriptPtr));
+ gBattleAnimScriptPtr++;
+}
+
+//Weird control flow
+/*
+s8 sub_8076F98(s8 a)
+{
+ if (!sub_8076BE0() && (EWRAM_17810[gUnknown_0202F7C8].unk0 & 0x10))
+ {
+ a = battle_side_get_owner(gUnknown_0202F7C8) ? 0xC0 : 0x3F;
+ }
+ //_08076FDC
+ else
+ {
+ if (sub_8076BE0())
+ {
+ if (gUnknown_0202F7C8 == gUnknown_0202F7C9 && gUnknown_0202F7C8 == 2
+ && a == 0x3F)
+ {
+ //jump to _0807707A
+ if (a < -0x40)
+ a = 0xC0;
+ return a;
+ }
+ }
+ //_08077004
+ else
+ {
+ if (battle_side_get_owner(gUnknown_0202F7C8) == 0)
+ {
+ if (battle_side_get_owner(gUnknown_0202F7C9) == 0)
+ }
+ //_08077042
+ else
+ {
+
+ }
+ //_0807706C
+ }
+ }
+ //_0807706E
+}
+*/
+__attribute__((naked))
+s8 sub_8076F98(s8 a)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ bl sub_8076BE0\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08076FDC\n\
+ ldr r0, _08076FD4 @ =gUnknown_0202F7C8\n\
+ ldrb r2, [r0]\n\
+ lsls r0, r2, 1\n\
+ adds r0, r2\n\
+ lsls r0, 2\n\
+ ldr r1, _08076FD8 @ =0x02017810\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08076FDC\n\
+ adds r0, r2, 0\n\
+ bl battle_side_get_owner\n\
+ lsls r0, 24\n\
+ movs r4, 0xC0\n\
+ cmp r0, 0\n\
+ beq _0807706E\n\
+ movs r4, 0x3F\n\
+ b _0807706E\n\
+ .align 2, 0\n\
+_08076FD4: .4byte gUnknown_0202F7C8\n\
+_08076FD8: .4byte 0x02017810\n\
+_08076FDC:\n\
+ bl sub_8076BE0\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _08077004\n\
+ ldr r0, _08076FFC @ =gUnknown_0202F7C8\n\
+ ldr r1, _08077000 @ =gUnknown_0202F7C9\n\
+ ldrb r0, [r0]\n\
+ ldrb r1, [r1]\n\
+ cmp r0, r1\n\
+ bne _08077068\n\
+ cmp r0, 0x2\n\
+ bne _08077068\n\
+ cmp r4, 0x3F\n\
+ beq _0807707A\n\
+ b _08077068\n\
+ .align 2, 0\n\
+_08076FFC: .4byte gUnknown_0202F7C8\n\
+_08077000: .4byte gUnknown_0202F7C9\n\
+_08077004:\n\
+ ldr r0, _0807702C @ =gUnknown_0202F7C8\n\
+ ldrb r0, [r0]\n\
+ bl battle_side_get_owner\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08077042\n\
+ ldr r0, _08077030 @ =gUnknown_0202F7C9\n\
+ ldrb r0, [r0]\n\
+ bl battle_side_get_owner\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0807706E\n\
+ lsls r0, r4, 24\n\
+ asrs r1, r0, 24\n\
+ cmp r1, 0x3F\n\
+ bne _08077034\n\
+ movs r4, 0xC0\n\
+ b _0807706E\n\
+ .align 2, 0\n\
+_0807702C: .4byte gUnknown_0202F7C8\n\
+_08077030: .4byte gUnknown_0202F7C9\n\
+_08077034:\n\
+ movs r0, 0x40\n\
+ negs r0, r0\n\
+ cmp r1, r0\n\
+ beq _0807706E\n\
+ negs r0, r1\n\
+ lsls r0, 24\n\
+ b _0807706C\n\
+_08077042:\n\
+ ldr r0, _08077064 @ =gUnknown_0202F7C9\n\
+ ldrb r0, [r0]\n\
+ bl battle_side_get_owner\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _08077068\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x40\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ bne _0807706E\n\
+ movs r4, 0x3F\n\
+ b _0807706E\n\
+ .align 2, 0\n\
+_08077064: .4byte gUnknown_0202F7C9\n\
+_08077068:\n\
+ lsls r0, r4, 24\n\
+ negs r0, r0\n\
+_0807706C:\n\
+ lsrs r4, r0, 24\n\
+_0807706E:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x3F\n\
+ ble _0807707A\n\
+ movs r4, 0x3F\n\
+ b _08077088\n\
+_0807707A:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ movs r1, 0x40\n\
+ negs r1, r1\n\
+ cmp r0, r1\n\
+ bge _08077088\n\
+ movs r4, 0xC0\n\
+_08077088:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+
+s8 sub_8077094(s8 a)
+{
+ if (!sub_8076BE0() && (EWRAM_17810[gUnknown_0202F7C8].unk0 & 0x10))
+ {
+ if (battle_side_get_owner(gUnknown_0202F7C8) != 0)
+ a = 0x3F;
+ else
+ a = 0xC0;
+ }
+ else
+ {
+ if (battle_side_get_owner(gUnknown_0202F7C8) != 0 || sub_8076BE0() != 0)
+ a = -a;
+ }
+ return a;
+}
+
+s16 sub_8077104(s16 a)
+{
+ s16 var = a;
+
+ if (var > 63)
+ var = 63;
+ else if (var < -64)
+ var = -64;
+ return var;
+}
+
+s16 sub_807712C(s16 a, s16 b, s16 c)
+{
+ u16 var;
+
+ if (a < b)
+ var = ((c < 0) ? -c : c);
+ else if (a > b)
+ var = -((c < 0) ? -c : c);
+ else
+ var = 0;
+ return var;
+}
+
+static void ScriptCmd_panse_19(void)
+{
+ u16 r4;
+ s8 r0;
+
+ gBattleAnimScriptPtr++;
+ r4 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ PlaySE12WithPanning(r4, sub_8076F98(r0));
+ gBattleAnimScriptPtr += 3;
+}
+
+static void ScriptCmd_setpan(void)
+{
+ s8 r0;
+
+ gBattleAnimScriptPtr++;
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ SE12PanpotControl(sub_8076F98(r0));
+ gBattleAnimScriptPtr++;
+}
+
+static void ScriptCmd_panse_1B(void)
+{
+ u16 songNum;
+ s8 r0;
+ s8 r4;
+ s8 r6;
+ u8 r7;
+ s8 panning;
+ s8 r8;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ songNum = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4);
+ r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5);
+ panning = sub_8076F98(r0);
+ r8 = sub_8076F98(r4);
+ r4 = sub_807712C(panning, r8, r6);
+ taskId = CreateTask(c3_08073CEC, 1);
+ gTasks[taskId].data[0] = panning;
+ gTasks[taskId].data[1] = r8;
+ gTasks[taskId].data[2] = r4;
+ gTasks[taskId].data[3] = r7;
+ gTasks[taskId].data[4] = panning;
+ PlaySE12WithPanning(songNum, panning);
+ gUnknown_0202F7B3++;
+ gBattleAnimScriptPtr += 6;
+}
+
+#ifdef NONMATCHING
+static void c3_08073CEC(u8 taskId)
+{
+ u16 r7 = 0;
+ s16 r0;
+ s16 r6;
+ s16 r3;
+ s16 r4;
+ int foo;
+
+ r0 = gTasks[taskId].data[8];
+ gTasks[taskId].data[8]++;
+ if (r0 >= gTasks[taskId].data[3])
+ {
+ gTasks[taskId].data[8] = r7;
+ r6 = gTasks[taskId].data[0];
+ r3 = gTasks[taskId].data[1];
+ foo = gTasks[taskId].data[4] + gTasks[taskId].data[2];
+ r4 = foo;
+ gTasks[taskId].data[4] = r4;
+ if (gTasks[taskId].data[2] == 0)
+ {
+ r4 = r3;
+ DestroyTask(taskId);
+ gUnknown_0202F7B3--;
+ }
+ //_080772D8
+ else
+ {
+ if (r6 < r3)
+ {
+ if (r4 < r3)
+ goto check;
+ DestroyTask(taskId);
+ gUnknown_0202F7B3--;
+ }
+ else
+ {
+ if (r4 <= r3)
+ r7 = 1;
+ check:
+ if (r7 != 0)
+ {
+ DestroyTask(taskId);
+ gUnknown_0202F7B3--;
+ }
+ }
+ }
+ //_080772F8
+ SE12PanpotControl(r4);
+ }
+ //_08077314
+}
+#else
+__attribute__((naked))
+static void c3_08073CEC(u8 taskId)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ movs r7, 0\n\
+ ldr r1, _080772D4 @ =gTasks\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r2, r0, r1\n\
+ ldrh r0, [r2, 0x18]\n\
+ adds r1, r0, 0x1\n\
+ strh r1, [r2, 0x18]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ movs r3, 0xE\n\
+ ldrsh r1, [r2, r3]\n\
+ cmp r0, r1\n\
+ blt _08077314\n\
+ strh r7, [r2, 0x18]\n\
+ ldrh r6, [r2, 0x8]\n\
+ ldrh r3, [r2, 0xA]\n\
+ movs r4, 0x10\n\
+ ldrsh r0, [r2, r4]\n\
+ movs r4, 0xC\n\
+ ldrsh r1, [r2, r4]\n\
+ adds r0, r1\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ strh r4, [r2, 0x10]\n\
+ cmp r1, 0\n\
+ bne _080772D8\n\
+ lsls r2, r3, 16\n\
+ b _080772FC\n\
+ .align 2, 0\n\
+_080772D4: .4byte gTasks\n\
+_080772D8:\n\
+ lsls r1, r6, 16\n\
+ lsls r0, r3, 16\n\
+ asrs r3, r0, 16\n\
+ adds r2, r0, 0\n\
+ cmp r1, r2\n\
+ bge _080772EE\n\
+ lsls r0, r4, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r3\n\
+ blt _080772F8\n\
+ b _080772FC\n\
+_080772EE:\n\
+ lsls r0, r4, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r3\n\
+ bgt _080772F8\n\
+ movs r7, 0x1\n\
+_080772F8:\n\
+ cmp r7, 0\n\
+ beq _0807730C\n\
+_080772FC:\n\
+ lsrs r4, r2, 16\n\
+ adds r0, r5, 0\n\
+ bl DestroyTask\n\
+ ldr r1, _0807731C @ =gUnknown_0202F7B3\n\
+ ldrb r0, [r1]\n\
+ subs r0, 0x1\n\
+ strb r0, [r1]\n\
+_0807730C:\n\
+ lsls r0, r4, 24\n\
+ asrs r0, 24\n\
+ bl SE12PanpotControl\n\
+_08077314:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0807731C: .4byte gUnknown_0202F7B3\n\
+ .syntax divided\n");
+}
+#endif
+
+static void ScriptCmd_panse_26(void)
+{
+ u16 r8;
+ s8 r4;
+ s8 r5;
+ s8 r6;
+ u8 r10;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r8 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r5 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4);
+ r10 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5);
+ taskId = CreateTask(c3_08073CEC, 1);
+ gTasks[taskId].data[0] = r4;
+ gTasks[taskId].data[1] = r5;
+ gTasks[taskId].data[2] = r6;
+ gTasks[taskId].data[3] = r10;
+ gTasks[taskId].data[4] = r4;
+ PlaySE12WithPanning(r8, r4);
+ gUnknown_0202F7B3++;
+ gBattleAnimScriptPtr += 6;
+}
+
+static void ScriptCmd_panse_27(void)
+{
+ u16 r9;
+ u8 r4;
+ u8 r8;
+ u8 r7;
+ u8 r0;
+ s8 r6;
+ s8 r5;
+ s8 r4_2;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r9 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r4 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4);
+ r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 5);
+ r6 = sub_8077094(r0);
+ r5 = sub_8077094(r4);
+ r4_2 = sub_8077094(r8);
+ taskId = CreateTask(c3_08073CEC, 1);
+ gTasks[taskId].data[0] = r6;
+ gTasks[taskId].data[1] = r5;
+ gTasks[taskId].data[2] = r4_2;
+ gTasks[taskId].data[3] = r7;
+ gTasks[taskId].data[4] = r6;
+ PlaySE12WithPanning(r9, r6);
+ gUnknown_0202F7B3++;
+ gBattleAnimScriptPtr += 6;
+}
+
+static void ScriptCmd_panse_1C(void)
+{
+ u16 r5;
+ u8 r0;
+ u8 r8;
+ u8 r9;
+ s8 r4;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r5 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r9 = SCRIPT_READ_8(gBattleAnimScriptPtr + 4);
+ r4 = sub_8076F98(r0);
+ taskId = CreateTask(sub_80774FC, 1);
+ gTasks[taskId].data[0] = r5;
+ gTasks[taskId].data[1] = r4;
+ gTasks[taskId].data[2] = r8;
+ gTasks[taskId].data[3] = r9;
+ gTasks[taskId].data[8] = r8;
+ gTasks[taskId].func(taskId);
+ gUnknown_0202F7B3++;
+ gBattleAnimScriptPtr += 5;
+}
+
+static void sub_80774FC(u8 taskId)
+{
+ s16 data8;
+ u16 r0;
+ s8 r1;
+ u8 r4;
+
+ data8 = gTasks[taskId].data[8];
+ gTasks[taskId].data[8]++;
+ if (data8 >= gTasks[taskId].data[2])
+ {
+ gTasks[taskId].data[8] = 0;
+ r0 = gTasks[taskId].data[0];
+ r1 = gTasks[taskId].data[1];
+ gTasks[taskId].data[3]--;
+ r4 = gTasks[taskId].data[3];
+ PlaySE12WithPanning(r0, r1);
+ if (r4 == 0)
+ {
+ DestroyTask(taskId);
+ gUnknown_0202F7B3--;
+ }
+ }
+}
+
+static void ScriptCmd_panse_1D(void)
+{
+ u16 r5;
+ u8 r0;
+ u8 r8;
+ s8 r4;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ r5 = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 2);
+ r8 = SCRIPT_READ_8(gBattleAnimScriptPtr + 3);
+ r4 = sub_8076F98(r0);
+ taskId = CreateTask(sub_80775CC, 1);
+ gTasks[taskId].data[0] = r5;
+ gTasks[taskId].data[1] = r4;
+ gTasks[taskId].data[2] = r8;
+ gUnknown_0202F7B3++;
+ gBattleAnimScriptPtr += 4;
+}
+
+static void sub_80775CC(u8 taskId)
+{
+ s16 r0;
+
+ r0 = gTasks[taskId].data[2];
+ gTasks[taskId].data[2]--;
+ if (r0 <= 0)
+ {
+ PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[1]);
+ DestroyTask(taskId);
+ gUnknown_0202F7B3--;
+ }
+}
+
+static void ScriptCmd_createtask_1F(void)
+{
+ TaskFunc func;
+ u8 numArgs;
+ int i;
+ u8 taskId;
+
+ gBattleAnimScriptPtr++;
+ func = (TaskFunc)SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 4;
+ numArgs = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr++;
+ for (i = 0; i < numArgs; i++)
+ {
+ gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr += 2;
+ }
+ taskId = CreateTask(func, 1);
+ func(taskId);
+ gUnknown_0202F7B3++;
+}
+
+static void ScriptCmd_waitsound(void)
+{
+ if (gUnknown_0202F7B3 != 0)
+ {
+ gUnknown_03004AF0 = 0;
+ gUnknown_0202F7B0 = 1;
+ }
+ else if (IsSEPlaying())
+ {
+ gUnknown_03004AF0++;
+ if (gUnknown_03004AF0 > 0x5A)
+ {
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ gUnknown_03004AF0 = 0;
+ }
+ else
+ {
+ gUnknown_0202F7B0 = 1;
+ }
+ }
+ else
+ {
+ gUnknown_03004AF0 = 0;
+ gBattleAnimScriptPtr++;
+ gUnknown_0202F7B0 = 0;
+ }
+}
+
+static void ScriptCmd_jumpvareq(void)
+{
+ u8 r2;
+ s16 r1;
+ u8 *addr;
+
+ gBattleAnimScriptPtr++;
+ r2 = SCRIPT_READ_8(gBattleAnimScriptPtr);
+ r1 = SCRIPT_READ_16(gBattleAnimScriptPtr + 1);
+ if (r1 == gBattleAnimArgs[r2])
+ {
+ addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr + 3);
+ gBattleAnimScriptPtr = addr;
+ }
+ else
+ {
+ gBattleAnimScriptPtr += 7;
+ }
+}
+
+static void ScriptCmd_jumpunkcond(void)
+{
+ u8 *addr;
+
+ gBattleAnimScriptPtr++;
+ if (sub_8076BE0())
+ {
+ addr = (u8 *)SCRIPT_READ_32(gBattleAnimScriptPtr);
+ gBattleAnimScriptPtr = addr;
+ }
+ else
+ {
+ gBattleAnimScriptPtr += 4;
+ }
+}
+
+static void ScriptCmd_monbgprio_28(void)
+{
+ u8 r2;
+ u8 r0;
+ u8 r4;
+
+ r2 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ gBattleAnimScriptPtr += 2;
+ if (r2 != 0)
+ r0 = gUnknown_0202F7C9;
+ else
+ r0 = gUnknown_0202F7C8;
+ r4 = battle_get_per_side_status(r0);
+ if (!sub_8076BE0() && (r4 == 0 || r4 == 3))
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG2CNT_BITFIELD.priority = 2;
+ }
+}
+
+static void ScriptCmd_monbgprio_29(void)
+{
+ gBattleAnimScriptPtr++;
+ if (!sub_8076BE0())
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG2CNT_BITFIELD.priority = 2;
+ }
+}
+
+static void ScriptCmd_monbgprio_2A(void)
+{
+ u8 r6;
+ u8 r4;
+ u8 r0;
+
+ r6 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ gBattleAnimScriptPtr += 2;
+ if (battle_side_get_owner(gUnknown_0202F7C8) != battle_side_get_owner(gUnknown_0202F7C9))
+ {
+ if (r6 != 0)
+ r0 = gUnknown_0202F7C9;
+ else
+ r0 = gUnknown_0202F7C8;
+ r4 = battle_get_per_side_status(r0);
+ if (!sub_8076BE0() && (r4 == 0 || r4 == 3))
+ {
+ REG_BG1CNT_BITFIELD.priority = 1;
+ REG_BG2CNT_BITFIELD.priority = 2;
+ }
+ }
+}
+
+static void ScriptCmd_invisible(void)
+{
+ u8 r0;
+ u8 spriteId;
+
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ spriteId = obj_id_for_side_relative_to_move(r0);
+ if (spriteId != 0xFF)
+ {
+ gSprites[spriteId].invisible = TRUE;
+ }
+ gBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_visible(void)
+{
+ u8 r0;
+ u8 spriteId;
+
+ r0 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ spriteId = obj_id_for_side_relative_to_move(r0);
+ if (spriteId != 0xFF)
+ {
+ gSprites[spriteId].invisible = FALSE;
+ }
+ gBattleAnimScriptPtr += 2;
+}
+
+static void ScriptCmd_doublebattle_2D(void)
+{
+ u8 r7;
+ u8 r4;
+ u8 spriteId;
+
+ r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ gBattleAnimScriptPtr += 2;
+ if (!sub_8076BE0() && IsDoubleBattle()
+ && battle_side_get_owner(gUnknown_0202F7C8) == battle_side_get_owner(gUnknown_0202F7C9))
+ {
+ if (r7 == 0)
+ {
+ r4 = battle_get_per_side_status_permutated(gUnknown_0202F7C8);
+ spriteId = obj_id_for_side_relative_to_move(0);
+ }
+ else
+ {
+ r4 = battle_get_per_side_status_permutated(gUnknown_0202F7C9);
+ spriteId = obj_id_for_side_relative_to_move(1);
+ }
+ if (spriteId != 0xFF)
+ {
+ gSprites[spriteId].invisible = FALSE;
+ if (r4 == 2)
+ gSprites[spriteId].oam.priority = 3;
+ if (r4 == 1)
+ sub_8076464(0);
+ else
+ sub_8076464(1);
+ }
+ }
+}
+
+static void ScriptCmd_doublebattle_2E(void)
+{
+ u8 r7;
+ u8 r4;
+ u8 spriteId;
+
+ r7 = SCRIPT_READ_8(gBattleAnimScriptPtr + 1);
+ gBattleAnimScriptPtr += 2;
+ if (!sub_8076BE0() && IsDoubleBattle()
+ && battle_side_get_owner(gUnknown_0202F7C8) == battle_side_get_owner(gUnknown_0202F7C9))
+ {
+ if (r7 == 0)
+ {
+ r4 = battle_get_per_side_status_permutated(gUnknown_0202F7C8);
+ spriteId = obj_id_for_side_relative_to_move(0);
+ }
+ else
+ {
+ r4 = battle_get_per_side_status_permutated(gUnknown_0202F7C9);
+ spriteId = obj_id_for_side_relative_to_move(1);
+ }
+ if (spriteId != 0xFF && r4 == 2)
+ {
+ gSprites[spriteId].oam.priority = 2;
+ }
+ }
+}
+
+static void ScriptCmd_stopsound(void)
+{
+ m4aMPlayStop(&gMPlay_SE1);
+ m4aMPlayStop(&gMPlay_SE2);
+ gBattleAnimScriptPtr++;
+}
diff --git a/src/battle_anim_80A7E7C.c b/src/battle_anim_80A7E7C.c
index 2c7a10be5..474d268a0 100644
--- a/src/battle_anim_80A7E7C.c
+++ b/src/battle_anim_80A7E7C.c
@@ -1,7 +1,8 @@
#include "global.h"
-#include "task.h"
#include "sprite.h"
+#include "task.h"
#include "trig.h"
+#include "battle_anim.h"
#define TASK gTasks[task]
#define SPRITE gSprites[TASK.data[0]]
@@ -16,10 +17,9 @@ extern u8 gUnknown_0202F7C9;
extern u8 obj_id_for_side_relative_to_move(u8 side);
extern void move_anim_task_del(u8 task);
-extern bool8 b_side_obj__get_some_boolean(u8 side);
extern u8 battle_get_side_with_given_state(u8 state);
extern u8 battle_side_get_owner(u8 side);
-extern void oamt_set_x3A_32(struct Sprite *sprite, void (*callback)(struct Sprite*));
+extern void oamt_set_x3A_32(struct Sprite *sprite, void(*callback)(struct Sprite*));
extern void sub_8078458(struct Sprite *sprite);
extern void move_anim_8072740(struct Sprite *sprite);
extern void sub_8078A5C(struct Sprite *sprite);
@@ -27,7 +27,6 @@ extern void sub_80784A8(struct Sprite *sprite);
extern void sub_8078E70(u8 sprite, u8);
extern void obj_id_set_rotscale(u8 sprite, int, int, u16);
extern void sub_8078F40(u8 sprite);
-extern bool8 sub_8076BE0();
extern void sub_8078F9C(u8 sprite);
static void sub_80A7EF0(u8 task);
@@ -46,732 +45,910 @@ static void sub_80A8D8C(u8 task);
void sub_80A8FD8(u8 task);
static void sub_80A913C(u8 taskId);
-void sub_80A7E7C(u8 task) {
- u8 sprite;
- sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
- if (sprite == 0xff) {
- move_anim_task_del(task);
- return;
- }
- gSprites[sprite].pos2.x = gBattleAnimArgs[1];
- gSprites[sprite].pos2.y = gBattleAnimArgs[2];
- TASK.data[0] = sprite;
- TASK.data[1] = gBattleAnimArgs[3];
- TASK.data[2] = gBattleAnimArgs[4];
- TASK.data[3] = gBattleAnimArgs[4];
- TASK.data[4] = gBattleAnimArgs[1];
- TASK.data[5] = gBattleAnimArgs[2];
- TASK.func = sub_80A7EF0;
- sub_80A7EF0(task);
-}
-
-static void sub_80A7EF0(u8 task) {
- if (TASK.data[3] == 0) {
- if (SPRITE.pos2.x == 0) {
- SPRITE.pos2.x = TASK.data[4];
- } else {
- SPRITE.pos2.x = 0;
- }
- if (SPRITE.pos2.y == 0) {
- SPRITE.pos2.y = TASK.data[5];
- } else {
- SPRITE.pos2.y = 0;
- }
- TASK.data[3] = TASK.data[2];
- if (--TASK.data[1] == 0) {
- SPRITE.pos2.x = 0;
- SPRITE.pos2.y = 0;
- move_anim_task_del(task);
- return;
- }
- } else {
- TASK.data[3]--;
- }
-}
-
-
-void sub_80A7FA0(u8 task) {
- u8 sprite;
- bool8 r6;
- u8 side;
- r6 = 0;
- if (gBattleAnimArgs[0] < 4) {
- sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
- if (sprite == 0xff) {
- move_anim_task_del(task);
- return;
- }
- } else if (gBattleAnimArgs[0] != 8) {
- switch (gBattleAnimArgs[0]) {
- case 4:
- side = battle_get_side_with_given_state(0);
- break;
- case 5:
- side = battle_get_side_with_given_state(2);
- break;
- case 6:
- side = battle_get_side_with_given_state(1);
- break;
- case 7:
- default:
- side = battle_get_side_with_given_state(3);
- break;
- }
- if (b_side_obj__get_some_boolean(side) == FALSE) {
- r6 = 1;
- }
- sprite = gUnknown_02024BE0[side];
- } else {
- sprite = gUnknown_02024BE0[gUnknown_0202F7C8];
- }
- if (r6) {
- move_anim_task_del(task);
- return;
- }
- gSprites[sprite].pos2.x = gBattleAnimArgs[1];
- gSprites[sprite].pos2.y = gBattleAnimArgs[2];
- TASK.data[0] = sprite;
- TASK.data[1] = gBattleAnimArgs[3];
- TASK.data[2] = gBattleAnimArgs[4];
- TASK.data[3] = gBattleAnimArgs[4];
- TASK.data[4] = gBattleAnimArgs[1];
- TASK.data[5] = gBattleAnimArgs[2];
- TASK.func = sub_80A808C;
- sub_80A808C(task);
-}
-
-static void sub_80A808C(u8 task) {
- if (TASK.data[3] == 0) {
- if (SPRITE.pos2.x == TASK.data[4]) {
- SPRITE.pos2.x = -TASK.data[4];
- } else {
- SPRITE.pos2.x = TASK.data[4];
- }
- if (SPRITE.pos2.y == TASK.data[5]) {
- SPRITE.pos2.y = -TASK.data[5];
- } else {
- SPRITE.pos2.y = TASK.data[5];
- }
- TASK.data[3] = TASK.data[2];
- if (--TASK.data[1] == 0) {
- SPRITE.pos2.x = 0;
- SPRITE.pos2.y = 0;
- move_anim_task_del(task);
- return;
- }
- } else {
- TASK.data[3]--;
- }
-}
-
-void sub_80A8154(u8 task) {
- u8 sprite;
- sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
- if (sprite == 0xff) {
- move_anim_task_del(task);
- return;
- }
- gSprites[sprite].pos2.x += gBattleAnimArgs[1];
- gSprites[sprite].pos2.y += gBattleAnimArgs[2];
- TASK.data[0] = sprite;
- TASK.data[1] = 0;
- TASK.data[2] = gBattleAnimArgs[3];
- TASK.data[3] = 0;
- TASK.data[4] = gBattleAnimArgs[4];
- TASK.data[5] = gBattleAnimArgs[1] * 2;
- TASK.data[6] = gBattleAnimArgs[2] * 2;
- TASK.func = sub_80A81D8;
- sub_80A81D8(task);
-}
-
-static void sub_80A81D8(u8 task) {
- if (TASK.data[3] == 0) {
- if (TASK.data[1] & 1) {
- SPRITE.pos2.x += TASK.data[5];
- SPRITE.pos2.y += TASK.data[6];
- } else {
- SPRITE.pos2.x -= TASK.data[5];
- SPRITE.pos2.y -= TASK.data[6];
- }
- TASK.data[3] = TASK.data[4];
- if (++TASK.data[1] >= TASK.data[2]) {
- if (TASK.data[1] & 1) {
- SPRITE.pos2.x += TASK.data[5] / 2;
- SPRITE.pos2.y += TASK.data[6] / 2;
- } else {
- SPRITE.pos2.x -= TASK.data[5] / 2;
- SPRITE.pos2.y -= TASK.data[6] / 2;
- }
- move_anim_task_del(task);
- return;
- }
- } else {
- TASK.data[3]--;
- }
-}
-
-void sub_80A8314(u8 task) {
- u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
- gSprites[sprite].pos2.x = gBattleAnimArgs[1];
- TASK.data[0] = sprite;
- TASK.data[1] = gBattleAnimArgs[1];
- TASK.data[2] = gBattleAnimArgs[2];
- TASK.data[3] = gBattleAnimArgs[3];
- TASK.data[4] = gBattleAnimArgs[4];
- TASK.func = sub_80A8374;
- sub_80A8374(task);
-}
-
-static void sub_80A8374(u8 task) {
- s16 x;
- u8 sprite;
- sprite = TASK.data[0];
- x = TASK.data[1];
- if (TASK.data[2] == TASK.data[8]++) {
- TASK.data[8] = 0;
- if (gSprites[sprite].pos2.x == x) {
- x = -x;
- }
- gSprites[sprite].pos2.x += x;
- }
- TASK.data[1] = x;
- TASK.data[9] += TASK.data[3];
- gSprites[sprite].pos2.y = TASK.data[9] >> 8;
- if (--TASK.data[4] == 0) {
- move_anim_task_del(task);
- return;
- }
-}
-
-void sub_80A8408(u8 task) {
- u8 i;
- u8 sprite;
- u8 v1;
- v1 = 1;
- sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
- if (gBattleAnimArgs[4] > 5) {
- gBattleAnimArgs[4] = 5;
- }
- for (i = 0; i < gBattleAnimArgs[4]; i++) {
- v1 <<= 1;
- }
- TASK.data[0] = sprite;
- TASK.data[1] = gBattleAnimArgs[1];
- TASK.data[2] = gBattleAnimArgs[2];
- TASK.data[3] = gBattleAnimArgs[3];
- TASK.data[4] = v1;
- TASK.func = sub_80A8488;
- sub_80A8488(task);
-}
-
-static void sub_80A8488(u8 task) {
- u8 sprite;
- sprite = TASK.data[0];
- gSprites[sprite].pos2.x = Sin(TASK.data[5], TASK.data[1]);
- gSprites[sprite].pos2.y = -Cos(TASK.data[5], TASK.data[2]);
- gSprites[sprite].pos2.y += TASK.data[2];
- TASK.data[5] += TASK.data[4];
- TASK.data[5] &= 0xff;
- if (TASK.data[5] == 0) {
- TASK.data[3]--;
- }
- if (TASK.data[3] == 0) {
- gSprites[sprite].pos2.x = 0;
- gSprites[sprite].pos2.y = 0;
- move_anim_task_del(task);
- return;
- }
-}
-
-void sub_80A8500(u8 task) {
- if (battle_side_get_owner(gUnknown_0202F7C8)) {
- gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- }
- sub_80A8408(task);
-}
-
-void sub_80A8530(struct Sprite *sprite) {
- sprite->invisible = TRUE;
- if (battle_side_get_owner(gUnknown_0202F7C8)) {
- sprite->data1 = -gBattleAnimArgs[1];
- } else {
- sprite->data1 = gBattleAnimArgs[1];
- }
- sprite->data0 = gBattleAnimArgs[0];
- sprite->data2 = 0;
- sprite->data3 = gUnknown_02024BE0[gUnknown_0202F7C8];
- sprite->data4 = gBattleAnimArgs[0];
- oamt_set_x3A_32(sprite, sub_80A85A4);
- sprite->callback = sub_8078458;
-}
-
-static void sub_80A85A4(struct Sprite *sprite) {
- sprite->data0 = sprite->data4;
- sprite->data1 = -sprite->data1;
- sprite->callback = sub_8078458;
- oamt_set_x3A_32(sprite, move_anim_8072740);
-}
-
-void sub_80A85C8(struct Sprite *sprite) {
- u8 spriteId;
- sprite->invisible = TRUE;
- spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]);
- sprite->data0 = gBattleAnimArgs[0];
- sprite->data1 = 0;
- sprite->data2 = gBattleAnimArgs[1];
- sprite->data3 = spriteId;
- sprite->data4 = gBattleAnimArgs[0];
- oamt_set_x3A_32(sprite, sub_80A8614);
- sprite->callback = sub_8078458;
-}
-
-void sub_80A8614(struct Sprite *sprite) {
- sprite->data0 = sprite->data4;
- sprite->data2 = -sprite->data2;
- sprite->callback = sub_8078458;
- oamt_set_x3A_32(sprite, move_anim_8072740);
-}
-
-void sub_80A8638(struct Sprite *sprite) {
- int something;
- int spriteId;
- if (!gBattleAnimArgs[0]) {
- spriteId = gUnknown_02024BE0[gUnknown_0202F7C8];
- } else {
- spriteId = gUnknown_02024BE0[gUnknown_0202F7C9];
- }
- sprite->data0 = gBattleAnimArgs[2];
- sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
- sprite->data2 = gSprites[spriteId].pos1.x;
- sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
- sprite->data4 = gSprites[spriteId].pos1.y;
- something = 0;
- sub_8078A5C(sprite);
- sprite->data3 = something;
- sprite->data4 = something;
- sprite->data5 = gSprites[spriteId].pos2.x;
- sprite->data6 = gSprites[spriteId].pos2.y;
- sprite->invisible = TRUE;
- if (gBattleAnimArgs[1] == 1) {
- sprite->data2 = something;
- } else if (gBattleAnimArgs[1] == 2) {
- sprite->data1 = something;
- }
- sprite->data7 = gBattleAnimArgs[1];
- sprite->data7 |= spriteId << 8;
- sprite->callback = sub_80A86F4;
-}
-
-static void sub_80A86F4(struct Sprite *sprite) {
- s8 spriteId;
- u8 lo;
- struct Sprite *sprite2;
- lo = sprite->data7 & 0xff;
- spriteId = sprite->data7 >> 8;
- sprite2 = &gSprites[spriteId];
- if (sprite->data0 == 0) {
- if (lo < 2) {
- sprite2->pos2.x = 0;
- }
- if (lo == 2 || lo == 0) {
- sprite2->pos2.y = 0;
- }
- move_anim_8072740(sprite);
- } else {
- sprite->data0--;
- sprite->data3 += sprite->data1;
- sprite->data4 += sprite->data2;
- sprite2->pos2.x = (s8)(sprite->data3 >> 8) + sprite->data5;
- sprite2->pos2.y = (s8)(sprite->data4 >> 8) + sprite->data6;
- }
-}
-
-void sub_80A8764(struct Sprite *sprite) {
- u8 v1;
- u8 spriteId;
- if (!gBattleAnimArgs[0]) {
- v1 = gUnknown_0202F7C8;
- } else {
- v1 = gUnknown_0202F7C9;
- }
- spriteId = gUnknown_02024BE0[v1];
- if (battle_side_get_owner(v1)) {
- gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- if (gBattleAnimArgs[3] == 1) {
- gBattleAnimArgs[2] = -gBattleAnimArgs[2];
- }
- }
- sprite->data0 = gBattleAnimArgs[4];
- sprite->data1 = gSprites[spriteId].pos1.x;
- sprite->data2 = gSprites[spriteId].pos1.x + gBattleAnimArgs[1];
- sprite->data3 = gSprites[spriteId].pos1.y;
- sprite->data4 = gSprites[spriteId].pos1.y + gBattleAnimArgs[2];
- sub_8078A5C(sprite);
- sprite->data3 = 0;
- sprite->data4 = 0;
- sprite->data5 = spriteId;
- sprite->invisible = TRUE;
- oamt_set_x3A_32(sprite, move_anim_8072740);
- sprite->callback = sub_80784A8;
-}
-
-void sub_80A8818(struct Sprite *sprite) {
- u8 spriteId;
- u8 v1;
- sprite->invisible = TRUE;
- if (!gBattleAnimArgs[0]) {
- v1 = gUnknown_0202F7C8;
- } else {
- v1 = gUnknown_0202F7C9;
- }
- spriteId = gUnknown_02024BE0[v1];
- if (battle_side_get_owner(v1)) {
- gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- if (gBattleAnimArgs[3] == 1) {
- gBattleAnimArgs[2] = -gBattleAnimArgs[2];
- }
- }
- sprite->data0 = gBattleAnimArgs[4];
- sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
- sprite->data2 = sprite->data1 + gBattleAnimArgs[1];
- sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
- sprite->data4 = sprite->data3 + gBattleAnimArgs[2];
- sub_8078A5C(sprite);
- sprite->data3 = gSprites[spriteId].pos2.x << 8;
- sprite->data4 = gSprites[spriteId].pos2.y << 8;
- sprite->data5 = spriteId;
- sprite->data6 = gBattleAnimArgs[5];
- if (!gBattleAnimArgs[5]) {
- oamt_set_x3A_32(sprite, move_anim_8072740);
- } else {
- oamt_set_x3A_32(sprite, sub_80A88F0);
- }
- sprite->callback = sub_80784A8;
-}
-
-
-static void sub_80A88F0(struct Sprite *sprite) {
- gSprites[sprite->data5].pos2.x = 0;
- gSprites[sprite->data5].pos2.y = 0;
- move_anim_8072740(sprite);
-}
-
-void sub_80A8920(u8 task) {
- s16 r7;
- r7 = 0x8000 / gBattleAnimArgs[3];
- if (battle_side_get_owner(gUnknown_0202F7C8)) {
- gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- gBattleAnimArgs[5] = -gBattleAnimArgs[5];
- }
- TASK.data[0] = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
- TASK.data[1] = (gBattleAnimArgs[1] << 8) / gBattleAnimArgs[3];
- TASK.data[2] = gBattleAnimArgs[2];
- TASK.data[3] = gBattleAnimArgs[3];
- TASK.data[4] = gBattleAnimArgs[4];
- TASK.data[5] = (gBattleAnimArgs[5] << 8) / gBattleAnimArgs[6];
- TASK.data[6] = gBattleAnimArgs[6];
- TASK.data[7] = r7;
- TASK.func = sub_80A89B4;
-}
-
-static void sub_80A89B4(u8 task) {
- u8 spriteId;
- spriteId = TASK.data[0];
- TASK.data[11] += TASK.data[1];
- gSprites[spriteId].pos2.x = TASK.data[11] >> 8;
- gSprites[spriteId].pos2.y = Sin((u8)(TASK.data[10] >> 8), TASK.data[2]);
- TASK.data[10] += TASK.data[7];
- if (--TASK.data[3] == 0) {
- TASK.func = sub_80A8A18;
- }
-}
-
-static void sub_80A8A18(u8 task) {
- u8 spriteId;
- if (TASK.data[4] > 0) {
- TASK.data[4]--;
- } else {
- spriteId = TASK.data[0];
- TASK.data[12] += TASK.data[5];
- gSprites[spriteId].pos2.x = (TASK.data[12] >> 8) + (TASK.data[11] >> 8);
- if (--TASK.data[6] == 0) {
- move_anim_task_del(task);
- return;
- }
- }
+void sub_80A7E7C(u8 task)
+{
+ u8 sprite;
+ sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
+ if (sprite == 0xff)
+ {
+ move_anim_task_del(task);
+ return;
+ }
+ gSprites[sprite].pos2.x = gBattleAnimArgs[1];
+ gSprites[sprite].pos2.y = gBattleAnimArgs[2];
+ TASK.data[0] = sprite;
+ TASK.data[1] = gBattleAnimArgs[3];
+ TASK.data[2] = gBattleAnimArgs[4];
+ TASK.data[3] = gBattleAnimArgs[4];
+ TASK.data[4] = gBattleAnimArgs[1];
+ TASK.data[5] = gBattleAnimArgs[2];
+ TASK.func = sub_80A7EF0;
+ sub_80A7EF0(task);
+}
+
+static void sub_80A7EF0(u8 task)
+{
+ if (TASK.data[3] == 0)
+ {
+ if (SPRITE.pos2.x == 0)
+ {
+ SPRITE.pos2.x = TASK.data[4];
+ }
+ else
+ {
+ SPRITE.pos2.x = 0;
+ }
+ if (SPRITE.pos2.y == 0)
+ {
+ SPRITE.pos2.y = TASK.data[5];
+ }
+ else
+ {
+ SPRITE.pos2.y = 0;
+ }
+ TASK.data[3] = TASK.data[2];
+ if (--TASK.data[1] == 0)
+ {
+ SPRITE.pos2.x = 0;
+ SPRITE.pos2.y = 0;
+ move_anim_task_del(task);
+ return;
+ }
+ }
+ else
+ {
+ TASK.data[3]--;
+ }
+}
+
+
+void sub_80A7FA0(u8 task)
+{
+ u8 sprite;
+ bool8 r6;
+ u8 side;
+ r6 = 0;
+ if (gBattleAnimArgs[0] < 4)
+ {
+ sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
+ if (sprite == 0xff)
+ {
+ move_anim_task_del(task);
+ return;
+ }
+ }
+ else if (gBattleAnimArgs[0] != 8)
+ {
+ switch (gBattleAnimArgs[0])
+ {
+ case 4:
+ side = battle_get_side_with_given_state(0);
+ break;
+ case 5:
+ side = battle_get_side_with_given_state(2);
+ break;
+ case 6:
+ side = battle_get_side_with_given_state(1);
+ break;
+ case 7:
+ default:
+ side = battle_get_side_with_given_state(3);
+ break;
+ }
+ if (b_side_obj__get_some_boolean(side) == FALSE)
+ {
+ r6 = 1;
+ }
+ sprite = gUnknown_02024BE0[side];
+ }
+ else
+ {
+ sprite = gUnknown_02024BE0[gUnknown_0202F7C8];
+ }
+ if (r6)
+ {
+ move_anim_task_del(task);
+ return;
+ }
+ gSprites[sprite].pos2.x = gBattleAnimArgs[1];
+ gSprites[sprite].pos2.y = gBattleAnimArgs[2];
+ TASK.data[0] = sprite;
+ TASK.data[1] = gBattleAnimArgs[3];
+ TASK.data[2] = gBattleAnimArgs[4];
+ TASK.data[3] = gBattleAnimArgs[4];
+ TASK.data[4] = gBattleAnimArgs[1];
+ TASK.data[5] = gBattleAnimArgs[2];
+ TASK.func = sub_80A808C;
+ sub_80A808C(task);
+}
+
+static void sub_80A808C(u8 task)
+{
+ if (TASK.data[3] == 0)
+ {
+ if (SPRITE.pos2.x == TASK.data[4])
+ {
+ SPRITE.pos2.x = -TASK.data[4];
+ }
+ else
+ {
+ SPRITE.pos2.x = TASK.data[4];
+ }
+ if (SPRITE.pos2.y == TASK.data[5])
+ {
+ SPRITE.pos2.y = -TASK.data[5];
+ }
+ else
+ {
+ SPRITE.pos2.y = TASK.data[5];
+ }
+ TASK.data[3] = TASK.data[2];
+ if (--TASK.data[1] == 0)
+ {
+ SPRITE.pos2.x = 0;
+ SPRITE.pos2.y = 0;
+ move_anim_task_del(task);
+ return;
+ }
+ }
+ else
+ {
+ TASK.data[3]--;
+ }
+}
+
+void sub_80A8154(u8 task)
+{
+ u8 sprite;
+ sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
+ if (sprite == 0xff)
+ {
+ move_anim_task_del(task);
+ return;
+ }
+ gSprites[sprite].pos2.x += gBattleAnimArgs[1];
+ gSprites[sprite].pos2.y += gBattleAnimArgs[2];
+ TASK.data[0] = sprite;
+ TASK.data[1] = 0;
+ TASK.data[2] = gBattleAnimArgs[3];
+ TASK.data[3] = 0;
+ TASK.data[4] = gBattleAnimArgs[4];
+ TASK.data[5] = gBattleAnimArgs[1] * 2;
+ TASK.data[6] = gBattleAnimArgs[2] * 2;
+ TASK.func = sub_80A81D8;
+ sub_80A81D8(task);
+}
+
+static void sub_80A81D8(u8 task)
+{
+ if (TASK.data[3] == 0)
+ {
+ if (TASK.data[1] & 1)
+ {
+ SPRITE.pos2.x += TASK.data[5];
+ SPRITE.pos2.y += TASK.data[6];
+ }
+ else
+ {
+ SPRITE.pos2.x -= TASK.data[5];
+ SPRITE.pos2.y -= TASK.data[6];
+ }
+ TASK.data[3] = TASK.data[4];
+ if (++TASK.data[1] >= TASK.data[2])
+ {
+ if (TASK.data[1] & 1)
+ {
+ SPRITE.pos2.x += TASK.data[5] / 2;
+ SPRITE.pos2.y += TASK.data[6] / 2;
+ }
+ else
+ {
+ SPRITE.pos2.x -= TASK.data[5] / 2;
+ SPRITE.pos2.y -= TASK.data[6] / 2;
+ }
+ move_anim_task_del(task);
+ return;
+ }
+ }
+ else
+ {
+ TASK.data[3]--;
+ }
+}
+
+void sub_80A8314(u8 task)
+{
+ u8 sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
+ gSprites[sprite].pos2.x = gBattleAnimArgs[1];
+ TASK.data[0] = sprite;
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[3];
+ TASK.data[4] = gBattleAnimArgs[4];
+ TASK.func = sub_80A8374;
+ sub_80A8374(task);
+}
+
+static void sub_80A8374(u8 task)
+{
+ s16 x;
+ u8 sprite;
+ sprite = TASK.data[0];
+ x = TASK.data[1];
+ if (TASK.data[2] == TASK.data[8]++)
+ {
+ TASK.data[8] = 0;
+ if (gSprites[sprite].pos2.x == x)
+ {
+ x = -x;
+ }
+ gSprites[sprite].pos2.x += x;
+ }
+ TASK.data[1] = x;
+ TASK.data[9] += TASK.data[3];
+ gSprites[sprite].pos2.y = TASK.data[9] >> 8;
+ if (--TASK.data[4] == 0)
+ {
+ move_anim_task_del(task);
+ return;
+ }
+}
+
+void sub_80A8408(u8 task)
+{
+ u8 i;
+ u8 sprite;
+ u8 v1;
+ v1 = 1;
+ sprite = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
+ if (gBattleAnimArgs[4] > 5)
+ {
+ gBattleAnimArgs[4] = 5;
+ }
+ for (i = 0; i < gBattleAnimArgs[4]; i++)
+ {
+ v1 <<= 1;
+ }
+ TASK.data[0] = sprite;
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[3];
+ TASK.data[4] = v1;
+ TASK.func = sub_80A8488;
+ sub_80A8488(task);
+}
+
+static void sub_80A8488(u8 task)
+{
+ u8 sprite;
+ sprite = TASK.data[0];
+ gSprites[sprite].pos2.x = Sin(TASK.data[5], TASK.data[1]);
+ gSprites[sprite].pos2.y = -Cos(TASK.data[5], TASK.data[2]);
+ gSprites[sprite].pos2.y += TASK.data[2];
+ TASK.data[5] += TASK.data[4];
+ TASK.data[5] &= 0xff;
+ if (TASK.data[5] == 0)
+ {
+ TASK.data[3]--;
+ }
+ if (TASK.data[3] == 0)
+ {
+ gSprites[sprite].pos2.x = 0;
+ gSprites[sprite].pos2.y = 0;
+ move_anim_task_del(task);
+ return;
+ }
+}
+
+void sub_80A8500(u8 task)
+{
+ if (battle_side_get_owner(gUnknown_0202F7C8))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ sub_80A8408(task);
+}
+
+void sub_80A8530(struct Sprite *sprite)
+{
+ sprite->invisible = TRUE;
+ if (battle_side_get_owner(gUnknown_0202F7C8))
+ {
+ sprite->data1 = -gBattleAnimArgs[1];
+ }
+ else
+ {
+ sprite->data1 = gBattleAnimArgs[1];
+ }
+ sprite->data0 = gBattleAnimArgs[0];
+ sprite->data2 = 0;
+ sprite->data3 = gUnknown_02024BE0[gUnknown_0202F7C8];
+ sprite->data4 = gBattleAnimArgs[0];
+ oamt_set_x3A_32(sprite, sub_80A85A4);
+ sprite->callback = sub_8078458;
+}
+
+static void sub_80A85A4(struct Sprite *sprite)
+{
+ sprite->data0 = sprite->data4;
+ sprite->data1 = -sprite->data1;
+ sprite->callback = sub_8078458;
+ oamt_set_x3A_32(sprite, move_anim_8072740);
+}
+
+void sub_80A85C8(struct Sprite *sprite)
+{
+ u8 spriteId;
+ sprite->invisible = TRUE;
+ spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]);
+ sprite->data0 = gBattleAnimArgs[0];
+ sprite->data1 = 0;
+ sprite->data2 = gBattleAnimArgs[1];
+ sprite->data3 = spriteId;
+ sprite->data4 = gBattleAnimArgs[0];
+ oamt_set_x3A_32(sprite, sub_80A8614);
+ sprite->callback = sub_8078458;
+}
+
+void sub_80A8614(struct Sprite *sprite)
+{
+ sprite->data0 = sprite->data4;
+ sprite->data2 = -sprite->data2;
+ sprite->callback = sub_8078458;
+ oamt_set_x3A_32(sprite, move_anim_8072740);
+}
+
+void sub_80A8638(struct Sprite *sprite)
+{
+ int something;
+ int spriteId;
+ if (!gBattleAnimArgs[0])
+ {
+ spriteId = gUnknown_02024BE0[gUnknown_0202F7C8];
+ }
+ else
+ {
+ spriteId = gUnknown_02024BE0[gUnknown_0202F7C9];
+ }
+ sprite->data0 = gBattleAnimArgs[2];
+ sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ sprite->data2 = gSprites[spriteId].pos1.x;
+ sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ sprite->data4 = gSprites[spriteId].pos1.y;
+ something = 0;
+ sub_8078A5C(sprite);
+ sprite->data3 = something;
+ sprite->data4 = something;
+ sprite->data5 = gSprites[spriteId].pos2.x;
+ sprite->data6 = gSprites[spriteId].pos2.y;
+ sprite->invisible = TRUE;
+ if (gBattleAnimArgs[1] == 1)
+ {
+ sprite->data2 = something;
+ }
+ else if (gBattleAnimArgs[1] == 2)
+ {
+ sprite->data1 = something;
+ }
+ sprite->data7 = gBattleAnimArgs[1];
+ sprite->data7 |= spriteId << 8;
+ sprite->callback = sub_80A86F4;
+}
+
+static void sub_80A86F4(struct Sprite *sprite)
+{
+ s8 spriteId;
+ u8 lo;
+ struct Sprite *sprite2;
+ lo = sprite->data7 & 0xff;
+ spriteId = sprite->data7 >> 8;
+ sprite2 = &gSprites[spriteId];
+ if (sprite->data0 == 0)
+ {
+ if (lo < 2)
+ {
+ sprite2->pos2.x = 0;
+ }
+ if (lo == 2 || lo == 0)
+ {
+ sprite2->pos2.y = 0;
+ }
+ move_anim_8072740(sprite);
+ }
+ else
+ {
+ sprite->data0--;
+ sprite->data3 += sprite->data1;
+ sprite->data4 += sprite->data2;
+ sprite2->pos2.x = (s8)(sprite->data3 >> 8) + sprite->data5;
+ sprite2->pos2.y = (s8)(sprite->data4 >> 8) + sprite->data6;
+ }
+}
+
+void sub_80A8764(struct Sprite *sprite)
+{
+ u8 v1;
+ u8 spriteId;
+ if (!gBattleAnimArgs[0])
+ {
+ v1 = gUnknown_0202F7C8;
+ }
+ else
+ {
+ v1 = gUnknown_0202F7C9;
+ }
+ spriteId = gUnknown_02024BE0[v1];
+ if (battle_side_get_owner(v1))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[3] == 1)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ }
+ sprite->data0 = gBattleAnimArgs[4];
+ sprite->data1 = gSprites[spriteId].pos1.x;
+ sprite->data2 = gSprites[spriteId].pos1.x + gBattleAnimArgs[1];
+ sprite->data3 = gSprites[spriteId].pos1.y;
+ sprite->data4 = gSprites[spriteId].pos1.y + gBattleAnimArgs[2];
+ sub_8078A5C(sprite);
+ sprite->data3 = 0;
+ sprite->data4 = 0;
+ sprite->data5 = spriteId;
+ sprite->invisible = TRUE;
+ oamt_set_x3A_32(sprite, move_anim_8072740);
+ sprite->callback = sub_80784A8;
+}
+
+void sub_80A8818(struct Sprite *sprite)
+{
+ u8 spriteId;
+ u8 v1;
+ sprite->invisible = TRUE;
+ if (!gBattleAnimArgs[0])
+ {
+ v1 = gUnknown_0202F7C8;
+ }
+ else
+ {
+ v1 = gUnknown_0202F7C9;
+ }
+ spriteId = gUnknown_02024BE0[v1];
+ if (battle_side_get_owner(v1))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ if (gBattleAnimArgs[3] == 1)
+ {
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+ }
+ }
+ sprite->data0 = gBattleAnimArgs[4];
+ sprite->data1 = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x;
+ sprite->data2 = sprite->data1 + gBattleAnimArgs[1];
+ sprite->data3 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
+ sprite->data4 = sprite->data3 + gBattleAnimArgs[2];
+ sub_8078A5C(sprite);
+ sprite->data3 = gSprites[spriteId].pos2.x << 8;
+ sprite->data4 = gSprites[spriteId].pos2.y << 8;
+ sprite->data5 = spriteId;
+ sprite->data6 = gBattleAnimArgs[5];
+ if (!gBattleAnimArgs[5])
+ {
+ oamt_set_x3A_32(sprite, move_anim_8072740);
+ }
+ else
+ {
+ oamt_set_x3A_32(sprite, sub_80A88F0);
+ }
+ sprite->callback = sub_80784A8;
+}
+
+
+static void sub_80A88F0(struct Sprite *sprite)
+{
+ gSprites[sprite->data5].pos2.x = 0;
+ gSprites[sprite->data5].pos2.y = 0;
+ move_anim_8072740(sprite);
+}
+
+void sub_80A8920(u8 task)
+{
+ s16 r7;
+ r7 = 0x8000 / gBattleAnimArgs[3];
+ if (battle_side_get_owner(gUnknown_0202F7C8))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ gBattleAnimArgs[5] = -gBattleAnimArgs[5];
+ }
+ TASK.data[0] = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
+ TASK.data[1] = (gBattleAnimArgs[1] << 8) / gBattleAnimArgs[3];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[3];
+ TASK.data[4] = gBattleAnimArgs[4];
+ TASK.data[5] = (gBattleAnimArgs[5] << 8) / gBattleAnimArgs[6];
+ TASK.data[6] = gBattleAnimArgs[6];
+ TASK.data[7] = r7;
+ TASK.func = sub_80A89B4;
+}
+
+static void sub_80A89B4(u8 task)
+{
+ u8 spriteId;
+ spriteId = TASK.data[0];
+ TASK.data[11] += TASK.data[1];
+ gSprites[spriteId].pos2.x = TASK.data[11] >> 8;
+ gSprites[spriteId].pos2.y = Sin((u8)(TASK.data[10] >> 8), TASK.data[2]);
+ TASK.data[10] += TASK.data[7];
+ if (--TASK.data[3] == 0)
+ {
+ TASK.func = sub_80A8A18;
+ }
+}
+
+static void sub_80A8A18(u8 task)
+{
+ u8 spriteId;
+ if (TASK.data[4] > 0)
+ {
+ TASK.data[4]--;
+ }
+ else
+ {
+ spriteId = TASK.data[0];
+ TASK.data[12] += TASK.data[5];
+ gSprites[spriteId].pos2.x = (TASK.data[12] >> 8) + (TASK.data[11] >> 8);
+ if (--TASK.data[6] == 0)
+ {
+ move_anim_task_del(task);
+ return;
+ }
+ }
}
static void sub_80A8B3C(u8 task);
-void sub_80A8A80(u8 task) {
- u8 spriteId;
- switch (gBattleAnimArgs[0]) {
- case 0:
- case 1:
- spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
- break;
- case 2:
- if (!b_side_obj__get_some_boolean(gUnknown_0202F7C8 ^ 2)) {
- move_anim_task_del(task);
- return;
- }
- spriteId = gUnknown_02024BE0[gUnknown_0202F7C8 ^ 2];
- break;
- case 3:
- if (!b_side_obj__get_some_boolean(gUnknown_0202F7C9 ^ 2)) {
- move_anim_task_del(task);
- return;
- }
- spriteId = gUnknown_02024BE0[gUnknown_0202F7C9 ^ 2];
- break;
- default:
- move_anim_task_del(task);
- return;
- }
- TASK.data[0] = spriteId;
- if (battle_side_get_owner(gUnknown_0202F7C9)) {
- TASK.data[1] = gBattleAnimArgs[1];
- } else {
- TASK.data[1] = -gBattleAnimArgs[1];
- }
- TASK.func = sub_80A8B3C;
-}
-
-static void sub_80A8B3C(u8 task) {
- u8 spriteId = TASK.data[0];
- gSprites[spriteId].pos2.x += TASK.data[1];
- if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x + 0x20 > 0x130u) {
- move_anim_task_del(task);
- return;
- }
-}
-
-void sub_80A8B88(u8 task) {
- u8 spriteId;
- if (battle_side_get_owner(gUnknown_0202F7C8)) {
- gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- }
- spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[4]);
- TASK.data[0] = gBattleAnimArgs[0];
- TASK.data[1] = gBattleAnimArgs[1];
- TASK.data[2] = gBattleAnimArgs[2];
- TASK.data[3] = gBattleAnimArgs[3];
- TASK.data[4] = spriteId;
- if (gBattleAnimArgs[4] == 0) {
- TASK.data[5] = gUnknown_0202F7C8;
- } else {
- TASK.data[5] = gUnknown_0202F7C9;
- }
- TASK.data[12] = 1;
- TASK.func = sub_80A8C0C;
-}
-
-static void sub_80A8C0C(u8 task) {
- s16 y;
- u8 spriteId;
- int index;
- u16 val;
- spriteId = TASK.data[4];
- val = TASK.data[10] + TASK.data[2];
- TASK.data[10] = val;
- index = val >> 8;
- y = Sin(index, TASK.data[1]);
- if (TASK.data[0] == 0) {
- gSprites[spriteId].pos2.x = y;
- } else {
- if (battle_side_get_owner(TASK.data[5]) == 0) {
- gSprites[spriteId].pos2.y = (y >= 0) ? y : -y;
- } else {
- gSprites[spriteId].pos2.y = (y >= 0) ? -y : y;
- }
- }
- if (((index >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1))
- || ((index < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0))) {
- TASK.data[11] ^= 1;
- TASK.data[12] ^= 1;
- if (--TASK.data[3] == 0) {
- gSprites[spriteId].pos2.x = 0;
- gSprites[spriteId].pos2.y = 0;
- move_anim_task_del(task);
- return;
- }
- }
-}
-
-void sub_80A8D34(u8 task) {
- u8 spriteId;
- spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[3]);
- sub_8078E70(spriteId, gBattleAnimArgs[4]);
- TASK.data[0] = gBattleAnimArgs[0];
- TASK.data[1] = gBattleAnimArgs[1];
- TASK.data[2] = gBattleAnimArgs[2];
- TASK.data[3] = gBattleAnimArgs[2];
- TASK.data[4] = spriteId;
- TASK.data[10] = 0x100;
- TASK.data[11] = 0x100;
- TASK.func = sub_80A8D8C;
-}
-
-static void sub_80A8D8C(u8 task) {
- u8 spriteId;
- TASK.data[10] += TASK.data[0];
- TASK.data[11] += TASK.data[1];
- spriteId = TASK.data[4];
- obj_id_set_rotscale(spriteId, TASK.data[10], TASK.data[11], 0);
- if (--TASK.data[2] == 0) {
- if (TASK.data[3] > 0) {
- TASK.data[0] = -TASK.data[0];
- TASK.data[1] = -TASK.data[1];
- TASK.data[2] = TASK.data[3];
- TASK.data[3] = 0;
- } else {
- sub_8078F40(spriteId);
- move_anim_task_del(task);
- return;
- }
- }
-}
-
-void sub_80A8E04(u8 task) {
- u8 spriteId;
- spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]);
- sub_8078E70(spriteId, 0);
- TASK.data[1] = 0;
- TASK.data[2] = gBattleAnimArgs[0];
- if (gBattleAnimArgs[3] != 1) {
- TASK.data[3] = 0;
- } else {
- TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
- }
- TASK.data[4] = gBattleAnimArgs[1];
- TASK.data[5] = spriteId;
- TASK.data[6] = gBattleAnimArgs[3];
- if (sub_8076BE0()) {
- TASK.data[7] = 1;
- } else {
- if (gBattleAnimArgs[2] == 0) {
- TASK.data[7] = !battle_side_get_owner(gUnknown_0202F7C8);
- } else {
- TASK.data[7] = !battle_side_get_owner(gUnknown_0202F7C9);
- }
- }
- if (TASK.data[7]) {
- if (!sub_8076BE0()) {
- TASK.data[3] *= -1;
- TASK.data[4] *= -1;
- }
- }
- TASK.func = sub_80A8FD8;
-}
-
-void sub_80A8EFC(u8 task) {
- u8 spriteId;
- spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]);
- sub_8078E70(spriteId, 0);
- TASK.data[1] = 0;
- TASK.data[2] = gBattleAnimArgs[0];
- if (gBattleAnimArgs[2] == 0) {
- if (battle_side_get_owner(gUnknown_0202F7C8)) {
- gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- }
- } else {
- if (battle_side_get_owner(gUnknown_0202F7C9)) {
- gBattleAnimArgs[1] = -gBattleAnimArgs[1];
- }
- }
- if (gBattleAnimArgs[3] != 1) {
- TASK.data[3] = 0;
- } else {
- TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
- }
- TASK.data[4] = gBattleAnimArgs[1];
- TASK.data[5] = spriteId;
- TASK.data[6] = gBattleAnimArgs[3];
- TASK.data[7] = 1;
- TASK.data[3] *= -1;
- TASK.data[4] *= -1;
- TASK.func = sub_80A8FD8;
-}
-
-void sub_80A8FD8(u8 task) {
- TASK.data[3] += TASK.data[4];
- obj_id_set_rotscale(TASK.data[5], 0x100, 0x100, TASK.data[3]);
- if (TASK.data[7]) {
- sub_8078F9C(TASK.data[5]);
- }
- if (++TASK.data[1] >= TASK.data[2]) {
- switch (TASK.data[6]) {
- case 1:
- sub_8078F40(TASK.data[5]);
- case 0:
- default:
- move_anim_task_del(task);
- return;
- case 2:
- TASK.data[1] = 0;
- TASK.data[4] *= -1;
- TASK.data[6] = 1;
- break;
- }
- }
-}
-
-void sub_80A9058(u8 task) {
- if (!gBattleAnimArgs[0]) {
- TASK.data[15] = gUnknown_0202F7BC / 12;
- if (TASK.data[15] < 1) {
- TASK.data[15] = 1;
- }
- if (TASK.data[15] > 16) {
- TASK.data[15] = 16;
- }
- } else {
- TASK.data[15] = gUnknown_0202F7B8 / 12;
- if (TASK.data[15] < 1) {
- TASK.data[15] = 1;
- }
- if (TASK.data[15] > 16) {
- TASK.data[15] = 16;
- }
- }
- TASK.data[14] = TASK.data[15] / 2;
- TASK.data[13] = TASK.data[14] + (TASK.data[15] & 1);
- TASK.data[12] = 0;
- TASK.data[10] = gBattleAnimArgs[3];
- TASK.data[11] = gBattleAnimArgs[4];
- TASK.data[7] = obj_id_for_side_relative_to_move(1);
- TASK.data[8] = gSprites[TASK.data[7]].pos2.x;
- TASK.data[9] = gSprites[TASK.data[7]].pos2.y;
- TASK.data[0] = 0;
- TASK.data[1] = gBattleAnimArgs[1];
- TASK.data[2] = gBattleAnimArgs[2];
- TASK.func = sub_80A913C;
-}
-
-static void sub_80A913C(u8 taskId) {
- struct Task *task = &gTasks[taskId];
- if (++task->data[0] > task->data[1]) {
- task->data[0] = 0;
- task->data[12] = (task->data[12] + 1) & 1;
- if (task->data[10]) {
- if (task->data[12]) {
- gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13];
- } else {
- gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14];
- }
- }
- if (task->data[11]) {
- if (task->data[12]) {
- gSprites[task->data[7]].pos2.y = task->data[15];
- } else {
- gSprites[task->data[7]].pos2.y = 0;
- }
- }
- if (!--task->data[2]) {
- gSprites[task->data[7]].pos2.x = 0;
- gSprites[task->data[7]].pos2.y = 0;
- move_anim_task_del(taskId);
- return;
- }
- }
+void sub_80A8A80(u8 task)
+{
+ u8 spriteId;
+ switch (gBattleAnimArgs[0])
+ {
+ case 0:
+ case 1:
+ spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[0]);
+ break;
+ case 2:
+ if (!b_side_obj__get_some_boolean(gUnknown_0202F7C8 ^ 2))
+ {
+ move_anim_task_del(task);
+ return;
+ }
+ spriteId = gUnknown_02024BE0[gUnknown_0202F7C8 ^ 2];
+ break;
+ case 3:
+ if (!b_side_obj__get_some_boolean(gUnknown_0202F7C9 ^ 2))
+ {
+ move_anim_task_del(task);
+ return;
+ }
+ spriteId = gUnknown_02024BE0[gUnknown_0202F7C9 ^ 2];
+ break;
+ default:
+ move_anim_task_del(task);
+ return;
+ }
+ TASK.data[0] = spriteId;
+ if (battle_side_get_owner(gUnknown_0202F7C9))
+ {
+ TASK.data[1] = gBattleAnimArgs[1];
+ }
+ else
+ {
+ TASK.data[1] = -gBattleAnimArgs[1];
+ }
+ TASK.func = sub_80A8B3C;
+}
+
+static void sub_80A8B3C(u8 task)
+{
+ u8 spriteId = TASK.data[0];
+ gSprites[spriteId].pos2.x += TASK.data[1];
+ if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x + 0x20 > 0x130u)
+ {
+ move_anim_task_del(task);
+ return;
+ }
+}
+
+void sub_80A8B88(u8 task)
+{
+ u8 spriteId;
+ if (battle_side_get_owner(gUnknown_0202F7C8))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[4]);
+ TASK.data[0] = gBattleAnimArgs[0];
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[3];
+ TASK.data[4] = spriteId;
+ if (gBattleAnimArgs[4] == 0)
+ {
+ TASK.data[5] = gUnknown_0202F7C8;
+ }
+ else
+ {
+ TASK.data[5] = gUnknown_0202F7C9;
+ }
+ TASK.data[12] = 1;
+ TASK.func = sub_80A8C0C;
+}
+
+static void sub_80A8C0C(u8 task)
+{
+ s16 y;
+ u8 spriteId;
+ int index;
+ u16 val;
+ spriteId = TASK.data[4];
+ val = TASK.data[10] + TASK.data[2];
+ TASK.data[10] = val;
+ index = val >> 8;
+ y = Sin(index, TASK.data[1]);
+ if (TASK.data[0] == 0)
+ {
+ gSprites[spriteId].pos2.x = y;
+ }
+ else
+ {
+ if (battle_side_get_owner(TASK.data[5]) == 0)
+ {
+ gSprites[spriteId].pos2.y = (y >= 0) ? y : -y;
+ }
+ else
+ {
+ gSprites[spriteId].pos2.y = (y >= 0) ? -y : y;
+ }
+ }
+ if (((index >= 0x80u) && (TASK.data[11] == 0) && (TASK.data[12] == 1))
+ || ((index < 0x7fu) && (TASK.data[11] == 1) && (TASK.data[12] == 0)))
+ {
+ TASK.data[11] ^= 1;
+ TASK.data[12] ^= 1;
+ if (--TASK.data[3] == 0)
+ {
+ gSprites[spriteId].pos2.x = 0;
+ gSprites[spriteId].pos2.y = 0;
+ move_anim_task_del(task);
+ return;
+ }
+ }
+}
+
+void sub_80A8D34(u8 task)
+{
+ u8 spriteId;
+ spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[3]);
+ sub_8078E70(spriteId, gBattleAnimArgs[4]);
+ TASK.data[0] = gBattleAnimArgs[0];
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.data[3] = gBattleAnimArgs[2];
+ TASK.data[4] = spriteId;
+ TASK.data[10] = 0x100;
+ TASK.data[11] = 0x100;
+ TASK.func = sub_80A8D8C;
+}
+
+static void sub_80A8D8C(u8 task)
+{
+ u8 spriteId;
+ TASK.data[10] += TASK.data[0];
+ TASK.data[11] += TASK.data[1];
+ spriteId = TASK.data[4];
+ obj_id_set_rotscale(spriteId, TASK.data[10], TASK.data[11], 0);
+ if (--TASK.data[2] == 0)
+ {
+ if (TASK.data[3] > 0)
+ {
+ TASK.data[0] = -TASK.data[0];
+ TASK.data[1] = -TASK.data[1];
+ TASK.data[2] = TASK.data[3];
+ TASK.data[3] = 0;
+ }
+ else
+ {
+ sub_8078F40(spriteId);
+ move_anim_task_del(task);
+ return;
+ }
+ }
+}
+
+void sub_80A8E04(u8 task)
+{
+ u8 spriteId;
+ spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]);
+ sub_8078E70(spriteId, 0);
+ TASK.data[1] = 0;
+ TASK.data[2] = gBattleAnimArgs[0];
+ if (gBattleAnimArgs[3] != 1)
+ {
+ TASK.data[3] = 0;
+ }
+ else
+ {
+ TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
+ }
+ TASK.data[4] = gBattleAnimArgs[1];
+ TASK.data[5] = spriteId;
+ TASK.data[6] = gBattleAnimArgs[3];
+ if (sub_8076BE0())
+ {
+ TASK.data[7] = 1;
+ }
+ else
+ {
+ if (gBattleAnimArgs[2] == 0)
+ {
+ TASK.data[7] = !battle_side_get_owner(gUnknown_0202F7C8);
+ }
+ else
+ {
+ TASK.data[7] = !battle_side_get_owner(gUnknown_0202F7C9);
+ }
+ }
+ if (TASK.data[7])
+ {
+ if (!sub_8076BE0())
+ {
+ TASK.data[3] *= -1;
+ TASK.data[4] *= -1;
+ }
+ }
+ TASK.func = sub_80A8FD8;
+}
+
+void sub_80A8EFC(u8 task)
+{
+ u8 spriteId;
+ spriteId = obj_id_for_side_relative_to_move(gBattleAnimArgs[2]);
+ sub_8078E70(spriteId, 0);
+ TASK.data[1] = 0;
+ TASK.data[2] = gBattleAnimArgs[0];
+ if (gBattleAnimArgs[2] == 0)
+ {
+ if (battle_side_get_owner(gUnknown_0202F7C8))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ }
+ else
+ {
+ if (battle_side_get_owner(gUnknown_0202F7C9))
+ {
+ gBattleAnimArgs[1] = -gBattleAnimArgs[1];
+ }
+ }
+ if (gBattleAnimArgs[3] != 1)
+ {
+ TASK.data[3] = 0;
+ }
+ else
+ {
+ TASK.data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
+ }
+ TASK.data[4] = gBattleAnimArgs[1];
+ TASK.data[5] = spriteId;
+ TASK.data[6] = gBattleAnimArgs[3];
+ TASK.data[7] = 1;
+ TASK.data[3] *= -1;
+ TASK.data[4] *= -1;
+ TASK.func = sub_80A8FD8;
+}
+
+void sub_80A8FD8(u8 task)
+{
+ TASK.data[3] += TASK.data[4];
+ obj_id_set_rotscale(TASK.data[5], 0x100, 0x100, TASK.data[3]);
+ if (TASK.data[7])
+ {
+ sub_8078F9C(TASK.data[5]);
+ }
+ if (++TASK.data[1] >= TASK.data[2])
+ {
+ switch (TASK.data[6])
+ {
+ case 1:
+ sub_8078F40(TASK.data[5]);
+ case 0:
+ default:
+ move_anim_task_del(task);
+ return;
+ case 2:
+ TASK.data[1] = 0;
+ TASK.data[4] *= -1;
+ TASK.data[6] = 1;
+ break;
+ }
+ }
+}
+
+void sub_80A9058(u8 task)
+{
+ if (!gBattleAnimArgs[0])
+ {
+ TASK.data[15] = gUnknown_0202F7BC / 12;
+ if (TASK.data[15] < 1)
+ {
+ TASK.data[15] = 1;
+ }
+ if (TASK.data[15] > 16)
+ {
+ TASK.data[15] = 16;
+ }
+ }
+ else
+ {
+ TASK.data[15] = gUnknown_0202F7B8 / 12;
+ if (TASK.data[15] < 1)
+ {
+ TASK.data[15] = 1;
+ }
+ if (TASK.data[15] > 16)
+ {
+ TASK.data[15] = 16;
+ }
+ }
+ TASK.data[14] = TASK.data[15] / 2;
+ TASK.data[13] = TASK.data[14] + (TASK.data[15] & 1);
+ TASK.data[12] = 0;
+ TASK.data[10] = gBattleAnimArgs[3];
+ TASK.data[11] = gBattleAnimArgs[4];
+ TASK.data[7] = obj_id_for_side_relative_to_move(1);
+ TASK.data[8] = gSprites[TASK.data[7]].pos2.x;
+ TASK.data[9] = gSprites[TASK.data[7]].pos2.y;
+ TASK.data[0] = 0;
+ TASK.data[1] = gBattleAnimArgs[1];
+ TASK.data[2] = gBattleAnimArgs[2];
+ TASK.func = sub_80A913C;
+}
+
+static void sub_80A913C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ if (++task->data[0] > task->data[1])
+ {
+ task->data[0] = 0;
+ task->data[12] = (task->data[12] + 1) & 1;
+ if (task->data[10])
+ {
+ if (task->data[12])
+ {
+ gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13];
+ }
+ else
+ {
+ gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14];
+ }
+ }
+ if (task->data[11])
+ {
+ if (task->data[12])
+ {
+ gSprites[task->data[7]].pos2.y = task->data[15];
+ }
+ else
+ {
+ gSprites[task->data[7]].pos2.y = 0;
+ }
+ }
+ if (!--task->data[2])
+ {
+ gSprites[task->data[7]].pos2.x = 0;
+ gSprites[task->data[7]].pos2.y = 0;
+ move_anim_task_del(taskId);
+ return;
+ }
+ }
}
diff --git a/src/battle_party_menu.c b/src/battle_party_menu.c
new file mode 100644
index 000000000..2d47f4e7d
--- /dev/null
+++ b/src/battle_party_menu.c
@@ -0,0 +1,483 @@
+#include "global.h"
+#include "asm.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "songs.h"
+#include "sound.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "battle_party_menu.h"
+
+extern u8 IsLinkDoubleBattle(void);
+extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *);
+extern void LoadHeldItemIconGraphics(void);
+extern void CreateHeldItemIcons_806DC34();
+extern u8 sub_806BD58(u8, u8);
+extern void PartyMenuPrintMonsLevelOrStatus(void);
+extern void PrintPartyMenuMonNicknames(void);
+extern void PartyMenuTryPrintMonsHP(void);
+extern void nullsub_13(void);
+extern void PartyMenuDrawHPBars(void);
+extern u8 sub_806B58C(u8);
+extern u8 GetItemEffectType();
+extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int);
+extern u16 sub_806BD80();
+extern u8 sub_806CA38();
+extern void sub_806D5A4(void);
+extern void sub_802E414(void);
+extern void sub_8094D60(void);
+extern void sub_80A6DCC(void);
+extern void sub_806AF4C();
+extern u8 sub_80F9344(void);
+extern u8 sub_806B124(void);
+extern void sub_806C994();
+extern void sub_806BF74();
+extern void sub_806AEDC(void);
+extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8);
+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);
+extern void sub_8094C98(u8, u8);
+extern void sub_806E6F0();
+extern void sub_806D538();
+
+extern u16 gScriptItemId;
+extern u8 gPlayerPartyCount;
+extern u8 gUnknown_02024A68;
+extern u16 gUnknown_02024A6A[];
+extern u8 gUnknown_02024E6C;
+extern u8 gUnknown_0202E8F4;
+extern u8 gUnknown_0202E8F5;
+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);
+static void Task_80952E4(u8);
+static void Task_8095330(u8);
+static void Task_809538C(void);
+static void Task_HandlePopupMenuInput(u8);
+static void Task_BattlePartyMenuSummary(u8 taskId);
+static void Task_BattlePartyMenuShift(u8 taskId);
+static void Task_BattlePartyMenuCancel(u8 taskId);
+
+static const struct PartyMenuItem sBattlePartyMenuActions[] =
+{
+ {OtherText_Summary, Task_BattlePartyMenuSummary},
+ {gOtherText_CancelNoTerminator, Task_BattlePartyMenuCancel},
+ {OtherText_Shift, Task_BattlePartyMenuShift},
+ {OtherText_SendOut, Task_BattlePartyMenuShift},
+};
+static const u8 Unknown_83B5FEC[] = {2, 0, 1}; //SHIFT, SUMMARY, CANCEL
+static const u8 Unknown_83B5FEF[] = {3, 0, 1}; //SEND OUT, SUMMARY, CANCEL
+static const u8 Unknown_83B5FF2[] = {0, 1}; //SUMMARY, CANCEL
+static const struct PartyPopupMenu sBattlePartyPopupMenus[] =
+{
+ {ARRAY_COUNT(Unknown_83B5FEC), 9, Unknown_83B5FEC},
+ {ARRAY_COUNT(Unknown_83B5FEF), 9, Unknown_83B5FEF},
+ {ARRAY_COUNT(Unknown_83B5FF2), 9, Unknown_83B5FF2},
+};
+
+int SetUpBattlePartyMenu(void)
+{
+ switch (EWRAM_1B000.unk264)
+ {
+ case 0:
+ //TODO: try to get rid of this duplicate code
+ if (IsLinkDoubleBattle() == TRUE)
+ {
+ if (EWRAM_1B000.unk266 != 6)
+ {
+ TryCreatePartyMenuMonIcon(EWRAM_1B000.unk260, EWRAM_1B000.unk266, &gPlayerParty[EWRAM_1B000.unk266]);
+ EWRAM_1B000.unk266++;
+ }
+ else
+ {
+ EWRAM_1B000.unk266 = 0;
+ EWRAM_1B000.unk264++;
+ }
+ }
+ else
+ {
+ if (EWRAM_1B000.unk266 < 6)
+ {
+ 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 = 0;
+ EWRAM_1B000.unk264++;
+ }
+ else
+ EWRAM_1B000.unk266++;
+ break;
+ case 4:
+ PartyMenuPrintMonsLevelOrStatus();
+ EWRAM_1B000.unk264++;
+ break;
+ case 5:
+ PrintPartyMenuMonNicknames();
+ EWRAM_1B000.unk264++;
+ break;
+ case 6:
+ PartyMenuTryPrintMonsHP();
+ EWRAM_1B000.unk264++;
+ break;
+ case 7:
+ nullsub_13();
+ EWRAM_1B000.unk264++;
+ break;
+ case 8:
+ PartyMenuDrawHPBars();
+ EWRAM_1B000.unk264++;
+ break;
+ case 9:
+ if (sub_806B58C(EWRAM_1B000.unk266) == 1)
+ {
+ EWRAM_1B000.unk266 = 0;
+ EWRAM_1B000.unk264++;
+ }
+ else
+ EWRAM_1B000.unk266++;
+ break;
+ case 10:
+ if (gUnknown_02038473 == 3)
+ {
+ if (GetItemEffectType(gScriptItemId) == 10)
+ EWRAM_1B000.unk259 = 0xFF;
+ else
+ EWRAM_1B000.unk259 = 3;
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_8095050(u8 a, u8 b)
+{
+ if (!GetMonData(&gPlayerParty[b], MON_DATA_IS_EGG))
+ {
+ if (gUnknown_02038473 == 1)
+ {
+ gTasks[EWRAM_1B000.unk260].data[4] = 1;
+ gTasks[EWRAM_1B000.unk260].data[5] = 1;
+ }
+ else
+ {
+ gTasks[EWRAM_1B000.unk260].data[4] = 0;
+ gTasks[EWRAM_1B000.unk260].data[5] = 0;
+ }
+ }
+ else
+ {
+ gTasks[EWRAM_1B000.unk260].data[4] = 2;
+ gTasks[EWRAM_1B000.unk260].data[5] = 2;
+ }
+ sub_806E750(gTasks[a].data[4], sBattlePartyPopupMenus, sBattlePartyMenuActions, 0);
+}
+
+void SetUpBattlePokemonMenu(u8 a)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gUnknown_02038473 == 3 && GetItemEffectType(gScriptItemId) == 10)
+ {
+ gUnknown_03004AE4(a, gScriptItemId, Task_80952E4);
+ return;
+ }
+
+ switch (sub_806BD80(a))
+ {
+ case 1:
+ if (gUnknown_02038473 == 3)
+ {
+ if (GetMonData(&gPlayerParty[sub_806CA38(a)], MON_DATA_IS_EGG))
+ PlaySE(SE_HAZURE);
+ else
+ {
+ sub_806D5A4();
+ gUnknown_03004AE4(a, gScriptItemId, Task_80952E4);
+ }
+ }
+ else
+ {
+ PlaySE(SE_SELECT);
+ GetMonNickname(&gPlayerParty[sub_806CA38(a)], gStringVar1);
+ sub_8095050(a, sub_806CA38(a));
+ SetTaskFuncWithFollowupFunc(a, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu);
+ }
+ break;
+ case 2:
+ if (gUnknown_02038473 == 1)
+ PlaySE(SE_HAZURE);
+ else
+ {
+ PlaySE(SE_SELECT);
+ if (gUnknown_02038473 == 3)
+ {
+ gUnknown_0202E8F4 = 0;
+ gTasks[a].func = Task_80952E4;
+ }
+ else
+ {
+ gUnknown_0202E8F4 = 0;
+ gTasks[a].func = Task_809527C;
+ }
+ }
+ break;
+ }
+ }
+}
+
+static void Task_809527C(u8 taskId)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = Task_80952B4;
+}
+
+static void Task_80952B4(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_8094D60();
+ DestroyTask(taskId);
+ SetMainCallback2(sub_802E414);
+ }
+}
+
+static void Task_80952E4(u8 taskId)
+{
+ if (gUnknown_0202E8F4 != 0)
+ Task_809527C(taskId);
+ else
+ {
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = Task_8095330;
+ }
+}
+
+static void Task_8095330(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_8094D60();
+ DestroyTask(taskId);
+ sub_80A6DCC();
+ }
+}
+
+static void Task_809535C(u8 taskId)
+{
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ sub_806AF4C(1, 0xFF, SetUpBattlePokemonMenu, 5);
+ SetMainCallback2(Task_809538C);
+}
+
+static void Task_809538C(void)
+{
+ do
+ {
+ if (sub_806B124() == 1)
+ {
+ sub_806C994(EWRAM_1B000.unk260, gUnknown_020384F0);
+ sub_806BF74(EWRAM_1B000.unk260, 0);
+ GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1);
+ sub_8095050(EWRAM_1B000.unk260, gUnknown_020384F0);
+ SetTaskFuncWithFollowupFunc(EWRAM_1B000.unk260, Task_HandlePopupMenuInput, SetUpBattlePokemonMenu);
+ SetMainCallback2(sub_806AEDC);
+ return;
+ }
+ } while (sub_80F9344() != 1);
+}
+
+static void Task_HandlePopupMenuInput(u8 taskId)
+{
+ TaskFunc func;
+
+ if (!gPaletteFade.active)
+ {
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ PlaySE(SE_SELECT);
+ MoveMenuCursor(-1);
+ return;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ PlaySE(SE_SELECT);
+ MoveMenuCursor(1);
+ return;
+ }
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ func = PartyMenuGetPopupMenuFunc(gTasks[taskId].data[4],
+ sBattlePartyPopupMenus,
+ sBattlePartyMenuActions,
+ GetMenuCursorPos());
+ func(taskId);
+ return;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ Task_BattlePartyMenuCancel(taskId);
+ return;
+ }
+ }
+}
+
+static void Task_80954C0(u8 taskId)
+{
+ if (gUnknown_0202E8F6 == 0)
+ Task_BattlePartyMenuCancel(taskId);
+}
+
+static void Task_ShowSummaryScreen(u8 taskId)
+{
+ u8 partySelection = sub_806CA38(taskId);
+
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+ EWRAM_1B000.unk262 = 1;
+ ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, 4);
+ }
+}
+
+static void Task_BattlePartyMenuSummary(u8 taskId)
+{
+ sub_806CA38(taskId); //an unused variable was probably set with this.
+ gTasks[taskId].func = Task_ShowSummaryScreen;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+}
+
+static void Task_BattlePartyMenuShift(u8 taskId)
+{
+ u8 partySelection;
+ u8 i;
+ u8 r4;
+
+ sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus);
+ partySelection = sub_806CA38(taskId);
+ if (IsLinkDoubleBattle() == TRUE && (partySelection == 1 || partySelection == 4 || partySelection == 5))
+ {
+ sub_806D5A4();
+ StringCopy(gStringVar1, sub_8040D08());
+ StringExpandPlaceholders(gStringVar4, gOtherText_CantSwitchPokeWithYours);
+ sub_806E834(gStringVar4, 0);
+ gTasks[taskId].func = Task_80954C0;
+ return;
+ }
+ if (GetMonData(&gPlayerParty[partySelection], MON_DATA_HP) == 0)
+ {
+ sub_806D5A4();
+ GetMonNickname(&gPlayerParty[partySelection], gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gOtherText_NoEnergyLeft);
+ sub_806E834(gStringVar4, 0);
+ gTasks[taskId].func = Task_80954C0;
+ return;
+ }
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ if (battle_side_get_owner(i) == 0
+ && sub_8094C20(partySelection) == gUnknown_02024A6A[i])
+ {
+ sub_806D5A4();
+ GetMonNickname(&gPlayerParty[partySelection], gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gOtherText_AlreadyBattle);
+ sub_806E834(gStringVar4, 0);
+ gTasks[taskId].func = Task_80954C0;
+ return;
+ }
+ }
+ if (GetMonData(&gPlayerParty[partySelection], MON_DATA_IS_EGG))
+ {
+ sub_806D5A4();
+ StringExpandPlaceholders(gStringVar4, gOtherText_EGGCantBattle);
+ sub_806E834(gStringVar4, 0);
+ gTasks[taskId].func = Task_80954C0;
+ return;
+ }
+ if (sub_8094C20(partySelection) == EWRAM_1609D)
+ {
+ sub_806D5A4();
+ GetMonNickname(&gPlayerParty[partySelection], gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gOtherText_AlreadySelected);
+ sub_806E834(gStringVar4, 0);
+ gTasks[taskId].func = Task_80954C0;
+ return;
+ }
+ if (gUnknown_02038473 == 4)
+ {
+ sub_806D5A4();
+ sub_8040B8C();
+ sub_806E834(gStringVar4, 0);
+ gTasks[taskId].func = Task_80954C0;
+ return;
+ }
+ if (gUnknown_02038473 == 2)
+ {
+ u8 r0;
+ u8 r4 = gUnknown_02024E6C;
+
+ sub_806D5A4();
+ r0 = pokemon_order_func(gUnknown_02024A6A[r4]);
+ GetMonNickname(&gPlayerParty[r0], gStringVar1);
+ StringExpandPlaceholders(gStringVar4, gOtherText_CantBeSwitched);
+ sub_806E834(gStringVar4, 0);
+ gTasks[taskId].func = Task_80954C0;
+ return;
+ }
+ gUnknown_0202E8F5 = sub_8094C20(partySelection);
+ gUnknown_0202E8F4 = 1;
+ r4 = pokemon_order_func(gUnknown_02024A6A[gUnknown_02024E6C]);
+ sub_8094C98(r4, partySelection);
+ sub_806E6F0(&gPlayerParty[r4], &gPlayerParty[partySelection]);
+ gTasks[taskId].func = Task_809527C;
+}
+
+static void Task_BattlePartyMenuCancel(u8 taskId)
+{
+ sub_8072DEC();
+ sub_806E7D0(gTasks[taskId].data[4], sBattlePartyPopupMenus);
+ gTasks[taskId].data[4] = gTasks[taskId].data[5];
+ sub_806D538(0, 0);
+ SwitchTaskToFollowupFunc(taskId);
+}
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 1c3e8e836..c9839bb87 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -1,80 +1,34 @@
#include "global.h"
#include "battle_setup.h"
#include "asm.h"
-#include "safari_zone.h"
-#include "weather.h"
-#include "palette.h"
-#include "field_player_avatar.h"
-#include "rom4.h"
#include "battle.h"
+#include "event_data.h"
+#include "field_message_box.h"
+#include "field_player_avatar.h"
#include "main.h"
-#include "species.h"
+#include "metatile_behavior.h"
+#include "palette.h"
+#include "rng.h"
+#include "rom4.h"
+#include "safari_zone.h"
+#include "script.h"
#include "songs.h"
#include "sound.h"
-#include "task.h"
+#include "species.h"
+#include "starter_choose.h"
#include "string_util.h"
-#include "rng.h"
-#include "event_data.h"
-#include "script.h"
-#include "field_message_box.h"
+#include "task.h"
+#include "text.h"
#include "trainer.h"
-#include "starter_choose.h"
-#include "metatile_behavior.h"
-
-#define NUM_TRAINER_EYE_TRAINERS 56
-#define TRAINER_REMATCH_STEPS 255
+#include "weather.h"
+#include "map_constants.h"
+#include "opponent_constants.h"
+#include "script_pokemon_80C4.h"
+#include "field_map_obj_helpers.h"
+#include "field_control_avatar.h"
extern u16 gScriptResult;
-// IV + LEVEL + SPECIES
-struct TrainerPartyMember0
-{
- u16 iv;
- u8 level;
- u16 species;
-};
-
-// IV + LEVEL + SPECIES + MOVES
-struct TrainerPartyMember1
-{
- u16 iv;
- u8 level;
- u16 species;
- u16 moves[4];
-};
-
-// IV + LEVEL + SPECIES + ITEMS
-struct TrainerPartyMember2
-{
- u16 iv;
- u8 level;
- u16 species;
- u16 heldItem;
-};
-
-// IV + LEVEL + SPECIES + ITEMS + MOVES
-struct TrainerPartyMember3
-{
- u16 iv;
- u8 level;
- u16 species;
- u16 heldItem;
- u16 moves[4];
-};
-
-struct TrainerBattleSpec
-{
- void *ptr;
- u8 ptrType;
-};
-
-struct TrainerEyeTrainer
-{
- u16 trainerNums[5];
- u16 mapGroup;
- u16 mapNum;
-};
-
extern void (*gUnknown_0300485C)(void);
extern struct Pokemon gEnemyParty[];
@@ -91,14 +45,11 @@ EWRAM_DATA u8 *gTrainerCannotBattleSpeech = NULL;
EWRAM_DATA u8 *gTrainerBattleScriptReturnAddress = NULL;
EWRAM_DATA u8 *gTrainerBattleEndScript = NULL;
-extern struct TrainerEyeTrainer gTrainerEyeTrainers[];
-
extern u8 gOtherText_CancelWithTerminator[];
extern u16 gBattleTypeFlags;
extern u16 gScriptLastTalked;
extern u8 gUnknown_02024D26;
-extern u16 gBadgeFlags[];
extern struct MapObject gMapObjects[];
@@ -111,16 +62,367 @@ extern u8 gUnknown_0819F8AE[];
extern u8 gUnknown_0819F80B[];
extern u8 gUnknown_081C6C02[];
-extern struct TrainerBattleSpec gTrainerBattleSpecs_0[];
-extern struct TrainerBattleSpec gTrainerBattleSpecs_1[];
-extern struct TrainerBattleSpec gTrainerBattleSpecs_2[];
-extern struct TrainerBattleSpec gTrainerBattleSpecs_3[];
-extern struct TrainerBattleSpec gTrainerBattleSpecs_4[];
-extern u8 gStringVar4[];
+static const u8 gBattleTransitionTable_Wild[][2] =
+{
+ {8, 9},
+ {5, 10},
+ {0, 10},
+ {7, 6},
+};
+static const u8 gBattleTransitionTable_Trainer[][2] =
+{
+ {4, 11},
+ {2, 3},
+ {0, 10},
+ {1, 6},
+};
+static const struct TrainerBattleSpec gTrainerBattleSpecs_0[] =
+{
+ {&gTrainerBattleMode, 0},
+ {&gTrainerBattleOpponent, 1},
+ {&gTrainerMapObjectLocalId, 1},
+ {&gTrainerIntroSpeech, 2},
+ {&gTrainerDefeatSpeech, 2},
+ {&gTrainerVictorySpeech, 5},
+ {&gTrainerCannotBattleSpeech, 5},
+ {&gTrainerBattleEndScript, 5},
+ {&gTrainerBattleScriptReturnAddress, 6},
+};
+static const struct TrainerBattleSpec gTrainerBattleSpecs_1[] =
+{
+ {&gTrainerBattleMode, 0},
+ {&gTrainerBattleOpponent, 1},
+ {&gTrainerMapObjectLocalId, 1},
+ {&gTrainerIntroSpeech, 2},
+ {&gTrainerDefeatSpeech, 2},
+ {&gTrainerVictorySpeech, 5},
+ {&gTrainerCannotBattleSpeech, 5},
+ {&gTrainerBattleEndScript, 2},
+ {&gTrainerBattleScriptReturnAddress, 6},
+};
+static const struct TrainerBattleSpec gTrainerBattleSpecs_2[] =
+{
+ {&gTrainerBattleMode, 0},
+ {&gTrainerBattleOpponent, 1},
+ {&gTrainerMapObjectLocalId, 1},
+ {&gTrainerIntroSpeech, 2},
+ {&gTrainerDefeatSpeech, 2},
+ {&gTrainerVictorySpeech, 5},
+ {&gTrainerCannotBattleSpeech, 2},
+ {&gTrainerBattleEndScript, 5},
+ {&gTrainerBattleScriptReturnAddress, 6},
+};
+static const struct TrainerBattleSpec gTrainerBattleSpecs_3[] =
+{
+ {&gTrainerBattleMode, 0},
+ {&gTrainerBattleOpponent, 1},
+ {&gTrainerMapObjectLocalId, 1},
+ {&gTrainerIntroSpeech, 5},
+ {&gTrainerDefeatSpeech, 2},
+ {&gTrainerVictorySpeech, 5},
+ {&gTrainerCannotBattleSpeech, 5},
+ {&gTrainerBattleEndScript, 5},
+ {&gTrainerBattleScriptReturnAddress, 6},
+};
+static const struct TrainerBattleSpec gTrainerBattleSpecs_4[] =
+{
+ {&gTrainerBattleMode, 0},
+ {&gTrainerBattleOpponent, 1},
+ {&gTrainerMapObjectLocalId, 1},
+ {&gTrainerIntroSpeech, 2},
+ {&gTrainerDefeatSpeech, 2},
+ {&gTrainerVictorySpeech, 5},
+ {&gTrainerCannotBattleSpeech, 2},
+ {&gTrainerBattleEndScript, 2},
+ {&gTrainerBattleScriptReturnAddress, 6},
+};
-extern u8 gBattleTransitionTable_Wild[][2];
-extern u8 gBattleTransitionTable_Trainer[][2];
+const struct TrainerEyeTrainer gTrainerEyeTrainers[] =
+{
+ {
+ {OPPONENT_ROSE_1, OPPONENT_ROSE_2, OPPONENT_ROSE_3, OPPONENT_ROSE_4, OPPONENT_ROSE_5},
+ MAP_GROUP_ROUTE118,
+ MAP_ID_ROUTE118,
+ },
+ {
+ {OPPONENT_DUSTY_1, OPPONENT_DUSTY_2, OPPONENT_DUSTY_3, OPPONENT_DUSTY_4, OPPONENT_DUSTY_5},
+ MAP_GROUP_ROUTE111,
+ MAP_ID_ROUTE111,
+ },
+ {
+ {OPPONENT_LOLA_1, OPPONENT_LOLA_2, OPPONENT_LOLA_3, OPPONENT_LOLA_4, OPPONENT_LOLA_5},
+ MAP_GROUP_ROUTE109,
+ MAP_ID_ROUTE109,
+ },
+ {
+ {OPPONENT_RICKY_1, OPPONENT_RICKY_2, OPPONENT_RICKY_3, OPPONENT_RICKY_4, OPPONENT_RICKY_5},
+ MAP_GROUP_ROUTE109,
+ MAP_ID_ROUTE109,
+ },
+ {
+ {OPPONENT_RITA_AND_SAM_1, OPPONENT_RITA_AND_SAM_2, OPPONENT_RITA_AND_SAM_3, OPPONENT_RITA_AND_SAM_4, OPPONENT_RITA_AND_SAM_5},
+ MAP_GROUP_ROUTE124,
+ MAP_ID_ROUTE124,
+ },
+ {
+ {OPPONENT_BROOKE_1, OPPONENT_BROOKE_2, OPPONENT_BROOKE_3, OPPONENT_BROOKE_4, OPPONENT_BROOKE_5},
+ MAP_GROUP_ROUTE111,
+ MAP_ID_ROUTE111,
+ },
+ {
+ {OPPONENT_WILTON_1, OPPONENT_WILTON_2, OPPONENT_WILTON_3, OPPONENT_WILTON_4, OPPONENT_WILTON_5},
+ MAP_GROUP_ROUTE111,
+ MAP_ID_ROUTE111,
+ },
+ {
+ {OPPONENT_VALERIE_1, OPPONENT_VALERIE_2, OPPONENT_VALERIE_3, OPPONENT_VALERIE_4, OPPONENT_VALERIE_5},
+ MAP_GROUP_MT_PYRE_6F,
+ MAP_ID_MT_PYRE_6F,
+ },
+ {
+ {OPPONENT_CINDY_1, OPPONENT_CINDY_3, OPPONENT_CINDY_4, OPPONENT_CINDY_5, OPPONENT_CINDY_6},
+ MAP_GROUP_ROUTE104,
+ MAP_ID_ROUTE104,
+ },
+ {
+ {OPPONENT_JESSICA_1, OPPONENT_JESSICA_2, OPPONENT_JESSICA_3, OPPONENT_JESSICA_4, OPPONENT_JESSICA_5},
+ MAP_GROUP_ROUTE121,
+ MAP_ID_ROUTE121,
+ },
+ {
+ {OPPONENT_WINSTON_1, OPPONENT_WINSTON_2, OPPONENT_WINSTON_3, OPPONENT_WINSTON_4, OPPONENT_WINSTON_5},
+ MAP_GROUP_ROUTE104,
+ MAP_ID_ROUTE104,
+ },
+ {
+ {OPPONENT_STEVE_1, OPPONENT_STEVE_2, OPPONENT_STEVE_3, OPPONENT_STEVE_4, OPPONENT_STEVE_5},
+ MAP_GROUP_ROUTE114,
+ MAP_ID_ROUTE114,
+ },
+ {
+ {OPPONENT_TONY_1, OPPONENT_TONY_2, OPPONENT_TONY_3, OPPONENT_TONY_4, OPPONENT_TONY_5},
+ MAP_GROUP_ROUTE107,
+ MAP_ID_ROUTE107,
+ },
+ {
+ {OPPONENT_NOB_1, OPPONENT_NOB_2, OPPONENT_NOB_3, OPPONENT_NOB_4, OPPONENT_NOB_5},
+ MAP_GROUP_ROUTE115,
+ MAP_ID_ROUTE115,
+ },
+ {
+ {OPPONENT_DALTON_1, OPPONENT_DALTON_2, OPPONENT_DALTON_3, OPPONENT_DALTON_4, OPPONENT_DALTON_5},
+ MAP_GROUP_ROUTE118,
+ MAP_ID_ROUTE118,
+ },
+ {
+ {OPPONENT_BERNIE_1, OPPONENT_BERNIE_2, OPPONENT_BERNIE_3, OPPONENT_BERNIE_4, OPPONENT_BERNIE_5},
+ MAP_GROUP_ROUTE114,
+ MAP_ID_ROUTE114,
+ },
+ {
+ {OPPONENT_ETHAN_1, OPPONENT_ETHAN_2, OPPONENT_ETHAN_3, OPPONENT_ETHAN_4, OPPONENT_ETHAN_5},
+ MAP_GROUP_JAGGED_PASS,
+ MAP_ID_JAGGED_PASS,
+ },
+ {
+ {OPPONENT_JOHN_AND_JAY_1, OPPONENT_JOHN_AND_JAY_2, OPPONENT_JOHN_AND_JAY_3, OPPONENT_JOHN_AND_JAY_4, OPPONENT_JOHN_AND_JAY_5},
+ MAP_GROUP_METEOR_FALLS_1F_2R,
+ MAP_ID_METEOR_FALLS_1F_2R,
+ },
+ {
+ {OPPONENT_BRANDON_1, OPPONENT_BRANDON_2, OPPONENT_BRANDON_3, OPPONENT_BRANDON_4, OPPONENT_BRANDON_5},
+ MAP_GROUP_ROUTE120,
+ MAP_ID_ROUTE120,
+ },
+ {
+ {OPPONENT_CAMERON_1, OPPONENT_CAMERON_2, OPPONENT_CAMERON_3, OPPONENT_CAMERON_4, OPPONENT_CAMERON_5},
+ MAP_GROUP_ROUTE123,
+ MAP_ID_ROUTE123,
+ },
+ {
+ {OPPONENT_JACKI_1, OPPONENT_JACKI_2, OPPONENT_JACKI_3, OPPONENT_JACKI_4, OPPONENT_JACKI_5},
+ MAP_GROUP_ROUTE123,
+ MAP_ID_ROUTE123,
+ },
+ {
+ {OPPONENT_WALTER_1, OPPONENT_WALTER_2, OPPONENT_WALTER_3, OPPONENT_WALTER_4, OPPONENT_WALTER_5},
+ MAP_GROUP_ROUTE121,
+ MAP_ID_ROUTE121,
+ },
+ {
+ {OPPONENT_KAREN_1, OPPONENT_KAREN_2, OPPONENT_KAREN_3, OPPONENT_KAREN_4, OPPONENT_KAREN_5},
+ MAP_GROUP_ROUTE116,
+ MAP_ID_ROUTE116,
+ },
+ {
+ {OPPONENT_JERRY_1, OPPONENT_JERRY_2, OPPONENT_JERRY_3, OPPONENT_JERRY_4, OPPONENT_JERRY_5},
+ MAP_GROUP_ROUTE116,
+ MAP_ID_ROUTE116,
+ },
+ {
+ {OPPONENT_ANNA_AND_MEG_1, OPPONENT_ANNA_AND_MEG_2, OPPONENT_ANNA_AND_MEG_3, OPPONENT_ANNA_AND_MEG_4, OPPONENT_ANNA_AND_MEG_5},
+ MAP_GROUP_ROUTE117,
+ MAP_ID_ROUTE117,
+ },
+ {
+ {OPPONENT_ISABEL_1, OPPONENT_ISABEL_2, OPPONENT_ISABEL_3, OPPONENT_ISABEL_4, OPPONENT_ISABEL_5},
+ MAP_GROUP_ROUTE110,
+ MAP_ID_ROUTE110,
+ },
+ {
+ {OPPONENT_MIGUEL_1, OPPONENT_MIGUEL_2, OPPONENT_MIGUEL_3, OPPONENT_MIGUEL_4, OPPONENT_MIGUEL_5},
+ MAP_GROUP_ROUTE103,
+ MAP_ID_ROUTE103,
+ },
+ {
+ {OPPONENT_TIMOTHY_1, OPPONENT_TIMOTHY_2, OPPONENT_TIMOTHY_3, OPPONENT_TIMOTHY_4, OPPONENT_TIMOTHY_5},
+ MAP_GROUP_ROUTE115,
+ MAP_ID_ROUTE115,
+ },
+ {
+ {OPPONENT_SHELBY_1, OPPONENT_SHELBY_2, OPPONENT_SHELBY_3, OPPONENT_SHELBY_4, OPPONENT_SHELBY_5},
+ MAP_GROUP_MT_CHIMNEY,
+ MAP_ID_MT_CHIMNEY,
+ },
+ {
+ {OPPONENT_CALVIN_1, OPPONENT_CALVIN_2, OPPONENT_CALVIN_3, OPPONENT_CALVIN_4, OPPONENT_CALVIN_5},
+ MAP_GROUP_ROUTE102,
+ MAP_ID_ROUTE102,
+ },
+ {
+ {OPPONENT_ELLIOT_1, OPPONENT_ELLIOT_2, OPPONENT_ELLIOT_3, OPPONENT_ELLIOT_4, OPPONENT_ELLIOT_5},
+ MAP_GROUP_ROUTE106,
+ MAP_ID_ROUTE106,
+ },
+ {
+ {OPPONENT_ABIGAIL_1, OPPONENT_ABIGAIL_2, OPPONENT_ABIGAIL_3, OPPONENT_ABIGAIL_4, OPPONENT_ABIGAIL_5},
+ MAP_GROUP_ROUTE110,
+ MAP_ID_ROUTE110,
+ },
+ {
+ {OPPONENT_BENJAMIN_1, OPPONENT_BENJAMIN_2, OPPONENT_BENJAMIN_3, OPPONENT_BENJAMIN_4, OPPONENT_BENJAMIN_5},
+ MAP_GROUP_ROUTE110,
+ MAP_ID_ROUTE110,
+ },
+ {
+ {OPPONENT_ISAIAH_1, OPPONENT_ISAIAH_2, OPPONENT_ISAIAH_3, OPPONENT_ISAIAH_4, OPPONENT_ISAIAH_5},
+ MAP_GROUP_ROUTE128,
+ MAP_ID_ROUTE128,
+ },
+ {
+ {OPPONENT_KATELYN_1, OPPONENT_KATELYN_2, OPPONENT_KATELYN_3, OPPONENT_KATELYN_4, OPPONENT_KATELYN_5},
+ MAP_GROUP_ROUTE128,
+ MAP_ID_ROUTE128,
+ },
+ {
+ {OPPONENT_MARIA_1, OPPONENT_MARIA_2, OPPONENT_MARIA_3, OPPONENT_MARIA_4, OPPONENT_MARIA_5},
+ MAP_GROUP_ROUTE117,
+ MAP_ID_ROUTE117,
+ },
+ {
+ {OPPONENT_DYLAN_1, OPPONENT_DYLAN_2, OPPONENT_DYLAN_3, OPPONENT_DYLAN_4, OPPONENT_DYLAN_5},
+ MAP_GROUP_ROUTE117,
+ MAP_ID_ROUTE117,
+ },
+ {
+ {OPPONENT_NICOLAS_1, OPPONENT_NICOLAS_2, OPPONENT_NICOLAS_3, OPPONENT_NICOLAS_4, OPPONENT_NICOLAS_5},
+ MAP_GROUP_METEOR_FALLS_1F_2R,
+ MAP_ID_METEOR_FALLS_1F_2R,
+ },
+ {
+ {OPPONENT_ROBERT_1, OPPONENT_ROBERT_2, OPPONENT_ROBERT_3, OPPONENT_ROBERT_4, OPPONENT_ROBERT_5},
+ MAP_GROUP_ROUTE120,
+ MAP_ID_ROUTE120,
+ },
+ {
+ {OPPONENT_LAO_1, OPPONENT_LAO_2, OPPONENT_LAO_3, OPPONENT_LAO_4, OPPONENT_LAO_5},
+ MAP_GROUP_ROUTE113,
+ MAP_ID_ROUTE113,
+ },
+ {
+ {OPPONENT_CYNDY_1, OPPONENT_CYNDY_2, OPPONENT_CYNDY_3, OPPONENT_CYNDY_4, OPPONENT_CYNDY_5},
+ MAP_GROUP_ROUTE115,
+ MAP_ID_ROUTE115,
+ },
+ {
+ {OPPONENT_MADELINE_1, OPPONENT_MADELINE_2, OPPONENT_MADELINE_3, OPPONENT_MADELINE_4, OPPONENT_MADELINE_5},
+ MAP_GROUP_ROUTE113,
+ MAP_ID_ROUTE113,
+ },
+ {
+ {OPPONENT_JENNY_1, OPPONENT_JENNY_2, OPPONENT_JENNY_3, OPPONENT_JENNY_4, OPPONENT_JENNY_5},
+ MAP_GROUP_ROUTE124,
+ MAP_ID_ROUTE124,
+ },
+ {
+ {OPPONENT_DIANA_1, OPPONENT_DIANA_2, OPPONENT_DIANA_3, OPPONENT_DIANA_4, OPPONENT_DIANA_5},
+ MAP_GROUP_JAGGED_PASS,
+ MAP_ID_JAGGED_PASS,
+ },
+ {
+ {OPPONENT_AMY_AND_LIV_1, OPPONENT_AMY_AND_LIV_2, OPPONENT_AMY_AND_LIV_4, OPPONENT_AMY_AND_LIV_5, OPPONENT_AMY_AND_LIV_6},
+ MAP_GROUP_ROUTE103,
+ MAP_ID_ROUTE103,
+ },
+ {
+ {OPPONENT_ERNEST_1, OPPONENT_ERNEST_2, OPPONENT_ERNEST_3, OPPONENT_ERNEST_4, OPPONENT_ERNEST_5},
+ MAP_GROUP_ROUTE125,
+ MAP_ID_ROUTE125,
+ },
+ {
+ {OPPONENT_EDWIN_1, OPPONENT_EDWIN_2, OPPONENT_EDWIN_3, OPPONENT_EDWIN_4, OPPONENT_EDWIN_5},
+ MAP_GROUP_ROUTE110,
+ MAP_ID_ROUTE110,
+ },
+ {
+ {OPPONENT_LYDIA_1, OPPONENT_LYDIA_2, OPPONENT_LYDIA_3, OPPONENT_LYDIA_4, OPPONENT_LYDIA_5},
+ MAP_GROUP_ROUTE117,
+ MAP_ID_ROUTE117,
+ },
+ {
+ {OPPONENT_ISAAC_1, OPPONENT_ISAAC_2, OPPONENT_ISAAC_3, OPPONENT_ISAAC_4, OPPONENT_ISAAC_5},
+ MAP_GROUP_ROUTE117,
+ MAP_ID_ROUTE117,
+ },
+ {
+ {OPPONENT_CATHERINE_1, OPPONENT_CATHERINE_2, OPPONENT_CATHERINE_3, OPPONENT_CATHERINE_4, OPPONENT_CATHERINE_5},
+ MAP_GROUP_ROUTE119,
+ MAP_ID_ROUTE119,
+ },
+ {
+ {OPPONENT_JACKSON_1, OPPONENT_JACKSON_2, OPPONENT_JACKSON_3, OPPONENT_JACKSON_4, OPPONENT_JACKSON_5},
+ MAP_GROUP_ROUTE119,
+ MAP_ID_ROUTE119,
+ },
+ {
+ {OPPONENT_HALEY_1, OPPONENT_HALEY_2, OPPONENT_HALEY_3, OPPONENT_HALEY_4, OPPONENT_HALEY_5},
+ MAP_GROUP_ROUTE104,
+ MAP_ID_ROUTE104,
+ },
+ {
+ {OPPONENT_JAMES_1, OPPONENT_JAMES_2, OPPONENT_JAMES_3, OPPONENT_JAMES_4, OPPONENT_JAMES_5},
+ MAP_GROUP_PETALBURG_WOODS,
+ MAP_ID_PETALBURG_WOODS,
+ },
+ {
+ {OPPONENT_TRENT_1, OPPONENT_TRENT_2, OPPONENT_TRENT_3, OPPONENT_TRENT_4, OPPONENT_TRENT_5},
+ MAP_GROUP_ROUTE112,
+ MAP_ID_ROUTE112,
+ },
+ {
+ {OPPONENT_LOIS_AND_HAL_1, OPPONENT_LOIS_AND_HAL_2, OPPONENT_LOIS_AND_HAL_3, OPPONENT_LOIS_AND_HAL_4, OPPONENT_LOIS_AND_HAL_5},
+ MAP_GROUP_ABANDONED_SHIP_ROOMS2_1F,
+ MAP_ID_ABANDONED_SHIP_ROOMS2_1F,
+ },
+ {
+ {OPPONENT_WALLY_3, OPPONENT_WALLY_4, OPPONENT_WALLY_5, OPPONENT_WALLY_6, OPPONENT_NONE},
+ MAP_GROUP_VICTORY_ROAD_1F,
+ MAP_ID_VICTORY_ROAD_1F,
+ },
+};
+
+static const u16 sBadgeFlags[] = {BADGE01_GET, BADGE02_GET, BADGE03_GET, BADGE04_GET, BADGE05_GET, BADGE06_GET, BADGE07_GET, BADGE08_GET};
void task01_battle_start(u8 taskId)
{
@@ -387,7 +689,7 @@ u16 GetSumOfPartyMonLevel(u8 numMons)
for (i = 0; i < 6; i++)
{
u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
-
+
if (species != SPECIES_EGG && species != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0)
{
sum += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
@@ -593,7 +895,7 @@ void sub_80822BC(void)
gTrainerBattleEndScript = 0;
}
-void TrainerBattleLoadArgs(struct TrainerBattleSpec *specs, u8 *data)
+void TrainerBattleLoadArgs(const struct TrainerBattleSpec *specs, u8 *data)
{
while (1)
{
@@ -807,7 +1109,7 @@ u8 *sub_8082700(void)
return gUnknown_081C6C02;
}
-void sub_8082718()
+void sub_8082718(void)
{
ShowFieldMessage(sub_8082880());
}
@@ -903,7 +1205,7 @@ u8 *sub_8082880(void)
return SanitizeString(gTrainerCannotBattleSpeech);
}
-s32 sub_8082894(struct TrainerEyeTrainer *trainers, u16 trainerNum)
+s32 sub_8082894(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
{
s32 i;
@@ -915,7 +1217,7 @@ s32 sub_8082894(struct TrainerEyeTrainer *trainers, u16 trainerNum)
return -1;
}
-s32 sub_80828B8(struct TrainerEyeTrainer *trainers, u16 trainerNum)
+s32 sub_80828B8(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
{
s32 i;
s32 j;
@@ -931,7 +1233,7 @@ s32 sub_80828B8(struct TrainerEyeTrainer *trainers, u16 trainerNum)
return -1;
}
-bool32 sub_80828FC(struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
+bool32 sub_80828FC(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
{
int i;
bool32 ret = FALSE;
@@ -956,7 +1258,7 @@ bool32 sub_80828FC(struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
return ret;
}
-s32 sub_80829A8(struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
+s32 sub_80829A8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
{
s32 i;
@@ -968,7 +1270,7 @@ s32 sub_80829A8(struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
return 0;
}
-s32 sub_80829E8(struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
+s32 sub_80829E8(const struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
{
s32 i;
@@ -980,7 +1282,7 @@ s32 sub_80829E8(struct TrainerEyeTrainer *trainers, u16 mapGroup, u16 mapNum)
return 0;
}
-bool8 sub_8082A18(struct TrainerEyeTrainer *trainers, u16 trainerNum)
+bool8 sub_8082A18(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
{
s32 trainerEyeIndex = sub_8082894(trainers, trainerNum);
@@ -990,7 +1292,7 @@ bool8 sub_8082A18(struct TrainerEyeTrainer *trainers, u16 trainerNum)
return FALSE;
}
-bool8 sub_8082A54(struct TrainerEyeTrainer *trainers, u16 trainerNum)
+bool8 sub_8082A54(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
{
s32 trainerEyeIndex = sub_80828B8(trainers, trainerNum);
@@ -1000,10 +1302,10 @@ bool8 sub_8082A54(struct TrainerEyeTrainer *trainers, u16 trainerNum)
return FALSE;
}
-u16 sub_8082A90(struct TrainerEyeTrainer *trainers, u16 trainerNum)
+u16 sub_8082A90(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
{
int i;
- struct TrainerEyeTrainer *trainer;
+ const struct TrainerEyeTrainer *trainer;
s32 trainerEyeIndex = sub_8082894(trainers, trainerNum);
if (trainerEyeIndex == -1)
@@ -1019,7 +1321,7 @@ u16 sub_8082A90(struct TrainerEyeTrainer *trainers, u16 trainerNum)
return trainer->trainerNums[4];
}
-void sub_8082AE4(struct TrainerEyeTrainer *trainers, u16 trainerNum)
+void sub_8082AE4(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
{
s32 trainerEyeIndex = sub_80828B8(trainers, trainerNum);
@@ -1027,7 +1329,7 @@ void sub_8082AE4(struct TrainerEyeTrainer *trainers, u16 trainerNum)
gSaveBlock1.trainerRematches[trainerEyeIndex] = 0;
}
-bool8 sub_8082B10(struct TrainerEyeTrainer *trainers, u16 trainerNum)
+bool8 sub_8082B10(const struct TrainerEyeTrainer *trainers, u16 trainerNum)
{
s32 trainerEyeIndex = sub_8082894(trainers, trainerNum);
@@ -1044,7 +1346,7 @@ bool32 sub_8082B44(void)
for (i = 0; i < 8; i++)
{
- if (FlagGet(gBadgeFlags[i]) == TRUE)
+ if (FlagGet(sBadgeFlags[i]) == TRUE)
{
badgeCount++;
if (badgeCount >= 5)
diff --git a/src/berry.c b/src/berry.c
index 84db22a27..e81c7a5ff 100644
--- a/src/berry.c
+++ b/src/berry.c
@@ -2,17 +2,799 @@
#include "berry.h"
#include "asm.h"
#include "item.h"
+#include "items.h"
#include "main.h"
-#include "text.h"
#include "rng.h"
-#include "items.h"
+#include "text.h"
+#include "field_control_avatar.h"
+
+#define BERRY_NAME_LENGTH 6
#define FIRST_BERRY ITEM_CHERI_BERRY
#define LAST_BERRY ITEM_ENIGMA_BERRY
-extern struct Berry gBerries[];
+const u8 gBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers.");
+const u8 gBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy.");
+const u8 gBerryDescriptionPart1_Chesto[] = _("The BERRY’s thick skin and fruit are");
+const u8 gBerryDescriptionPart2_Chesto[] = _("very tough. It is dry-tasting all over.");
+const u8 gBerryDescriptionPart1_Pecha[] = _("Very sweet and delicious.");
+const u8 gBerryDescriptionPart2_Pecha[] = _("Also very tender - handle with care.");
+const u8 gBerryDescriptionPart1_Rawst[] = _("If the leaves grow long and curly,");
+const u8 gBerryDescriptionPart2_Rawst[] = _("the BERRY seems to grow very bitter.");
+const u8 gBerryDescriptionPart1_Aspear[] = _("The hard BERRY is dense with a rich");
+const u8 gBerryDescriptionPart2_Aspear[] = _("juice. It is quite sour.");
+const u8 gBerryDescriptionPart1_Leppa[] = _("Grows slower than CHERI and others.");
+const u8 gBerryDescriptionPart2_Leppa[] = _("The smaller the BERRY, the tastier.");
+const u8 gBerryDescriptionPart1_Oran[] = _("A peculiar BERRY with a mix of flavors.");
+const u8 gBerryDescriptionPart2_Oran[] = _("BERRIES grow in half a day.");
+const u8 gBerryDescriptionPart1_Persim[] = _("Loves sunlight. The BERRY’s color");
+const u8 gBerryDescriptionPart2_Persim[] = _("grows vivid when exposed to the sun.");
+const u8 gBerryDescriptionPart1_Lum[] = _("Slow to grow. If raised with loving");
+const u8 gBerryDescriptionPart2_Lum[] = _("care, it may grow two BERRIES.");
+const u8 gBerryDescriptionPart1_Sitrus[] = _("Closely related to ORAN. The large");
+const u8 gBerryDescriptionPart2_Sitrus[] = _("BERRY has a well-rounded flavor.");
+const u8 gBerryDescriptionPart1_Figy[] = _("The BERRY, which looks chewed up,");
+const u8 gBerryDescriptionPart2_Figy[] = _("brims with spicy substances.");
+const u8 gBerryDescriptionPart1_Wiki[] = _("The BERRY is said to have grown lumpy");
+const u8 gBerryDescriptionPart2_Wiki[] = _("to help POKéMON grip it.");
+const u8 gBerryDescriptionPart1_Mago[] = _("The BERRY turns curvy as it grows.");
+const u8 gBerryDescriptionPart2_Mago[] = _("The curvier, the sweeter and tastier.");
+const u8 gBerryDescriptionPart1_Aguav[] = _("The flower is dainty. It is rare in its");
+const u8 gBerryDescriptionPart2_Aguav[] = _("ability to grow without light.");
+const u8 gBerryDescriptionPart1_Iapapa[] = _("The BERRY is very big and sour.");
+const u8 gBerryDescriptionPart2_Iapapa[] = _("It takes at least a day to grow.");
+const u8 gBerryDescriptionPart1_Razz[] = _("The red BERRY tastes slightly spicy.");
+const u8 gBerryDescriptionPart2_Razz[] = _("It grows quickly in just four hours.");
+const u8 gBerryDescriptionPart1_Bluk[] = _("The BERRY is blue on the outside, but");
+const u8 gBerryDescriptionPart2_Bluk[] = _("it blackens the mouth when eaten.");
+const u8 gBerryDescriptionPart1_Nanab[] = _("This BERRY was the seventh");
+const u8 gBerryDescriptionPart2_Nanab[] = _("discovered in the world. It is sweet.");
+const u8 gBerryDescriptionPart1_Wepear[] = _("The flower is small and white. It has a");
+const u8 gBerryDescriptionPart2_Wepear[] = _("delicate balance of bitter and sour.");
+const u8 gBerryDescriptionPart1_Pinap[] = _("Weak against wind and cold.");
+const u8 gBerryDescriptionPart2_Pinap[] = _("The fruit is spicy and the skin, sour.");
+const u8 gBerryDescriptionPart1_Pomeg[] = _("However much it is watered,");
+const u8 gBerryDescriptionPart2_Pomeg[] = _("it only grows up to six BERRIES.");
+const u8 gBerryDescriptionPart1_Kelpsy[] = _("A rare variety shaped like a root.");
+const u8 gBerryDescriptionPart2_Kelpsy[] = _("Grows a very large flower.");
+const u8 gBerryDescriptionPart1_Qualot[] = _("Loves water. Grows strong even in");
+const u8 gBerryDescriptionPart2_Qualot[] = _("locations with constant rainfall.");
+const u8 gBerryDescriptionPart1_Hondew[] = _("A BERRY that is very valuable and");
+const u8 gBerryDescriptionPart2_Hondew[] = _("rarely seen. It is very delicious.");
+const u8 gBerryDescriptionPart1_Grepa[] = _("Despite its tenderness and round");
+const u8 gBerryDescriptionPart2_Grepa[] = _("shape, the BERRY is unimaginably sour.");
+const u8 gBerryDescriptionPart1_Tamato[] = _("The BERRY is lip-bendingly spicy.");
+const u8 gBerryDescriptionPart2_Tamato[] = _("It takes time to grow.");
+const u8 gBerryDescriptionPart1_Cornn[] = _("A BERRY from an ancient era. May not");
+const u8 gBerryDescriptionPart2_Cornn[] = _("grow unless planted in quantity.");
+const u8 gBerryDescriptionPart1_Magost[] = _("A BERRY that is widely said to have");
+const u8 gBerryDescriptionPart2_Magost[] = _("a finely balanced flavor.");
+const u8 gBerryDescriptionPart1_Rabuta[] = _("A rare variety that is overgrown with");
+const u8 gBerryDescriptionPart2_Rabuta[] = _("hair. It is quite bitter.");
+const u8 gBerryDescriptionPart1_Nomel[] = _("Quite sour. Just one bite makes it");
+const u8 gBerryDescriptionPart2_Nomel[] = _("impossible to taste for three days.");
+const u8 gBerryDescriptionPart1_Spelon[] = _("The vividly red BERRY is very spicy.");
+const u8 gBerryDescriptionPart2_Spelon[] = _("Its warts secrete a spicy substance.");
+const u8 gBerryDescriptionPart1_Pamtre[] = _("Drifts on the sea from somewhere.");
+const u8 gBerryDescriptionPart2_Pamtre[] = _("It is thought to grow elsewhere.");
+const u8 gBerryDescriptionPart1_Watmel[] = _("A huge BERRY, with some over 20");
+const u8 gBerryDescriptionPart2_Watmel[] = _("inches discovered. Exceedingly sweet.");
+const u8 gBerryDescriptionPart1_Durin[] = _("Bitter to even look at. It is so");
+const u8 gBerryDescriptionPart2_Durin[] = _("bitter, no one has ever eaten it as is.");
+const u8 gBerryDescriptionPart1_Belue[] = _("It is glossy and looks delicious, but");
+const u8 gBerryDescriptionPart2_Belue[] = _("it is awfully sour. Takes time to grow.");
+const u8 gBerryDescriptionPart1_Liechi[] = _("A mysterious BERRY. It is rumored to");
+const u8 gBerryDescriptionPart2_Liechi[] = _("contain the power of the sea.");
+const u8 gBerryDescriptionPart1_Ganlon[] = _("A mysterious BERRY. It is rumored to");
+const u8 gBerryDescriptionPart2_Ganlon[] = _("contain the power of the land.");
+const u8 gBerryDescriptionPart1_Salac[] = _("A mysterious BERRY. It is rumored to");
+const u8 gBerryDescriptionPart2_Salac[] = _("contain the power of the sky.");
+const u8 gBerryDescriptionPart1_Petaya[] = _("A mysterious BERRY. It is rumored to");
+const u8 gBerryDescriptionPart2_Petaya[] = _("contain the power of all living things.");
+const u8 gBerryDescriptionPart1_Apicot[] = _("A very mystifying BERRY. No telling");
+const u8 gBerryDescriptionPart2_Apicot[] = _("what may happen or how it can be used.");
+const u8 gBerryDescriptionPart1_Lansat[] = _("Said to be a legendary BERRY.");
+const u8 gBerryDescriptionPart2_Lansat[] = _("Holding it supposedly brings joy.");
+const u8 gBerryDescriptionPart1_Starf[] = _("So strong, it was abandoned at the");
+const u8 gBerryDescriptionPart2_Starf[] = _("world’s edge. Considered a mirage.");
+const u8 gBerryDescriptionPart1_Enigma[] = _("A completely enigmatic BERRY.");
+const u8 gBerryDescriptionPart2_Enigma[] = _("Appears to have the power of stars.");
+
+const struct Berry gBerries[] =
+{
+ {
+ .name = _("CHERI"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 20,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Cheri,
+ .description2 = gBerryDescriptionPart2_Cheri,
+ .stageDuration = 3,
+ .spicy = 10,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 25,
+ },
+ {
+ .name = _("CHESTO"),
+ .firmness = BERRY_FIRMNESS_SUPER_HARD,
+ .size = 80,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Chesto,
+ .description2 = gBerryDescriptionPart2_Chesto,
+ .stageDuration = 3,
+ .spicy = 0,
+ .dry = 10,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 25,
+ },
+ {
+ .name = _("PECHA"),
+ .firmness = BERRY_FIRMNESS_VERY_SOFT,
+ .size = 40,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Pecha,
+ .description2 = gBerryDescriptionPart2_Pecha,
+ .stageDuration = 3,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 10,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 25,
+ },
+ {
+ .name = _("RAWST"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 32,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Rawst,
+ .description2 = gBerryDescriptionPart2_Rawst,
+ .stageDuration = 3,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 10,
+ .sour = 0,
+ .smoothness = 25,
+ },
+ {
+ .name = _("ASPEAR"),
+ .firmness = BERRY_FIRMNESS_SUPER_HARD,
+ .size = 50,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Aspear,
+ .description2 = gBerryDescriptionPart2_Aspear,
+ .stageDuration = 3,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 10,
+ .smoothness = 25,
+ },
+ {
+ .name = _("LEPPA"),
+ .firmness = BERRY_FIRMNESS_VERY_HARD,
+ .size = 28,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Leppa,
+ .description2 = gBerryDescriptionPart2_Leppa,
+ .stageDuration = 4,
+ .spicy = 10,
+ .dry = 0,
+ .sweet = 10,
+ .bitter = 10,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("ORAN"),
+ .firmness = BERRY_FIRMNESS_SUPER_HARD,
+ .size = 35,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Oran,
+ .description2 = gBerryDescriptionPart2_Oran,
+ .stageDuration = 3,
+ .spicy = 10,
+ .dry = 10,
+ .sweet = 10,
+ .bitter = 10,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("PERSIM"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 47,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Persim,
+ .description2 = gBerryDescriptionPart2_Persim,
+ .stageDuration = 3,
+ .spicy = 10,
+ .dry = 10,
+ .sweet = 10,
+ .bitter = 10,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("LUM"),
+ .firmness = BERRY_FIRMNESS_SUPER_HARD,
+ .size = 34,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Lum,
+ .description2 = gBerryDescriptionPart2_Lum,
+ .stageDuration = 12,
+ .spicy = 10,
+ .dry = 10,
+ .sweet = 10,
+ .bitter = 10,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("SITRUS"),
+ .firmness = BERRY_FIRMNESS_VERY_HARD,
+ .size = 95,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Sitrus,
+ .description2 = gBerryDescriptionPart2_Sitrus,
+ .stageDuration = 6,
+ .spicy = 10,
+ .dry = 10,
+ .sweet = 10,
+ .bitter = 10,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("FIGY"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 100,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Figy,
+ .description2 = gBerryDescriptionPart2_Figy,
+ .stageDuration = 6,
+ .spicy = 10,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 25,
+ },
+ {
+ .name = _("WIKI"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 115,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Wiki,
+ .description2 = gBerryDescriptionPart2_Wiki,
+ .stageDuration = 6,
+ .spicy = 0,
+ .dry = 10,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 25,
+ },
+ {
+ .name = _("MAGO"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 126,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Mago,
+ .description2 = gBerryDescriptionPart2_Mago,
+ .stageDuration = 6,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 10,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 25,
+ },
+ {
+ .name = _("AGUAV"),
+ .firmness = BERRY_FIRMNESS_SUPER_HARD,
+ .size = 64,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Aguav,
+ .description2 = gBerryDescriptionPart2_Aguav,
+ .stageDuration = 6,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 10,
+ .sour = 0,
+ .smoothness = 25,
+ },
+ {
+ .name = _("IAPAPA"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 223,
+ .maxYield = 3,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Iapapa,
+ .description2 = gBerryDescriptionPart2_Iapapa,
+ .stageDuration = 6,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 10,
+ .smoothness = 25,
+ },
+ {
+ .name = _("RAZZ"),
+ .firmness = BERRY_FIRMNESS_VERY_HARD,
+ .size = 120,
+ .maxYield = 6,
+ .minYield = 3,
+ .description1 = gBerryDescriptionPart1_Razz,
+ .description2 = gBerryDescriptionPart2_Razz,
+ .stageDuration = 1,
+ .spicy = 10,
+ .dry = 10,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 20,
+ },
+ {
+ .name = _("BLUK"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 108,
+ .maxYield = 6,
+ .minYield = 3,
+ .description1 = gBerryDescriptionPart1_Bluk,
+ .description2 = gBerryDescriptionPart2_Bluk,
+ .stageDuration = 1,
+ .spicy = 0,
+ .dry = 10,
+ .sweet = 10,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 20,
+ },
+ {
+ .name = _("NANAB"),
+ .firmness = BERRY_FIRMNESS_VERY_HARD,
+ .size = 77,
+ .maxYield = 6,
+ .minYield = 3,
+ .description1 = gBerryDescriptionPart1_Nanab,
+ .description2 = gBerryDescriptionPart2_Nanab,
+ .stageDuration = 1,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 10,
+ .bitter = 10,
+ .sour = 0,
+ .smoothness = 20,
+ },
+ {
+ .name = _("WEPEAR"),
+ .firmness = BERRY_FIRMNESS_SUPER_HARD,
+ .size = 74,
+ .maxYield = 6,
+ .minYield = 3,
+ .description1 = gBerryDescriptionPart1_Wepear,
+ .description2 = gBerryDescriptionPart2_Wepear,
+ .stageDuration = 1,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 10,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("PINAP"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 80,
+ .maxYield = 6,
+ .minYield = 3,
+ .description1 = gBerryDescriptionPart1_Pinap,
+ .description2 = gBerryDescriptionPart2_Pinap,
+ .stageDuration = 1,
+ .spicy = 10,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("POMEG"),
+ .firmness = BERRY_FIRMNESS_VERY_HARD,
+ .size = 135,
+ .maxYield = 6,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Pomeg,
+ .description2 = gBerryDescriptionPart2_Pomeg,
+ .stageDuration = 3,
+ .spicy = 10,
+ .dry = 0,
+ .sweet = 10,
+ .bitter = 10,
+ .sour = 0,
+ .smoothness = 20,
+ },
+ {
+ .name = _("KELPSY"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 150,
+ .maxYield = 6,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Kelpsy,
+ .description2 = gBerryDescriptionPart2_Kelpsy,
+ .stageDuration = 3,
+ .spicy = 0,
+ .dry = 10,
+ .sweet = 0,
+ .bitter = 10,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("QUALOT"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 110,
+ .maxYield = 6,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Qualot,
+ .description2 = gBerryDescriptionPart2_Qualot,
+ .stageDuration = 3,
+ .spicy = 10,
+ .dry = 0,
+ .sweet = 10,
+ .bitter = 0,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("HONDEW"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 162,
+ .maxYield = 6,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Hondew,
+ .description2 = gBerryDescriptionPart2_Hondew,
+ .stageDuration = 3,
+ .spicy = 10,
+ .dry = 10,
+ .sweet = 0,
+ .bitter = 10,
+ .sour = 0,
+ .smoothness = 20,
+ },
+ {
+ .name = _("GREPA"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 149,
+ .maxYield = 6,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Grepa,
+ .description2 = gBerryDescriptionPart2_Grepa,
+ .stageDuration = 3,
+ .spicy = 0,
+ .dry = 10,
+ .sweet = 10,
+ .bitter = 0,
+ .sour = 10,
+ .smoothness = 20,
+ },
+ {
+ .name = _("TAMATO"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 200,
+ .maxYield = 4,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Tamato,
+ .description2 = gBerryDescriptionPart2_Tamato,
+ .stageDuration = 6,
+ .spicy = 20,
+ .dry = 10,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 30,
+ },
+ {
+ .name = _("CORNN"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 75,
+ .maxYield = 4,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Cornn,
+ .description2 = gBerryDescriptionPart2_Cornn,
+ .stageDuration = 6,
+ .spicy = 0,
+ .dry = 20,
+ .sweet = 10,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 30,
+ },
+ {
+ .name = _("MAGOST"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 140,
+ .maxYield = 4,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Magost,
+ .description2 = gBerryDescriptionPart2_Magost,
+ .stageDuration = 6,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 20,
+ .bitter = 10,
+ .sour = 0,
+ .smoothness = 30,
+ },
+ {
+ .name = _("RABUTA"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 226,
+ .maxYield = 4,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Rabuta,
+ .description2 = gBerryDescriptionPart2_Rabuta,
+ .stageDuration = 6,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 20,
+ .sour = 10,
+ .smoothness = 30,
+ },
+ {
+ .name = _("NOMEL"),
+ .firmness = BERRY_FIRMNESS_SUPER_HARD,
+ .size = 285,
+ .maxYield = 4,
+ .minYield = 2,
+ .description1 = gBerryDescriptionPart1_Nomel,
+ .description2 = gBerryDescriptionPart2_Nomel,
+ .stageDuration = 6,
+ .spicy = 10,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 20,
+ .smoothness = 30,
+ },
+ {
+ .name = _("SPELON"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 133,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Spelon,
+ .description2 = gBerryDescriptionPart2_Spelon,
+ .stageDuration = 18,
+ .spicy = 40,
+ .dry = 10,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 70,
+ },
+ {
+ .name = _("PAMTRE"),
+ .firmness = BERRY_FIRMNESS_VERY_SOFT,
+ .size = 244,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Pamtre,
+ .description2 = gBerryDescriptionPart2_Pamtre,
+ .stageDuration = 18,
+ .spicy = 0,
+ .dry = 40,
+ .sweet = 10,
+ .bitter = 0,
+ .sour = 0,
+ .smoothness = 70,
+ },
+ {
+ .name = _("WATMEL"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 250,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Watmel,
+ .description2 = gBerryDescriptionPart2_Watmel,
+ .stageDuration = 18,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 40,
+ .bitter = 10,
+ .sour = 0,
+ .smoothness = 70,
+ },
+ {
+ .name = _("DURIN"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 280,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Durin,
+ .description2 = gBerryDescriptionPart2_Durin,
+ .stageDuration = 18,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 40,
+ .sour = 10,
+ .smoothness = 70,
+ },
+ {
+ .name = _("BELUE"),
+ .firmness = BERRY_FIRMNESS_VERY_SOFT,
+ .size = 300,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Belue,
+ .description2 = gBerryDescriptionPart2_Belue,
+ .stageDuration = 18,
+ .spicy = 10,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 40,
+ .smoothness = 70,
+ },
+ {
+ .name = _("LIECHI"),
+ .firmness = BERRY_FIRMNESS_VERY_HARD,
+ .size = 111,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Liechi,
+ .description2 = gBerryDescriptionPart2_Liechi,
+ .stageDuration = 24,
+ .spicy = 40,
+ .dry = 0,
+ .sweet = 40,
+ .bitter = 0,
+ .sour = 10,
+ .smoothness = 80,
+ },
+ {
+ .name = _("GANLON"),
+ .firmness = BERRY_FIRMNESS_VERY_HARD,
+ .size = 33,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Ganlon,
+ .description2 = gBerryDescriptionPart2_Ganlon,
+ .stageDuration = 24,
+ .spicy = 0,
+ .dry = 40,
+ .sweet = 0,
+ .bitter = 40,
+ .sour = 0,
+ .smoothness = 80,
+ },
+ {
+ .name = _("SALAC"),
+ .firmness = BERRY_FIRMNESS_VERY_HARD,
+ .size = 95,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Salac,
+ .description2 = gBerryDescriptionPart2_Salac,
+ .stageDuration = 24,
+ .spicy = 0,
+ .dry = 0,
+ .sweet = 40,
+ .bitter = 0,
+ .sour = 40,
+ .smoothness = 80,
+ },
+ {
+ .name = _("PETAYA"),
+ .firmness = BERRY_FIRMNESS_VERY_HARD,
+ .size = 237,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Petaya,
+ .description2 = gBerryDescriptionPart2_Petaya,
+ .stageDuration = 24,
+ .spicy = 40,
+ .dry = 0,
+ .sweet = 0,
+ .bitter = 40,
+ .sour = 0,
+ .smoothness = 80,
+ },
+ {
+ .name = _("APICOT"),
+ .firmness = BERRY_FIRMNESS_HARD,
+ .size = 75,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Apicot,
+ .description2 = gBerryDescriptionPart2_Apicot,
+ .stageDuration = 24,
+ .spicy = 0,
+ .dry = 40,
+ .sweet = 0,
+ .bitter = 0,
+ .sour = 40,
+ .smoothness = 80,
+ },
+ {
+ .name = _("LANSAT"),
+ .firmness = BERRY_FIRMNESS_SOFT,
+ .size = 97,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Lansat,
+ .description2 = gBerryDescriptionPart2_Lansat,
+ .stageDuration = 24,
+ .spicy = 10,
+ .dry = 10,
+ .sweet = 10,
+ .bitter = 10,
+ .sour = 10,
+ .smoothness = 30,
+ },
+ {
+ .name = _("STARF"),
+ .firmness = BERRY_FIRMNESS_SUPER_HARD,
+ .size = 153,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Starf,
+ .description2 = gBerryDescriptionPart2_Starf,
+ .stageDuration = 24,
+ .spicy = 10,
+ .dry = 10,
+ .sweet = 10,
+ .bitter = 10,
+ .sour = 10,
+ .smoothness = 30,
+ },
+ {
+ .name = _("ENIGMA"),
+ .firmness = BERRY_FIRMNESS_UNKNOWN,
+ .size = 0,
+ .maxYield = 2,
+ .minYield = 1,
+ .description1 = gBerryDescriptionPart1_Enigma,
+ .description2 = gBerryDescriptionPart2_Enigma,
+ .stageDuration = 24,
+ .spicy = 40,
+ .dry = 40,
+ .sweet = 40,
+ .bitter = 40,
+ .sour = 40,
+ .smoothness = 40,
+ },
+};
+
+const struct BerryTree gBlankBerryTree = {0};
+
extern u8 BerryTreeScript;
-extern struct BerryTree gBlankBerryTree;
extern u16 gScriptItemId;
extern u16 gScriptLastTalked;
extern u16 gSpecialVar_0x8004;
@@ -29,7 +811,7 @@ void SetEnigmaBerry(u8 *src)
{
u32 i;
u8 *dest = (u8*)&gSaveBlock1.enigmaBerry;
-
+
for (i = 0; i < sizeof(gSaveBlock1.enigmaBerry); i++)
dest[i] = src[i];
@@ -39,8 +821,8 @@ void SetEnigmaBerry(u8 *src)
u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry)
{
- u8 *description1;
- u8 *description2;
+ const u8 *description1;
+ const u8 *description2;
u32 i;
u32 checksum;
u8 *dest;
@@ -74,7 +856,7 @@ bool32 IsEnigmaBerryValid(void)
return TRUE;
}
-struct Berry *GetBerryInfo(u8 berry)
+const struct Berry *GetBerryInfo(u8 berry)
{
if (berry == 0x2B && IsEnigmaBerryValid())
return &gSaveBlock1.enigmaBerry.berry;
@@ -94,7 +876,7 @@ struct BerryTree *GetBerryTreeInfo(u8 id)
bool32 FieldObjectInteractionWaterBerryTree(void)
{
struct BerryTree *tree = GetBerryTreeInfo(FieldObjectGetBerryTreeId(gSelectedMapObject));
-
+
switch (tree->stage)
{
case 1:
@@ -137,8 +919,8 @@ void ClearBerryTrees(void)
int i;
struct SaveBlock1 *saveBlock1 = &gSaveBlock1;
struct BerryTree berryTree = gBlankBerryTree;
-
- for (i = 0; i < 128; i++)
+
+ for (i = 0; i < (u8)ARRAY_COUNT(saveBlock1->berryTrees); i++) // casting to u8 fixes a mismatched signed compare. what
saveBlock1->berryTrees[i] = berryTree;
}
@@ -175,8 +957,8 @@ void BerryTreeTimeUpdate(int time)
{
int i;
struct BerryTree *tree;
-
- for (i = 0; i < 128; i++)
+
+ for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.berryTrees); i++)
{
tree = &gSaveBlock1.berryTrees[i];
@@ -189,7 +971,7 @@ void BerryTreeTimeUpdate(int time)
else
{
int time2 = time;
-
+
while (time2 != 0)
{
if (tree->secondsUntilNextStage > time2)
@@ -212,7 +994,7 @@ void BerryTreeTimeUpdate(int time)
void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle)
{
struct BerryTree *tree = GetBerryTreeInfo(id);
-
+
*tree = gBlankBerryTree;
tree->berry = berry;
tree->secondsUntilNextStage = GetStageDurationByBerryType(berry);
@@ -246,7 +1028,7 @@ u8 GetStageByBerryTreeId(u8 id)
u8 ItemIdToBerryType(u16 item)
{
u16 berry = item - FIRST_BERRY;
-
+
if (berry > LAST_BERRY - FIRST_BERRY)
return 1;
else
@@ -256,7 +1038,7 @@ u8 ItemIdToBerryType(u16 item)
u16 BerryTypeToItemId(u16 berry)
{
u16 item = berry - 1;
-
+
if (item > LAST_BERRY - FIRST_BERRY)
return FIRST_BERRY;
else
@@ -265,8 +1047,8 @@ u16 BerryTypeToItemId(u16 berry)
void GetBerryNameByBerryType(u8 berry, u8 *string)
{
- memcpy(string, GetBerryInfo(berry)->name, 6);
- string[6] = EOS;
+ memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH);
+ string[BERRY_NAME_LENGTH] = EOS;
}
void ResetBerryTreeSparkleFlag(u8 id)
@@ -277,7 +1059,7 @@ void ResetBerryTreeSparkleFlag(u8 id)
u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree)
{
u8 count = 0;
-
+
if (tree->watered1)
count++;
if (tree->watered2)
@@ -300,7 +1082,7 @@ u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water)
u32 randMax;
u32 rand;
u32 extraYield;
-
+
if (water == 0)
return min;
else
@@ -308,7 +1090,7 @@ u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water)
randMin = (max - min) * (water - 1);
randMax = (max - min) * (water);
rand = randMin + Random() % (randMax - randMin + 1);
-
+
if ((rand & 3) > 1)
extraYield = rand / 4 + 1;
else
@@ -319,10 +1101,10 @@ u8 CalcBerryYieldInternal(u16 max, u16 min, u8 water)
u8 CalcBerryYield(struct BerryTree *tree)
{
- struct Berry *berry = GetBerryInfo(tree->berry);
+ const struct Berry *berry = GetBerryInfo(tree->berry);
u8 min = berry->minYield;
u8 max = berry->maxYield;
-
+
return CalcBerryYieldInternal(max, min, BerryTreeGetNumStagesWatered(tree));
}
@@ -343,7 +1125,7 @@ void FieldObjectInteractionGetBerryTreeData(void)
u8 unk;
u8 group;
u8 num;
-
+
id = FieldObjectGetBerryTreeId(gSelectedMapObject);
berry = GetBerryTypeByBerryTreeId(id);
ResetBerryTreeSparkleFlag(id);
@@ -367,7 +1149,7 @@ void sub_80B4EE4(void)
void FieldObjectInteractionPlantBerryTree(void)
{
u8 berry = ItemIdToBerryType(gScriptItemId);
-
+
PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, TRUE);
FieldObjectInteractionGetBerryTreeData();
}
@@ -376,7 +1158,7 @@ void FieldObjectInteractionPickBerryTree(void)
{
u8 id = FieldObjectGetBerryTreeId(gSelectedMapObject);
u8 berry = GetBerryTypeByBerryTreeId(id);
-
+
gSpecialVar_0x8004 = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id));
}
@@ -406,7 +1188,7 @@ void ResetBerryTreeSparkleFlags(void)
top = cam_top + 3;
right = cam_left + 14;
bottom = top + 8;
- for (i = 0; i < 16; i++)
+ for (i = 0; i < (u8)ARRAY_COUNT(gSaveBlock1.mapObjects); i++)
{
if (gMapObjects[i].active && gMapObjects[i].animPattern == 12)
{
diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c
index 164e2cfc2..103f0a85e 100644
--- a/src/berry_tag_screen.c
+++ b/src/berry_tag_screen.c
@@ -3,6 +3,7 @@
#include "asm.h"
#include "berry.h"
#include "decompress.h"
+#include "items.h"
#include "main.h"
#include "menu.h"
#include "palette.h"
@@ -13,7 +14,6 @@
#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "items.h"
#define OFFSET_7B (123)
#define FIRST_BERRY ITEM_CHERI_BERRY
@@ -30,7 +30,6 @@ struct BerryTagStatus
};
extern struct Struct2000000 unk_2000000;
-extern u16 gBGTilemapBuffers[4][0x400];
extern u8 gUnknown_0203932C;
extern struct BerryTagStatus gUnknown_0203932E;
extern u16 gScriptItemId;
@@ -63,8 +62,8 @@ static void sub_8146600(u8 berry);
// static void sub_81466A0(void);
static void sub_81466E8(u8 taskId, s8 direction);
// static void sub_8146798(u8 berry);
-// static void sub_8146810(u8 berry);
-// static void sub_81468BC(void);
+static void sub_8146810(s8 berry);
+static void sub_81468BC(void);
static void sub_8146014(void)
{
@@ -192,42 +191,42 @@ bool8 sub_81462B8(void)
switch (unk_2000000.var_1FFFF)
{
- case 0:
- LZDecompressVram(gBerryCheck_Gfx, (void *) VRAM);
- unk_2000000.var_1FFFF += 1;
- break;
- case 1:
- LZDecompressVram(gUnknown_08E788E4, (void *) VRAM + 0x2800);
- unk_2000000.var_1FFFF += 1;
- break;
- case 2:
- LZDecompressVram(gUnknown_08E78A84, (void *) VRAM + 0x3000);
- unk_2000000.var_1FFFF += 1;
- break;
- case 3:
- for (i = 0; i < 0x400; i++)
- {
- if (gSaveBlock2.playerGender == MALE)
- gBGTilemapBuffers[2][i] = 0x4042;
- else
- gBGTilemapBuffers[2][i] = 0x5042;
- }
- addr = (void *)(VRAM + 0x3800);
- DmaCopy16(3, gBGTilemapBuffers[2], addr, 0x800);
- unk_2000000.var_1FFFF += 1;
- break;
- case 4:
- LoadCompressedPalette(gBerryCheck_Pal, 0, 96 * 2);
- unk_2000000.var_1FFFF += 1;
- break;
- case 5:
- LoadCompressedObjectPic(&gUnknown_083C1F74);
- unk_2000000.var_1FFFF += 1;
- break;
- case 6:
- LoadCompressedObjectPalette(&gUnknown_083C1F7C);
- unk_2000000.var_1FFFF = 0;
- return TRUE;
+ case 0:
+ LZDecompressVram(gBerryCheck_Gfx, (void *)VRAM);
+ unk_2000000.var_1FFFF += 1;
+ break;
+ case 1:
+ LZDecompressVram(gUnknown_08E788E4, (void *)VRAM + 0x2800);
+ unk_2000000.var_1FFFF += 1;
+ break;
+ case 2:
+ LZDecompressVram(gUnknown_08E78A84, (void *)VRAM + 0x3000);
+ unk_2000000.var_1FFFF += 1;
+ break;
+ case 3:
+ for (i = 0; i < 0x400; i++)
+ {
+ if (gSaveBlock2.playerGender == MALE)
+ gBGTilemapBuffers[2][i] = 0x4042;
+ else
+ gBGTilemapBuffers[2][i] = 0x5042;
+ }
+ addr = (void *)(VRAM + 0x3800);
+ DmaCopy16(3, gBGTilemapBuffers[2], addr, 0x800);
+ unk_2000000.var_1FFFF += 1;
+ break;
+ case 4:
+ LoadCompressedPalette(gBerryCheck_Pal, 0, 96 * 2);
+ unk_2000000.var_1FFFF += 1;
+ break;
+ case 5:
+ LoadCompressedObjectPic(&gUnknown_083C1F74);
+ unk_2000000.var_1FFFF += 1;
+ break;
+ case 6:
+ LoadCompressedObjectPalette(&gUnknown_083C1F7C);
+ unk_2000000.var_1FFFF = 0;
+ return TRUE;
}
return FALSE;
@@ -266,7 +265,7 @@ static void sub_8146480(u8 taskid)
static void sub_81464E4(void)
{
- struct Berry *berryInfo;
+ const struct Berry *berryInfo;
u32 size;
s32 sizeMajor;
s32 sizeMinor;
@@ -307,10 +306,10 @@ static void sub_81464E4(void)
static void sub_8146600(u8 berry)
{
- struct Berry *berryInfo;
+ const struct Berry *berryInfo;
u16 i;
- berryInfo = GetBerryInfo(berry +1);
+ berryInfo = GetBerryInfo(berry + 1);
for (i = 0; i < 5; i++)
gUnknown_0203932E.circles[i] = (u16)gUnknown_0203932E.circles[i] | 0xFFFF;
@@ -342,257 +341,214 @@ void sub_81466A0(void)
}
__attribute__((naked))
-static void sub_81466E8(u8 taskId, s8 direction) {
+static void sub_81466E8(u8 taskId, s8 direction)
+{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- lsls r0, 24\n\
- lsrs r7, r0, 24\n\
- lsls r1, 24\n\
- lsrs r2, r1, 24\n\
- lsls r0, r7, 2\n\
- adds r0, r7\n\
- lsls r0, 3\n\
- ldr r1, _08146748 @ =gTasks + 0x8\n\
- adds r6, r0, r1\n\
- ldr r4, _0814674C @ =gUnknown_03005D10\n\
- movs r0, 0xC\n\
- adds r0, r4\n\
- mov r8, r0\n\
- ldrb r1, [r0, 0x1]\n\
- ldrb r0, [r4, 0xC]\n\
- adds r1, r0\n\
- cmp r1, 0\n\
- bne _08146718\n\
- lsls r0, r2, 24\n\
- cmp r0, 0\n\
- blt _0814678C\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r2, r1, 24\n\
+ lsls r0, r7, 2\n\
+ adds r0, r7\n\
+ lsls r0, 3\n\
+ ldr r1, _08146748 @ =gTasks + 0x8\n\
+ adds r6, r0, r1\n\
+ ldr r4, _0814674C @ =gUnknown_03005D10\n\
+ movs r0, 0xC\n\
+ adds r0, r4\n\
+ mov r8, r0\n\
+ ldrb r1, [r0, 0x1]\n\
+ ldrb r0, [r4, 0xC]\n\
+ adds r1, r0\n\
+ cmp r1, 0\n\
+ bne _08146718\n\
+ lsls r0, r2, 24\n\
+ cmp r0, 0\n\
+ blt _0814678C\n\
_08146718:\n\
- adds r0, r1, 0x1\n\
- lsls r5, r2, 24\n\
- mov r1, r8\n\
- ldrb r1, [r1, 0x2]\n\
- cmp r0, r1\n\
- bne _08146728\n\
- cmp r5, 0\n\
- bgt _0814678C\n\
+ adds r0, r1, 0x1\n\
+ lsls r5, r2, 24\n\
+ mov r1, r8\n\
+ ldrb r1, [r1, 0x2]\n\
+ cmp r0, r1\n\
+ bne _08146728\n\
+ cmp r5, 0\n\
+ bgt _0814678C\n\
_08146728:\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- mov r2, r8\n\
- ldrb r3, [r2, 0x1]\n\
- ldrb r4, [r4, 0xC]\n\
- mov r12, r4\n\
- adds r0, r3, r4\n\
- asrs r2, r5, 24\n\
- adds r1, r0, r2\n\
- cmp r1, 0\n\
- bge _08146750\n\
- negs r0, r0\n\
- strh r0, [r6, 0x2]\n\
- b _08146766\n\
- .align 2, 0\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ mov r2, r8\n\
+ ldrb r3, [r2, 0x1]\n\
+ ldrb r4, [r4, 0xC]\n\
+ mov r12, r4\n\
+ adds r0, r3, r4\n\
+ asrs r2, r5, 24\n\
+ adds r1, r0, r2\n\
+ cmp r1, 0\n\
+ bge _08146750\n\
+ negs r0, r0\n\
+ strh r0, [r6, 0x2]\n\
+ b _08146766\n\
+ .align 2, 0\n\
_08146748: .4byte gTasks + 0x8\n\
_0814674C: .4byte gUnknown_03005D10\n\
_08146750:\n\
- mov r4, r8\n\
- ldrb r0, [r4, 0x2]\n\
- cmp r1, r0\n\
- blt _08146764\n\
- subs r0, r3\n\
- mov r1, r12\n\
- subs r0, r1\n\
- subs r0, 0x1\n\
- strh r0, [r6, 0x2]\n\
- b _08146766\n\
+ mov r4, r8\n\
+ ldrb r0, [r4, 0x2]\n\
+ cmp r1, r0\n\
+ blt _08146764\n\
+ subs r0, r3\n\
+ mov r1, r12\n\
+ subs r0, r1\n\
+ subs r0, 0x1\n\
+ strh r0, [r6, 0x2]\n\
+ b _08146766\n\
_08146764:\n\
- strh r2, [r6, 0x2]\n\
+ strh r2, [r6, 0x2]\n\
_08146766:\n\
- ldr r0, _08146780 @ =gTasks\n\
- lsls r1, r7, 2\n\
- adds r1, r7\n\
- lsls r1, 3\n\
- adds r1, r0\n\
- ldr r0, _08146784 @ =sub_8146798\n\
- str r0, [r1]\n\
- cmp r5, 0\n\
- bge _08146788\n\
- movs r2, 0x10\n\
- negs r2, r2\n\
- adds r0, r2, 0\n\
- b _0814678A\n\
- .align 2, 0\n\
+ ldr r0, _08146780 @ =gTasks\n\
+ lsls r1, r7, 2\n\
+ adds r1, r7\n\
+ lsls r1, 3\n\
+ adds r1, r0\n\
+ ldr r0, _08146784 @ =sub_8146798\n\
+ str r0, [r1]\n\
+ cmp r5, 0\n\
+ bge _08146788\n\
+ movs r2, 0x10\n\
+ negs r2, r2\n\
+ adds r0, r2, 0\n\
+ b _0814678A\n\
+ .align 2, 0\n\
_08146780: .4byte gTasks\n\
_08146784: .4byte sub_8146798\n\
_08146788:\n\
- movs r0, 0x10\n\
+ movs r0, 0x10\n\
_0814678A:\n\
- strh r0, [r6]\n\
+ strh r0, [r6]\n\
_0814678C:\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided\n");
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
}
-__attribute__((naked))
-void sub_8146798(u8 berry) {
- asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- lsls r0, r4, 2\n\
- adds r0, r4\n\
- lsls r0, 3\n\
- ldr r1, _08146800 @ =gTasks + 0x8\n\
- adds r0, r1\n\
- ldr r2, _08146804 @ =gUnknown_030041B4\n\
- ldrh r1, [r0]\n\
- ldrh r5, [r2]\n\
- adds r3, r1, r5\n\
- movs r1, 0xFF\n\
- ands r3, r1\n\
- strh r3, [r2]\n\
- movs r1, 0\n\
- ldrsh r0, [r0, r1]\n\
- cmp r0, 0\n\
- ble _081467C2\n\
- cmp r3, 0x90\n\
- beq _081467CA\n\
-_081467C2:\n\
- cmp r0, 0\n\
- bge _081467E0\n\
- cmp r3, 0x70\n\
- bne _081467E0\n\
-_081467CA:\n\
- ldr r0, _08146808 @ =gTasks\n\
- lsls r1, r4, 2\n\
- adds r1, r4\n\
- lsls r1, 3\n\
- adds r1, r0\n\
- movs r0, 0xA\n\
- ldrsb r0, [r1, r0]\n\
- bl sub_8146810\n\
- bl sub_81468BC\n\
-_081467E0:\n\
- ldr r0, _08146804 @ =gUnknown_030041B4\n\
- ldrh r2, [r0]\n\
- cmp r2, 0\n\
- bne _081467FA\n\
- ldr r0, _08146808 @ =gTasks\n\
- lsls r1, r4, 2\n\
- adds r1, r4\n\
- lsls r1, 3\n\
- adds r1, r0\n\
- strh r2, [r1, 0x8]\n\
- strh r2, [r1, 0xA]\n\
- ldr r0, _0814680C @ =sub_8146480\n\
- str r0, [r1]\n\
-_081467FA:\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
-_08146800: .4byte gTasks + 0x8\n\
-_08146804: .4byte gUnknown_030041B4\n\
-_08146808: .4byte gTasks\n\
-_0814680C: .4byte sub_8146480\n\
- .syntax divided\n");
+void sub_8146798(u8 taskId)
+{
+ s16 *taskData = gTasks[taskId].data;
+
+ gUnknown_030041B4 = (gUnknown_030041B4 + taskData[0]) & 0xFF;
+ if ((taskData[0] > 0 && gUnknown_030041B4 == 144)
+ || (taskData[0] < 0 && gUnknown_030041B4 == 112))
+ {
+ sub_8146810(gTasks[taskId].data[1]);
+ sub_81468BC();
+ }
+ if (gUnknown_030041B4 == 0)
+ {
+ gTasks[taskId].data[0] = gUnknown_030041B4;
+ gTasks[taskId].data[1] = gUnknown_030041B4;
+ gTasks[taskId].func = sub_8146480;
+ }
}
__attribute__((naked))
-void sub_8146810(u8 berry) {
+static void sub_8146810(s8 berry)
+{
asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- lsls r0, 24\n\
- lsrs r3, r0, 24\n\
- adds r4, r3, 0\n\
- lsls r0, r3, 24\n\
- asrs r1, r0, 24\n\
- cmp r1, 0\n\
- ble _08146848\n\
- ldr r0, _08146840 @ =gUnknown_03005D10\n\
- adds r4, r0, 0\n\
- adds r4, 0xC\n\
- ldrb r2, [r0, 0xC]\n\
- adds r1, r2, r1\n\
- adds r6, r0, 0\n\
- cmp r1, 0x7\n\
- ble _08146844\n\
- adds r0, r3, 0\n\
- adds r0, 0xF9\n\
- adds r0, r2, r0\n\
- ldrb r1, [r4, 0x1]\n\
- adds r0, r1\n\
- strb r0, [r4, 0x1]\n\
- movs r0, 0x7\n\
- b _0814686E\n\
- .align 2, 0\n\
+ push {r4-r6,lr}\n\
+ lsls r0, 24\n\
+ lsrs r3, r0, 24\n\
+ adds r4, r3, 0\n\
+ lsls r0, r3, 24\n\
+ asrs r1, r0, 24\n\
+ cmp r1, 0\n\
+ ble _08146848\n\
+ ldr r0, _08146840 @ =gUnknown_03005D10\n\
+ adds r4, r0, 0\n\
+ adds r4, 0xC\n\
+ ldrb r2, [r0, 0xC]\n\
+ adds r1, r2, r1\n\
+ adds r6, r0, 0\n\
+ cmp r1, 0x7\n\
+ ble _08146844\n\
+ adds r0, r3, 0\n\
+ adds r0, 0xF9\n\
+ adds r0, r2, r0\n\
+ ldrb r1, [r4, 0x1]\n\
+ adds r0, r1\n\
+ strb r0, [r4, 0x1]\n\
+ movs r0, 0x7\n\
+ b _0814686E\n\
+ .align 2, 0\n\
_08146840: .4byte gUnknown_03005D10\n\
_08146844:\n\
- adds r0, r2, r3\n\
- b _0814686E\n\
+ adds r0, r2, r3\n\
+ b _0814686E\n\
_08146848:\n\
- ldr r0, _08146868 @ =gUnknown_03005D10\n\
- adds r5, r0, 0\n\
- adds r5, 0xC\n\
- ldrb r2, [r0, 0xC]\n\
- adds r1, r2, r1\n\
- adds r6, r0, 0\n\
- cmp r1, 0\n\
- bge _0814686C\n\
- adds r0, r2, r3\n\
- ldrb r1, [r5, 0x1]\n\
- adds r0, r1\n\
- movs r1, 0\n\
- strb r0, [r5, 0x1]\n\
- strb r1, [r6, 0xC]\n\
- b _08146870\n\
- .align 2, 0\n\
+ ldr r0, _08146868 @ =gUnknown_03005D10\n\
+ adds r5, r0, 0\n\
+ adds r5, 0xC\n\
+ ldrb r2, [r0, 0xC]\n\
+ adds r1, r2, r1\n\
+ adds r6, r0, 0\n\
+ cmp r1, 0\n\
+ bge _0814686C\n\
+ adds r0, r2, r3\n\
+ ldrb r1, [r5, 0x1]\n\
+ adds r0, r1\n\
+ movs r1, 0\n\
+ strb r0, [r5, 0x1]\n\
+ strb r1, [r6, 0xC]\n\
+ b _08146870\n\
+ .align 2, 0\n\
_08146868: .4byte gUnknown_03005D10\n\
_0814686C:\n\
- adds r0, r2, r4\n\
+ adds r0, r2, r4\n\
_0814686E:\n\
- strb r0, [r6, 0xC]\n\
+ strb r0, [r6, 0xC]\n\
_08146870:\n\
- ldr r2, _081468AC @ =gScriptItemId\n\
- movs r0, 0x3\n\
- lsls r0, 2\n\
- adds r0, r6\n\
- ldrb r1, [r0, 0x1]\n\
- ldrb r0, [r0]\n\
- adds r1, r0\n\
- ldr r0, _081468B0 @ =gUnknown_03005D24\n\
- ldr r0, [r0]\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- ldrh r0, [r1]\n\
- strh r0, [r2]\n\
- ldr r0, _081468B4 @ =gUnknown_0203932C\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 4\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- ldr r1, _081468B8 @ =gSprites\n\
- adds r0, r1\n\
- bl DestroySprite\n\
- bl sub_81466A0\n\
- bl sub_80A7DD4\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ ldr r2, _081468AC @ =gScriptItemId\n\
+ movs r0, 0x3\n\
+ lsls r0, 2\n\
+ adds r0, r6\n\
+ ldrb r1, [r0, 0x1]\n\
+ ldrb r0, [r0]\n\
+ adds r1, r0\n\
+ ldr r0, _081468B0 @ =gUnknown_03005D24\n\
+ ldr r0, [r0]\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ ldrh r0, [r1]\n\
+ strh r0, [r2]\n\
+ ldr r0, _081468B4 @ =gUnknown_0203932C\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ ldr r1, _081468B8 @ =gSprites\n\
+ adds r0, r1\n\
+ bl DestroySprite\n\
+ bl sub_81466A0\n\
+ bl sub_80A7DD4\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_081468AC: .4byte gScriptItemId\n\
_081468B0: .4byte gUnknown_03005D24\n\
_081468B4: .4byte gUnknown_0203932C\n\
_081468B8: .4byte gSprites\n\
- .syntax divided\n");
+ .syntax divided\n");
}
-void sub_81468BC(void) {
+static void sub_81468BC(void)
+{
MenuZeroFillWindowRect(0, 4, 29, 19);
sub_81464E4();
diff --git a/src/bike.c b/src/bike.c
new file mode 100644
index 000000000..7693c7539
--- /dev/null
+++ b/src/bike.c
@@ -0,0 +1,1015 @@
+#include "global.h"
+#include "global.fieldmap.h"
+#include "flags.h"
+#include "asm.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
+#include "metatile_behavior.h"
+#include "songs.h"
+#include "sound.h"
+#include "rom4.h"
+#include "bike.h"
+
+extern u8 sub_80608A4(u8);
+
+extern u8 gUnknown_02039250;
+extern u8 gUnknown_02039251;
+extern u8 gUnknown_0202E854;
+extern u8 gUnknown_0202E86C[];
+extern u8 gUnknown_0202E874[];
+
+static void MovePlayerOnMachBike(u8, u16, u16);
+static u8 GetMachBikeTransition(u8 *);
+static void MachBikeTransition_FaceDirection(u8);
+static void MachBikeTransition_80E517C(u8);
+static void MachBikeTransition_80E51C4(u8);
+static void MachBikeTransition_80E5270(u8);
+static void MovePlayerOnAcroBike(u8, u16, u16);
+static u8 CheckMovementInputAcroBike(u8 *, u16, u16);
+static u8 AcroBikeHandleInputNormal(u8 *, u16, u16);
+static u8 AcroBikeHandleInputTurning(u8 *, u16, u16);
+static u8 AcroBikeHandleInputWheelieStanding(u8 *, u16, u16);
+static u8 AcroBikeHandleInputBunnyHop(u8 *, u16, u16);
+static u8 AcroBikeHandleInputWheelieMoving(u8 *, u16, u16);
+static u8 AcroBikeHandleInputState5(u8 *, u16, u16);
+static u8 AcroBikeHandleInputState6(u8 *, u16, u16);
+static void AcroBikeTransition_FaceDirection(u8);
+static void AcroBikeTransition_80E5708(u8);
+static void AcroBikeTransition_80E5744(u8);
+static void AcroBikeTransition_NormalToWheelie(u8);
+static void AcroBikeTransition_80E57F8(u8);
+static void AcroBikeTransition_80E5834(u8);
+static void AcroBikeTransition_80E5870(u8);
+static void AcroBikeTransition_80E58AC(u8);
+static void AcroBikeTransition_80E5920(u8);
+static void AcroBikeTransition_80E5990(u8);
+static void AcroBikeTransition_80E59A0(u8);
+static void AcroBikeTransition_80E5A30(u8);
+static void AcroBikeTransition_80E5AC0(u8);
+static void sub_80E5B60(u16, u16);
+static u8 sub_80E5C2C(void);
+static void sub_80E5C7C(u8);
+static void sub_80E5CB8(u8);
+static u8 sub_80E5CF4(u16);
+static u8 get_some_collision(u8);
+static u8 sub_80E5DA0(struct MapObject *, s16, s16, u8, u8);
+static bool8 IsRunningDisallowedByMetatile(u8);
+static void sub_80E5E4C();
+static u8 CanBikeFaceDirOnMetatile(u8, u8);
+static bool8 sub_80E5EC0(u8, u8);
+static void sub_80E6024(void);
+
+static void (*const sMachBikeTransitions[])(u8) =
+{
+ MachBikeTransition_FaceDirection,
+ MachBikeTransition_80E517C,
+ MachBikeTransition_80E51C4,
+ MachBikeTransition_80E5270,
+};
+
+static void (*const gUnknown_083DB5A4[])(u8) =
+{
+ PlayerGoSpeed0,
+ sub_80593C4,
+ sub_80593F4,
+};
+
+static void (*const sAcroBikeTransitions[])(u8) =
+{
+ AcroBikeTransition_FaceDirection,
+ AcroBikeTransition_80E5708,
+ AcroBikeTransition_80E5744,
+ AcroBikeTransition_NormalToWheelie,
+ AcroBikeTransition_80E57F8,
+ AcroBikeTransition_80E5834,
+ AcroBikeTransition_80E5870,
+ AcroBikeTransition_80E58AC,
+ AcroBikeTransition_80E5920,
+ AcroBikeTransition_80E5990,
+ AcroBikeTransition_80E59A0,
+ AcroBikeTransition_80E5A30,
+ AcroBikeTransition_80E5AC0,
+};
+
+static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) =
+{
+ AcroBikeHandleInputNormal,
+ AcroBikeHandleInputTurning,
+ AcroBikeHandleInputWheelieStanding,
+ AcroBikeHandleInputBunnyHop,
+ AcroBikeHandleInputWheelieMoving,
+ AcroBikeHandleInputState5,
+ AcroBikeHandleInputState6,
+};
+
+const u16 gMachBikeSpeeds[] = {SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST};
+static const u8 Unknown_3DB606[] = {4, 0};
+
+static const struct UnknownStruct1 gUnknown_083DB608[] =
+{
+ {1, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 1},
+ {2, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 2},
+ {3, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 3},
+ {4, 2, 15, 15, Unknown_3DB606, Unknown_3DB606, 4},
+};
+
+void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys)
+{
+ if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE)
+ MovePlayerOnMachBike(direction, newKeys, heldKeys);
+ else
+ MovePlayerOnAcroBike(direction, newKeys, heldKeys);
+}
+
+static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys)
+{
+ sMachBikeTransitions[GetMachBikeTransition(&direction)](direction);
+}
+
+static u8 GetMachBikeTransition(u8 *ptr)
+{
+ u8 direction = player_get_direction_upper_nybble();
+
+ if (*ptr == 0)
+ {
+ *ptr = direction;
+ if (gPlayerAvatar.unkB == 0)
+ {
+ gPlayerAvatar.running2 = 0;
+ return 0;
+ }
+ gPlayerAvatar.running2 = 2;
+ return 3;
+ }
+
+ if (*ptr != direction && gPlayerAvatar.running2 != 2)
+ {
+ if (gPlayerAvatar.unkB != 0)
+ {
+ *ptr = direction;
+ gPlayerAvatar.running2 = 2;
+ return 3;
+ }
+ gPlayerAvatar.running2 = 1;
+ return 1;
+ }
+ else
+ {
+ gPlayerAvatar.running2 = 2;
+ return 2;
+ }
+}
+
+static void MachBikeTransition_FaceDirection(u8 direction)
+{
+ PlayerFaceDirection(direction);
+ sub_80E6024();
+}
+
+static void MachBikeTransition_80E517C(u8 direction)
+{
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E))
+ {
+ PlayerTurnInPlace(direction);
+ sub_80E6024();
+ }
+ else
+ {
+ MachBikeTransition_FaceDirection(playerMapObj->mapobj_unk_18);
+ }
+}
+
+static void MachBikeTransition_80E51C4(u8 direction)
+{
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+ u8 collision;
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ {
+ if (gPlayerAvatar.unkB)
+ MachBikeTransition_80E5270(playerMapObj->placeholder18);
+ else
+ MachBikeTransition_FaceDirection(playerMapObj->placeholder18);
+ }
+ else
+ {
+ collision = get_some_collision(direction);
+ if (collision > 0 && collision < 12)
+ {
+ if (collision == COLLISION_LEDGE_JUMP)
+ {
+ PlayerJumpLedge(direction);
+ }
+ else
+ {
+ sub_80E6024();
+ if (collision < 5 || collision > 8)
+ PlayerOnBikeCollide(direction);
+ }
+ }
+ else
+ {
+ gUnknown_083DB5A4[gPlayerAvatar.bikeFrameCounter](direction);
+ gPlayerAvatar.unkB = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1
+ if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array
+ gPlayerAvatar.bikeFrameCounter++;
+ }
+ }
+}
+
+static void MachBikeTransition_80E5270(u8 var)
+{
+ u8 collision;
+
+ if (gPlayerAvatar.unkB != 0)
+ gPlayerAvatar.bikeFrameCounter = --gPlayerAvatar.unkB;
+
+ collision = get_some_collision(var);
+
+ if (collision > 0 && collision < 12)
+ {
+ if (collision == COLLISION_LEDGE_JUMP)
+ {
+ PlayerJumpLedge(var);
+ }
+ else
+ {
+ sub_80E6024();
+ if (collision < 5 || collision > 8)
+ PlayerOnBikeCollide(var);
+ }
+ }
+ else
+ {
+ gUnknown_083DB5A4[gPlayerAvatar.bikeFrameCounter](var);
+ }
+}
+
+static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys)
+{
+ sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection);
+}
+
+static u8 CheckMovementInputAcroBike(u8 *newDirection, u16 newKeys, u16 heldKeys)
+{
+ return sAcroBikeInputHandlers[gPlayerAvatar.acroBikeState](newDirection, newKeys, heldKeys);
+}
+
+static u8 AcroBikeHandleInputNormal(u8 *newDirection, u16 newKeys, u16 heldKeys)
+{
+ u8 direction = player_get_direction_upper_nybble();
+
+ gPlayerAvatar.bikeFrameCounter = 0;
+ if (*newDirection == DIR_NONE)
+ {
+ if (newKeys & B_BUTTON)
+ {
+ //We're standing still with the B button held.
+ //Do a wheelie.
+ *newDirection = direction;
+ gPlayerAvatar.running2 = 0;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING;
+ return ACRO_TRANS_NORMAL_TO_WHEELIE;
+ }
+ else
+ {
+ *newDirection = direction;
+ gPlayerAvatar.running2 = 0;
+ return ACRO_TRANS_FACE_DIRECTION;
+ }
+ }
+ if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.unkB == 0)
+ {
+ gPlayerAvatar.unkB++;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING;
+ return 11;
+ }
+ if (*newDirection != direction && gPlayerAvatar.running2 != 2)
+ {
+ gPlayerAvatar.acroBikeState = ACRO_STATE_TURNING;
+ gPlayerAvatar.unk9 = *newDirection;
+ gPlayerAvatar.running2 = 0;
+ return CheckMovementInputAcroBike(newDirection, newKeys, heldKeys);
+ }
+ gPlayerAvatar.running2 = 2;
+ return 2;
+}
+
+static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys)
+{
+ u8 direction;
+
+ *newDirection = gPlayerAvatar.unk9;
+ gPlayerAvatar.bikeFrameCounter++;
+
+ //Wait 6 frames before actually changing direction
+ if (gPlayerAvatar.bikeFrameCounter > 6)
+ {
+ gPlayerAvatar.running2 = 1;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ sub_80E6024();
+ return 1;
+ }
+ direction = player_get_direction_upper_nybble();
+ if (*newDirection == sub_80E5C2C())
+ {
+ sub_80E6024();
+ gPlayerAvatar.unkB = 1;
+ if (*newDirection == GetOppositeDirection(direction))
+ {
+ gPlayerAvatar.acroBikeState = ACRO_STATE_6;
+ return 9;
+ }
+ else
+ {
+ gPlayerAvatar.running2 = 2;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_5;
+ return 8;
+ }
+ }
+ *newDirection = direction;
+ return 0;
+}
+
+static u8 AcroBikeHandleInputWheelieStanding(u8 *ptr, u16 newKeys, u16 heldKeys)
+{
+ u8 direction;
+ struct MapObject *playerMapObj;
+
+ direction = player_get_direction_upper_nybble();
+ playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+ gPlayerAvatar.running2 = 0;
+
+ if (heldKeys & B_BUTTON)
+ gPlayerAvatar.bikeFrameCounter++;
+ else
+ {
+ //B button was released.
+ gPlayerAvatar.bikeFrameCounter = 0;
+ if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E))
+ {
+ //Go back to normal on flat ground
+ *ptr = direction;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ sub_80E6024();
+ return 4;
+ }
+ }
+ if (gPlayerAvatar.bikeFrameCounter >= 40)
+ {
+ *ptr = direction;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_BUNNY_HOP;
+ sub_80E6024();
+ return 6;
+ }
+ if (*ptr == direction)
+ {
+ gPlayerAvatar.running2 = 2;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING;
+ sub_80E6024();
+ return 10;
+ }
+ if (*ptr == 0)
+ {
+ *ptr = direction;
+ return 5;
+ }
+ gPlayerAvatar.running2 = 1;
+ return 5;
+}
+
+static u8 AcroBikeHandleInputBunnyHop(u8 *ptr, u16 newKeys, u16 heldKeys)
+{
+ u8 direction;
+ struct MapObject *playerMapObj;
+
+ direction = player_get_direction_upper_nybble();
+ playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+ if (!(heldKeys & B_BUTTON))
+ {
+ //B button was released
+ sub_80E6024();
+ if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E))
+ {
+ //Do a standing wheelie on a bumpy slope
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING;
+ return CheckMovementInputAcroBike(ptr, newKeys, heldKeys);
+ }
+ else
+ {
+ //Go back to normal on flat ground
+ *ptr = direction;
+ gPlayerAvatar.running2 = 0;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ return 4;
+ }
+ }
+
+ //B Button is still held
+
+ if (*ptr == DIR_NONE)
+ {
+ *ptr = direction;
+ gPlayerAvatar.running2 = 0;
+ return 6;
+ }
+ if (*ptr != direction && gPlayerAvatar.running2 != 2)
+ {
+ gPlayerAvatar.running2 = 1;
+ return 6;
+ }
+ gPlayerAvatar.running2 = 2;
+ return 7;
+}
+
+static u8 AcroBikeHandleInputWheelieMoving(u8 *ptr, u16 newKeys, u16 heldKeys)
+{
+ u8 direction;
+ struct MapObject *playerMapObj;
+
+ direction = player_get_direction_lower_nybble();
+ playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+ if (!(heldKeys & B_BUTTON))
+ {
+ sub_80E6024();
+ if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E))
+ {
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ if (*ptr == 0)
+ {
+ *ptr = direction;
+ gPlayerAvatar.running2 = 0;
+ return 4;
+ }
+ if (*ptr != direction && gPlayerAvatar.running2 != 2)
+ {
+ gPlayerAvatar.running2 = 0;
+ return 4;
+ }
+ gPlayerAvatar.running2 = 2;
+ return 12;
+ }
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING;
+ return CheckMovementInputAcroBike(ptr, newKeys, heldKeys);
+ }
+ if (*ptr == 0)
+ {
+ *ptr = direction;
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING;
+ gPlayerAvatar.running2 = 0;
+ sub_80E6024();
+ return 5;
+ }
+ if (direction != *ptr && gPlayerAvatar.running2 != 2)
+ {
+ gPlayerAvatar.running2 = 0;
+ return 5;
+ }
+ gPlayerAvatar.running2 = 2;
+ return 10;
+}
+
+static u8 AcroBikeHandleInputState5(u8 *ptr, u16 newKeys, u16 heldKeys)
+{
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ playerMapObj->mapobj_bit_9 = 0;
+ FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18);
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ return CheckMovementInputAcroBike(ptr, newKeys, heldKeys);
+}
+
+static u8 AcroBikeHandleInputState6(u8 *ptr, u16 newKeys, u16 heldKeys)
+{
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ return CheckMovementInputAcroBike(ptr, newKeys, heldKeys);
+}
+
+static void AcroBikeTransition_FaceDirection(u8 direction)
+{
+ PlayerFaceDirection(direction);
+}
+
+static void AcroBikeTransition_80E5708(u8 direction)
+{
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ direction = playerMapObj->placeholder18;
+ PlayerFaceDirection(direction);
+}
+
+static void AcroBikeTransition_80E5744(u8 direction)
+{
+ u8 collision;
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ {
+ AcroBikeTransition_FaceDirection(playerMapObj->placeholder18);
+ return;
+ }
+ collision = get_some_collision(direction);
+ if (collision > 0 && collision < 12)
+ {
+ if (collision == COLLISION_LEDGE_JUMP)
+ PlayerJumpLedge(direction);
+ else if (collision < 5 || collision > 8)
+ PlayerOnBikeCollide(direction);
+ }
+ else
+ {
+ npc_use_some_d2s(direction);
+ }
+}
+
+static void AcroBikeTransition_NormalToWheelie(u8 direction)
+{
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ direction = playerMapObj->placeholder18;
+ PlayerStartWheelie(direction);
+}
+
+static void AcroBikeTransition_80E57F8(u8 direction)
+{
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ direction = playerMapObj->placeholder18;
+ sub_8059534(direction);
+}
+
+static void AcroBikeTransition_80E5834(u8 direction)
+{
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ direction = playerMapObj->placeholder18;
+ sub_8059504(direction);
+}
+
+static void AcroBikeTransition_80E5870(u8 direction)
+{
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ direction = playerMapObj->placeholder18;
+ sub_805954C(direction);
+}
+
+static void AcroBikeTransition_80E58AC(u8 direction)
+{
+ u8 var;
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ {
+ AcroBikeTransition_80E5870(playerMapObj->placeholder18);
+ return;
+ }
+ var = get_some_collision(direction);
+ //TODO: Try to get rid of this goto
+ if (var == 0 || var == 9)
+ {
+ goto derp;
+ }
+ else if (var == 6)
+ {
+ sub_8059594(direction);
+ }
+ else if (var < 5 || var > 8)
+ {
+ if (var <= 11)
+ {
+ AcroBikeTransition_80E5870(direction);
+ }
+ else
+ {
+ derp:
+ sub_8059570(direction);
+ }
+ }
+}
+
+static void AcroBikeTransition_80E5920(u8 direction)
+{
+ u8 var;
+ struct MapObject *playerMapObj;
+
+ var = get_some_collision(direction);
+ if (var != 0)
+ {
+ if (var == 7)
+ return;
+ if (var < 10)
+ {
+ AcroBikeTransition_80E5708(direction);
+ return;
+ }
+ if (sub_80E5EC0(var, direction) == 0)
+ {
+ AcroBikeTransition_80E5708(direction);
+ return;
+ }
+ }
+ playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+ PlaySE(SE_JITE_PYOKO);
+ playerMapObj->mapobj_bit_9 = 1;
+ PlayerSetAnimId(sub_80608A4(direction), 2);
+}
+
+static void AcroBikeTransition_80E5990(u8 direction)
+{
+ sub_80595B8(direction);
+}
+
+static void AcroBikeTransition_80E59A0(u8 direction)
+{
+ u8 var;
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ {
+ sub_8059504(playerMapObj->placeholder18);
+ return;
+ }
+ var = get_some_collision(direction);
+ if (var > 0 && var < 12)
+ {
+ if (var == 6)
+ {
+ sub_8059594(direction);
+ }
+ else if (var == 9)
+ {
+ sub_8059504(direction);
+ }
+ else if (var <= 4)
+ {
+ if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E))
+ sub_8059504(direction);
+ else
+ sub_80595DC(direction); //hit wall?
+ }
+ return;
+ }
+ sub_8059618(direction);
+ gPlayerAvatar.running2 = 2;
+}
+
+static void AcroBikeTransition_80E5A30(u8 direction)
+{
+ u8 var;
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ {
+ PlayerStartWheelie(playerMapObj->placeholder18);
+ return;
+ }
+ var = get_some_collision(direction);
+ if (var > 0 && var < 12)
+ {
+ if (var == 6)
+ {
+ sub_8059594(direction);
+ }
+ else if (var == 9)
+ {
+ sub_8059504(direction);
+ }
+ else if (var <= 4)
+ {
+ if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E))
+ sub_8059504(direction);
+ else
+ sub_80595DC(direction); //hit wall?
+ }
+ return;
+ }
+ sub_8059600(direction);
+ gPlayerAvatar.running2 = 2;
+}
+
+static void AcroBikeTransition_80E5AC0(u8 direction)
+{
+ u8 var;
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0)
+ {
+ sub_8059534(playerMapObj->placeholder18);
+ return;
+ }
+ var = get_some_collision(direction);
+ if (var > 0 && var < 12)
+ {
+ if (var == 6)
+ PlayerJumpLedge(direction);
+ else if (var < 5 || var > 8)
+ sub_8059534(direction);
+ return;
+ }
+ sub_8059630(direction);
+}
+
+void sub_80E5B38(u16 a, u16 b)
+{
+ if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)
+ sub_80E5B60(a, b);
+}
+
+static void sub_80E5B60(u16 unused, u16 b)
+{
+ u8 var;
+
+ var = sub_80E5CF4(b);
+ if (var == (gPlayerAvatar.unkC & 0xF))
+ {
+ if (gPlayerAvatar.unk14[0] < 0xFF)
+ gPlayerAvatar.unk14[0]++;
+ }
+ else
+ {
+ sub_80E5C7C(var);
+ gPlayerAvatar.unkB = 0;
+ }
+
+ var = b & 0xF;
+ if (var == (gPlayerAvatar.unk10 & 0xF))
+ {
+ if (gPlayerAvatar.unk1C[0] < 0xFF)
+ gPlayerAvatar.unk1C[0]++;
+ }
+ else
+ {
+ sub_80E5CB8(var);
+ gPlayerAvatar.unkB = 0;
+ }
+}
+
+static bool8 sub_80E5BC8(const u8 *a, const u8 *b)
+{
+ u8 i;
+
+ for (i = 0; a[i] != 0; i++)
+ {
+ if (gUnknown_0202E86C[i] > a[i])
+ return FALSE;
+ }
+ for (i = 0; b[i] != 0; i++)
+ {
+ if (gUnknown_0202E874[i] > b[i])
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static u8 sub_80E5C2C(void)
+{
+ u32 i;
+
+ for (i = 0; i < 4; i++)
+ {
+ const struct UnknownStruct1 *s = &gUnknown_083DB608[i];
+ u32 r1 = gPlayerAvatar.unkC;
+ u32 r2 = gPlayerAvatar.unk10;
+
+ r1 &= s->unk8;
+ r2 &= s->unkC;
+ if (r1 == s->unk0 && r2 == s->unk4 && sub_80E5BC8(s->unk10, s->unk14))
+ return s->unk18;
+ }
+ return 0;
+}
+
+static void sub_80E5C7C(u8 a)
+{
+ u8 i;
+
+ gPlayerAvatar.unkC = (gPlayerAvatar.unkC << 4) | (a & 0xF);
+
+ for (i = 7; i != 0; i--)
+ gPlayerAvatar.unk14[i] = gPlayerAvatar.unk14[i - 1];
+ gPlayerAvatar.unk14[0] = 1;
+}
+
+static void sub_80E5CB8(u8 a)
+{
+ u8 i;
+
+ gPlayerAvatar.unk10 = (gPlayerAvatar.unk10 << 4) | (a & 0xF);
+
+ for (i = 7; i != 0; i--)
+ gPlayerAvatar.unk1C[i] = gPlayerAvatar.unk1C[i - 1];
+ gPlayerAvatar.unk1C[0] = 1;
+}
+
+static u8 sub_80E5CF4(u16 a)
+{
+ if (a & 0x40)
+ return 2;
+ if (a & 0x80)
+ return 1;
+ if (a & 0x20)
+ return 3;
+ if (a & 0x10)
+ return 4;
+ return 0;
+}
+
+static u8 get_some_collision(u8 direction)
+{
+ s16 x;
+ s16 y;
+ u8 metatitleBehavior;
+ struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
+
+ x = playerMapObj->coords2.x;
+ y = playerMapObj->coords2.y;
+ MoveCoords(direction, &x, &y);
+ metatitleBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ return sub_80E5DA0(playerMapObj, x, y, direction, metatitleBehavior);
+}
+
+static u8 sub_80E5DA0(struct MapObject *mapObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior)
+{
+ u8 collision = CheckForFieldObjectCollision(mapObject, x, y, direction, metatitleBehavior);
+
+ if (collision > 4)
+ return collision;
+
+ if (collision == 0 && IsRunningDisallowedByMetatile(metatitleBehavior))
+ collision = 2;
+
+ if (collision)
+ sub_80E5E4C();
+
+ return collision;
+}
+
+bool8 IsRunningDisallowed(u8 tile)
+{
+ if (IsRunningDisallowedByMetatile(tile) != FALSE || gMapHeader.mapType == MAP_TYPE_INDOOR)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 IsRunningDisallowedByMetatile(u8 tile)
+{
+ if (MetatileBehavior_IsRunningDisallowed(tile))
+ return TRUE;
+ if (MetatileBehavior_IsFortreeBridge(tile) && (PlayerGetZCoord() & 1) == 0)
+ return TRUE;
+ return FALSE;
+}
+
+static void sub_80E5E4C(void)
+{
+ if (gUnknown_02039250 != 0 && gUnknown_02039251 < 100)
+ gUnknown_02039251++;
+}
+
+static bool8 CanBikeFaceDirOnMetatile(u8 direction, u8 tile)
+{
+ if (direction == DIR_EAST || direction == DIR_WEST)
+ {
+ //Bike cannot face east or west on a vertical rail
+ if (MetatileBehavior_IsIsolatedVerticalRail(tile)
+ || MetatileBehavior_IsVerticalRail(tile))
+ return FALSE;
+ }
+ else
+ {
+ //Bike cannot face north or south on a horizontal rail
+ if (MetatileBehavior_IsIsolatedHorizontalRail(tile)
+ || MetatileBehavior_IsHorizontalRail(tile))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static bool8 sub_80E5EC0(u8 var1, u8 direction)
+{
+ if (direction == DIR_NORTH || direction == DIR_SOUTH)
+ {
+ if (var1 == 10 || var1 == 12)
+ return FALSE;
+ }
+ else if (var1 == 11 || var1 == 13)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+bool8 IsBikingDisallowedByPlayer(void)
+{
+ s16 x, y;
+ u8 tileBehavior;
+
+ if (!(gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_4)))
+ {
+ PlayerGetDestCoords(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ if (!IsRunningDisallowedByMetatile(tileBehavior))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+bool8 player_should_look_direction_be_enforced_upon_movement(void)
+{
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) != FALSE)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void GetOnOffBike(u8 var)
+{
+ gUnknown_0202E854 = 0;
+
+ if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
+ {
+ SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
+ sav1_reset_battle_music_maybe();
+ sub_8053E90();
+ }
+ else
+ {
+ SetPlayerAvatarTransitionFlags(var);
+ sav1_set_battle_music_maybe(BGM_CYCLING);
+ sub_8053FB0(BGM_CYCLING);
+ }
+}
+
+void BikeClearState(int var1, int var2)
+{
+ u8 i;
+
+ gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
+ gPlayerAvatar.unk9 = 0;
+ gPlayerAvatar.bikeFrameCounter = 0;
+ gPlayerAvatar.unkB = 0;
+ gPlayerAvatar.unkC = var1;
+ gPlayerAvatar.unk10 = var2;
+
+ for (i = 0; i < 8; i++)
+ gPlayerAvatar.unk14[i] = 0;
+
+ for (i = 0; i < 8; i++)
+ gPlayerAvatar.unk1C[i] = 0;
+}
+
+void sub_80E6010(u8 var)
+{
+ gPlayerAvatar.bikeFrameCounter = var;
+ gPlayerAvatar.unkB = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // lazy way of multiplying by 1.5.
+}
+
+static void sub_80E6024(void)
+{
+ gPlayerAvatar.bikeFrameCounter = 0;
+ gPlayerAvatar.unkB = 0;
+}
+
+s16 GetPlayerSpeed(void)
+{
+ // because the player pressed a direction, it won't ever return a speed of 0 since this function returns the player's current speed.
+ s16 machSpeeds[3];
+
+ memcpy(machSpeeds, gMachBikeSpeeds, sizeof(machSpeeds));
+
+ if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE)
+ return machSpeeds[gPlayerAvatar.bikeFrameCounter];
+ else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)
+ return SPEED_FASTER;
+ else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH))
+ return SPEED_FAST;
+ else
+ return SPEED_NORMAL;
+}
+
+void sub_80E6084(void)
+{
+ s16 x, y;
+ u8 tileBehavior;
+
+ if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)
+ {
+ PlayerGetDestCoords(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ if (MetatileBehavior_IsBumpySlope(tileBehavior))
+ {
+ gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING;
+ sub_8059C94(player_get_direction_upper_nybble());
+ }
+ }
+}
diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c
new file mode 100644
index 000000000..94643691c
--- /dev/null
+++ b/src/braille_puzzles.c
@@ -0,0 +1,259 @@
+#include "global.h"
+#include "asm.h"
+#include "event_data.h"
+#include "field_camera.h"
+#include "field_effect.h"
+#include "flags.h"
+#include "map_obj_lock.h"
+#include "menu.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "species.h"
+#include "task.h"
+#include "text.h"
+#include "braille_puzzles.h"
+#include "rom6.h"
+
+extern u8 gPlayerPartyCount;
+extern u8 gLastFieldPokeMenuOpened;
+
+extern u32 gUnknown_0202FF84[];
+
+extern u8 gIslandCave_EventScript_OpenRegiiceChamber[]; // regiice event script
+
+bool8 ShouldDoBrailleDigEffect(void)
+{
+ if (!FlagGet(SYS_BRAILLE_DIG) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x47))
+ {
+ if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 3)
+ return TRUE;
+ else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 3)
+ return TRUE;
+ else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 3)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void DoBrailleDigEffect(void)
+{
+ MapGridSetMetatileIdAt(16, 8, 554);
+ MapGridSetMetatileIdAt(17, 8, 555);
+ MapGridSetMetatileIdAt(18, 8, 556);
+ MapGridSetMetatileIdAt(16, 9, 3634);
+ MapGridSetMetatileIdAt(17, 9, 563);
+ MapGridSetMetatileIdAt(18, 9, 3636);
+ DrawWholeMapView();
+ PlaySE(SE_BAN);
+ FlagSet(SYS_BRAILLE_DIG);
+ ScriptContext2_Disable();
+}
+
+bool8 CheckRelicanthWailord(void)
+{
+ if (GetMonData(&gPlayerParty, MON_DATA_SPECIES2, 0) == SPECIES_RELICANTH)
+ {
+ CalculatePlayerPartyCount();
+
+ if (GetMonData(&gPlayerParty[gPlayerPartyCount - 1], MON_DATA_SPECIES2, 0) == SPECIES_WAILORD)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 ShouldDoBrailleStrengthEffect(void)
+{
+ if (!FlagGet(SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x6))
+ {
+ if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 23)
+ return TRUE;
+ else if (gSaveBlock1.pos.x == 9 && gSaveBlock1.pos.y == 23)
+ return TRUE;
+ else if (gSaveBlock1.pos.x == 11 && gSaveBlock1.pos.y == 23)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void DoBrailleStrengthEffect(void)
+{
+ FieldEffectActiveListRemove(0x28);
+ MapGridSetMetatileIdAt(14, 26, 554);
+ MapGridSetMetatileIdAt(15, 26, 555);
+ MapGridSetMetatileIdAt(16, 26, 556);
+ MapGridSetMetatileIdAt(14, 27, 3634);
+ MapGridSetMetatileIdAt(15, 27, 563);
+ MapGridSetMetatileIdAt(16, 27, 3636);
+ DrawWholeMapView();
+ PlaySE(SE_BAN);
+ FlagSet(SYS_BRAILLE_STRENGTH);
+ ScriptContext2_Disable();
+}
+
+bool8 ShouldDoBrailleFlyEffect(void)
+{
+ if (!FlagGet(SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == 0x18 && gSaveBlock1.location.mapNum == 0x44))
+ {
+ if (gSaveBlock1.pos.x == 8 && gSaveBlock1.pos.y == 25)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void DoBrailleFlyEffect(void)
+{
+ gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+ FieldEffectStart(0x3C);
+}
+
+bool8 FldEff_UseFlyAncientTomb(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)UseFlyAncientTomb_Callback >> 16;
+ gTasks[taskId].data[9] = (u32)UseFlyAncientTomb_Callback;
+ return FALSE;
+}
+
+void UseFlyAncientTomb_Callback(void)
+{
+ FieldEffectActiveListRemove(0x3C);
+ UseFlyAncientTomb_Finish();
+}
+
+void UseFlyAncientTomb_Finish(void)
+{
+ MapGridSetMetatileIdAt(14, 26, 554);
+ MapGridSetMetatileIdAt(15, 26, 555);
+ MapGridSetMetatileIdAt(16, 26, 556);
+ MapGridSetMetatileIdAt(14, 27, 3634);
+ MapGridSetMetatileIdAt(15, 27, 563);
+ MapGridSetMetatileIdAt(16, 27, 3636);
+ DrawWholeMapView();
+ PlaySE(SE_BAN);
+ FlagSet(SYS_BRAILLE_FLY);
+ ScriptContext2_Disable();
+}
+
+void DoBrailleWait(void)
+{
+ if (!FlagGet(SYS_BRAILLE_WAIT))
+ CreateTask(Task_BrailleWait, 0x50);
+}
+
+void Task_BrailleWait(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ 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();
+ 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;
+ }
+ 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;
+ }
+}
+
+bool32 BrailleWait_CheckButtonPress(void)
+{
+ u16 var = 0xFF;
+
+ if (gSaveBlock2.optionsButtonMode == 1)
+ var |= 0x300;
+ if (gSaveBlock2.optionsButtonMode == 2)
+ var |= 0x200;
+
+ if ((var & gMain.newKeys) != FALSE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void DoSealedChamberShakingEffect1(void)
+{
+ u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9);
+
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[4] = 2;
+ gTasks[taskId].data[5] = 5;
+ gTasks[taskId].data[6] = 50;
+ SetCameraPanningCallback(0);
+}
+
+void DoSealedChamberShakingEffect2(void)
+{
+ u8 taskId = CreateTask(SealedChamberShakingEffect, 0x9);
+
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].data[4] = 3;
+ gTasks[taskId].data[5] = 5;
+ gTasks[taskId].data[6] = 2;
+ SetCameraPanningCallback(0);
+}
+
+void SealedChamberShakingEffect(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[1]++;
+
+ if (!(task->data[1] % task->data[5]))
+ {
+ task->data[1] = 0;
+ task->data[2]++;
+ task->data[4] = -task->data[4];
+ SetCameraPanning(0, task->data[4]);
+ if (task->data[2] == task->data[6])
+ {
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ InstallCameraPanAheadCallback();
+ }
+ }
+}
diff --git a/src/calculate_base_damage.c b/src/calculate_base_damage.c
index 86446e588..293e2f24d 100644
--- a/src/calculate_base_damage.c
+++ b/src/calculate_base_damage.c
@@ -1,17 +1,17 @@
#include "global.h"
-#include "text.h"
-#include "string_util.h"
-#include "pokemon.h"
-#include "species.h"
-#include "main.h"
-#include "sprite.h"
-#include "berry.h"
-#include "item.h"
#include "abilities.h"
-#include "hold_effects.h"
-#include "event_data.h"
#include "battle.h"
+#include "berry.h"
+#include "event_data.h"
+#include "hold_effects.h"
+#include "item.h"
#include "items.h"
+#include "main.h"
+#include "pokemon.h"
+#include "species.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "text.h"
extern u8 gPlayerPartyCount;
extern struct Pokemon gPlayerParty[6];
@@ -292,10 +292,10 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) && gBattleMoves[move].target == 8 && sub_803C348(2) == 2)
damage /= 2;
- // are effects of weather negated with cloud nine or air lock?
+ // are effects of weather negated with cloud nine or air lock?
if (!sub_8018324(0xE, 0, ABILITY_CLOUD_NINE, 0, 0) && !sub_8018324(0xE, 0, ABILITY_AIR_LOCK, 0, 0))
{
- // rain?
+ // rain?
if (gBattleWeather & 1)
{
if (type == TYPE_FIRE)
@@ -307,7 +307,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
// does lack of sun half solar beam damage?
if ((gBattleWeather & 0x9F) && gUnknown_02024BE6 == 76)
damage /= 2;
-
+
// sunny?
if (gBattleWeather & 0x60)
{
@@ -330,328 +330,328 @@ __attribute__((naked))
s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 a4, u16 powerOverride, u8 typeOverride, u8 a7, u8 a8)
{
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, 0x2C\n\
- adds r7, r0, 0\n\
- str r1, [sp, 0x4]\n\
- str r2, [sp, 0x8]\n\
- ldr r0, [sp, 0x4C]\n\
- ldr r1, [sp, 0x50]\n\
- ldr r2, [sp, 0x54]\n\
- ldr r4, [sp, 0x58]\n\
- lsls r3, 16\n\
- lsrs r3, 16\n\
- str r3, [sp, 0xC]\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- lsls r1, 24\n\
- lsrs r6, r1, 24\n\
- lsls r2, 24\n\
- lsrs r2, 24\n\
- str r2, [sp, 0x10]\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- movs r5, 0\n\
- cmp r3, 0\n\
- bne _0803BA80\n\
- ldr r2, _0803BA78 @ =gBattleMovePower\n\
- ldr r1, _0803BA7C @ =gBattleMoves\n\
- ldr r3, [sp, 0x8]\n\
- lsls r0, r3, 1\n\
- adds r0, r3\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r0, [r0, 0x1]\n\
- strh r0, [r2]\n\
- b _0803BA84\n\
- .align 2, 0\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x2C\n\
+ adds r7, r0, 0\n\
+ str r1, [sp, 0x4]\n\
+ str r2, [sp, 0x8]\n\
+ ldr r0, [sp, 0x4C]\n\
+ ldr r1, [sp, 0x50]\n\
+ ldr r2, [sp, 0x54]\n\
+ ldr r4, [sp, 0x58]\n\
+ lsls r3, 16\n\
+ lsrs r3, 16\n\
+ str r3, [sp, 0xC]\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ lsls r1, 24\n\
+ lsrs r6, r1, 24\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ str r2, [sp, 0x10]\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ movs r5, 0\n\
+ cmp r3, 0\n\
+ bne _0803BA80\n\
+ ldr r2, _0803BA78 @ =gBattleMovePower\n\
+ ldr r1, _0803BA7C @ =gBattleMoves\n\
+ ldr r3, [sp, 0x8]\n\
+ lsls r0, r3, 1\n\
+ adds r0, r3\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x1]\n\
+ strh r0, [r2]\n\
+ b _0803BA84\n\
+ .align 2, 0\n\
_0803BA78: .4byte gBattleMovePower\n\
_0803BA7C: .4byte gBattleMoves\n\
_0803BA80:\n\
- ldr r0, _0803BA9C @ =gBattleMovePower\n\
- strh r3, [r0]\n\
+ ldr r0, _0803BA9C @ =gBattleMovePower\n\
+ strh r3, [r0]\n\
_0803BA84:\n\
- cmp r6, 0\n\
- bne _0803BAA4\n\
- ldr r1, _0803BAA0 @ =gBattleMoves\n\
- ldr r6, [sp, 0x8]\n\
- lsls r0, r6, 1\n\
- adds r0, r6\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r0, [r0, 0x2]\n\
- mov r9, r0\n\
- b _0803BAAE\n\
- .align 2, 0\n\
+ cmp r6, 0\n\
+ bne _0803BAA4\n\
+ ldr r1, _0803BAA0 @ =gBattleMoves\n\
+ ldr r6, [sp, 0x8]\n\
+ lsls r0, r6, 1\n\
+ adds r0, r6\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x2]\n\
+ mov r9, r0\n\
+ b _0803BAAE\n\
+ .align 2, 0\n\
_0803BA9C: .4byte gBattleMovePower\n\
_0803BAA0: .4byte gBattleMoves\n\
_0803BAA4:\n\
- movs r0, 0x3F\n\
- mov r9, r0\n\
- mov r1, r9\n\
- ands r1, r6\n\
- mov r9, r1\n\
+ movs r0, 0x3F\n\
+ mov r9, r0\n\
+ mov r1, r9\n\
+ ands r1, r6\n\
+ mov r9, r1\n\
_0803BAAE:\n\
- ldrh r6, [r7, 0x2]\n\
- ldr r2, [sp, 0x4]\n\
- ldrh r2, [r2, 0x4]\n\
- str r2, [sp, 0x14]\n\
- ldrh r3, [r7, 0x8]\n\
- mov r8, r3\n\
- ldr r0, [sp, 0x4]\n\
- ldrh r0, [r0, 0xA]\n\
- str r0, [sp, 0x18]\n\
- ldrh r0, [r7, 0x2E]\n\
- cmp r0, 0xAF\n\
- bne _0803BAE0\n\
- ldr r1, _0803BADC @ =gEnigmaBerries\n\
- ldr r2, [sp, 0x10]\n\
- lsls r0, r2, 3\n\
- subs r0, r2\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r3, [r0, 0x7]\n\
- mov r10, r3\n\
- ldrb r0, [r0, 0x1A]\n\
- b _0803BAF6\n\
- .align 2, 0\n\
+ ldrh r6, [r7, 0x2]\n\
+ ldr r2, [sp, 0x4]\n\
+ ldrh r2, [r2, 0x4]\n\
+ str r2, [sp, 0x14]\n\
+ ldrh r3, [r7, 0x8]\n\
+ mov r8, r3\n\
+ ldr r0, [sp, 0x4]\n\
+ ldrh r0, [r0, 0xA]\n\
+ str r0, [sp, 0x18]\n\
+ ldrh r0, [r7, 0x2E]\n\
+ cmp r0, 0xAF\n\
+ bne _0803BAE0\n\
+ ldr r1, _0803BADC @ =gEnigmaBerries\n\
+ ldr r2, [sp, 0x10]\n\
+ lsls r0, r2, 3\n\
+ subs r0, r2\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r3, [r0, 0x7]\n\
+ mov r10, r3\n\
+ ldrb r0, [r0, 0x1A]\n\
+ b _0803BAF6\n\
+ .align 2, 0\n\
_0803BADC: .4byte gEnigmaBerries\n\
_0803BAE0:\n\
- ldrh r0, [r7, 0x2E]\n\
- bl ItemId_GetHoldEffect\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r10, r0\n\
- ldrh r0, [r7, 0x2E]\n\
- bl ItemId_GetHoldEffectParam\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
+ ldrh r0, [r7, 0x2E]\n\
+ bl ItemId_GetHoldEffect\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ ldrh r0, [r7, 0x2E]\n\
+ bl ItemId_GetHoldEffectParam\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
_0803BAF6:\n\
- str r0, [sp, 0x20]\n\
- ldr r1, [sp, 0x4]\n\
- ldrh r0, [r1, 0x2E]\n\
- cmp r0, 0xAF\n\
- bne _0803BB26\n\
- ldr r1, _0803BB10 @ =gEnigmaBerries\n\
- lsls r0, r4, 3\n\
- subs r0, r4\n\
- lsls r0, 2\n\
- adds r0, r1\n\
- ldrb r0, [r0, 0x7]\n\
- str r0, [sp, 0x1C]\n\
- b _0803BB3C\n\
- .align 2, 0\n\
+ str r0, [sp, 0x20]\n\
+ ldr r1, [sp, 0x4]\n\
+ ldrh r0, [r1, 0x2E]\n\
+ cmp r0, 0xAF\n\
+ bne _0803BB26\n\
+ ldr r1, _0803BB10 @ =gEnigmaBerries\n\
+ lsls r0, r4, 3\n\
+ subs r0, r4\n\
+ lsls r0, 2\n\
+ adds r0, r1\n\
+ ldrb r0, [r0, 0x7]\n\
+ str r0, [sp, 0x1C]\n\
+ b _0803BB3C\n\
+ .align 2, 0\n\
_0803BB10: .4byte gEnigmaBerries\n\
_0803BB14:\n\
- ldr r0, [sp, 0x20]\n\
- adds r0, 0x64\n\
- muls r0, r6\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- b _0803BCDC\n\
+ ldr r0, [sp, 0x20]\n\
+ adds r0, 0x64\n\
+ muls r0, r6\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+ b _0803BCDC\n\
_0803BB26:\n\
- ldr r2, [sp, 0x4]\n\
- ldrh r0, [r2, 0x2E]\n\
- bl ItemId_GetHoldEffect\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- str r0, [sp, 0x1C]\n\
- ldr r3, [sp, 0x4]\n\
- ldrh r0, [r3, 0x2E]\n\
- bl ItemId_GetHoldEffectParam\n\
+ ldr r2, [sp, 0x4]\n\
+ ldrh r0, [r2, 0x2E]\n\
+ bl ItemId_GetHoldEffect\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ str r0, [sp, 0x1C]\n\
+ ldr r3, [sp, 0x4]\n\
+ ldrh r0, [r3, 0x2E]\n\
+ bl ItemId_GetHoldEffectParam\n\
_0803BB3C:\n\
- adds r0, r7, 0\n\
- adds r0, 0x20\n\
- ldrb r1, [r0]\n\
- str r0, [sp, 0x24]\n\
- cmp r1, 0x25\n\
- beq _0803BB4C\n\
- cmp r1, 0x4A\n\
- bne _0803BB50\n\
+ adds r0, r7, 0\n\
+ adds r0, 0x20\n\
+ ldrb r1, [r0]\n\
+ str r0, [sp, 0x24]\n\
+ cmp r1, 0x25\n\
+ beq _0803BB4C\n\
+ cmp r1, 0x4A\n\
+ bne _0803BB50\n\
_0803BB4C:\n\
- lsls r0, r6, 17\n\
- lsrs r6, r0, 16\n\
+ lsls r0, r6, 17\n\
+ lsrs r6, r0, 16\n\
_0803BB50:\n\
- ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- ldr r0, _0803BCBC @ =0x00000902\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803BB5E\n\
- b _0803BC78\n\
+ ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _0803BCBC @ =0x00000902\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803BB5E\n\
+ b _0803BC78\n\
_0803BB5E:\n\
- movs r0, 0x8\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803BB98\n\
- ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\
- ldrh r1, [r0]\n\
- movs r0, 0x80\n\
- lsls r0, 3\n\
- cmp r1, r0\n\
- beq _0803BB98\n\
- ldr r0, _0803BCC4 @ =0x00000807\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0803BB98\n\
- ldr r0, [sp, 0x10]\n\
- bl battle_side_get_owner\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0803BB98\n\
- movs r0, 0x6E\n\
- muls r0, r6\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
+ movs r0, 0x8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803BB98\n\
+ ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x80\n\
+ lsls r0, 3\n\
+ cmp r1, r0\n\
+ beq _0803BB98\n\
+ ldr r0, _0803BCC4 @ =0x00000807\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0803BB98\n\
+ ldr r0, [sp, 0x10]\n\
+ bl battle_side_get_owner\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0803BB98\n\
+ movs r0, 0x6E\n\
+ muls r0, r6\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
_0803BB98:\n\
- ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- ldr r0, _0803BCBC @ =0x00000902\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0803BC78\n\
- movs r0, 0x8\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803BBE2\n\
- ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\
- ldrh r1, [r0]\n\
- movs r0, 0x80\n\
- lsls r0, 3\n\
- cmp r1, r0\n\
- beq _0803BBE2\n\
- ldr r0, _0803BCC8 @ =0x0000080b\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0803BBE2\n\
- adds r0, r4, 0\n\
- bl battle_side_get_owner\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0803BBE2\n\
- movs r0, 0x6E\n\
- ldr r1, [sp, 0x14]\n\
- muls r0, r1\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x14]\n\
+ ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _0803BCBC @ =0x00000902\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0803BC78\n\
+ movs r0, 0x8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803BBE2\n\
+ ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x80\n\
+ lsls r0, 3\n\
+ cmp r1, r0\n\
+ beq _0803BBE2\n\
+ ldr r0, _0803BCC8 @ =0x0000080b\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0803BBE2\n\
+ adds r0, r4, 0\n\
+ bl battle_side_get_owner\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0803BBE2\n\
+ movs r0, 0x6E\n\
+ ldr r1, [sp, 0x14]\n\
+ muls r0, r1\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x14]\n\
_0803BBE2:\n\
- ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- ldr r0, _0803BCBC @ =0x00000902\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0803BC78\n\
- movs r0, 0x8\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803BC2E\n\
- ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\
- ldrh r1, [r0]\n\
- movs r0, 0x80\n\
- lsls r0, 3\n\
- cmp r1, r0\n\
- beq _0803BC2E\n\
- ldr r0, _0803BCCC @ =0x0000080d\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0803BC2E\n\
- ldr r0, [sp, 0x10]\n\
- bl battle_side_get_owner\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0803BC2E\n\
- movs r0, 0x6E\n\
- mov r2, r8\n\
- muls r2, r0\n\
- adds r0, r2, 0\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
+ ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _0803BCBC @ =0x00000902\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0803BC78\n\
+ movs r0, 0x8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803BC2E\n\
+ ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x80\n\
+ lsls r0, 3\n\
+ cmp r1, r0\n\
+ beq _0803BC2E\n\
+ ldr r0, _0803BCCC @ =0x0000080d\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0803BC2E\n\
+ ldr r0, [sp, 0x10]\n\
+ bl battle_side_get_owner\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0803BC2E\n\
+ movs r0, 0x6E\n\
+ mov r2, r8\n\
+ muls r2, r0\n\
+ adds r0, r2, 0\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
_0803BC2E:\n\
- ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- ldr r0, _0803BCBC @ =0x00000902\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0803BC78\n\
- movs r0, 0x8\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803BC78\n\
- ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\
- ldrh r1, [r0]\n\
- movs r0, 0x80\n\
- lsls r0, 3\n\
- cmp r1, r0\n\
- beq _0803BC78\n\
- ldr r0, _0803BCCC @ =0x0000080d\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0803BC78\n\
- adds r0, r4, 0\n\
- bl battle_side_get_owner\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0803BC78\n\
- movs r0, 0x6E\n\
- ldr r3, [sp, 0x18]\n\
- muls r0, r3\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x18]\n\
+ ldr r0, _0803BCB8 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _0803BCBC @ =0x00000902\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0803BC78\n\
+ movs r0, 0x8\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803BC78\n\
+ ldr r0, _0803BCC0 @ =gTrainerBattleOpponent\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x80\n\
+ lsls r0, 3\n\
+ cmp r1, r0\n\
+ beq _0803BC78\n\
+ ldr r0, _0803BCCC @ =0x0000080d\n\
+ bl FlagGet\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0803BC78\n\
+ adds r0, r4, 0\n\
+ bl battle_side_get_owner\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0803BC78\n\
+ movs r0, 0x6E\n\
+ ldr r3, [sp, 0x18]\n\
+ muls r0, r3\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x18]\n\
_0803BC78:\n\
- movs r2, 0\n\
- ldr r4, _0803BCD0 @ =gHoldEffectToType\n\
- ldr r0, [sp, 0x4]\n\
- adds r0, 0x20\n\
- str r0, [sp, 0x28]\n\
- adds r3, r4, 0\n\
+ movs r2, 0\n\
+ ldr r4, _0803BCD0 @ =gHoldEffectToType\n\
+ ldr r0, [sp, 0x4]\n\
+ adds r0, 0x20\n\
+ str r0, [sp, 0x28]\n\
+ adds r3, r4, 0\n\
_0803BC84:\n\
- lsls r1, r2, 1\n\
- ldrb r0, [r3]\n\
- cmp r10, r0\n\
- bne _0803BCD4\n\
- adds r0, r4, 0x1\n\
- adds r0, r1, r0\n\
- ldrb r0, [r0]\n\
- cmp r9, r0\n\
- bne _0803BCD4\n\
- mov r1, r9\n\
- cmp r1, 0x8\n\
- bhi _0803BC9E\n\
- b _0803BB14\n\
+ lsls r1, r2, 1\n\
+ ldrb r0, [r3]\n\
+ cmp r10, r0\n\
+ bne _0803BCD4\n\
+ adds r0, r4, 0x1\n\
+ adds r0, r1, r0\n\
+ ldrb r0, [r0]\n\
+ cmp r9, r0\n\
+ bne _0803BCD4\n\
+ mov r1, r9\n\
+ cmp r1, 0x8\n\
+ bhi _0803BC9E\n\
+ b _0803BB14\n\
_0803BC9E:\n\
- ldr r0, [sp, 0x20]\n\
- adds r0, 0x64\n\
- mov r2, r8\n\
- muls r2, r0\n\
- adds r0, r2, 0\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
- b _0803BCDC\n\
- .align 2, 0\n\
+ ldr r0, [sp, 0x20]\n\
+ adds r0, 0x64\n\
+ mov r2, r8\n\
+ muls r2, r0\n\
+ adds r0, r2, 0\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
+ b _0803BCDC\n\
+ .align 2, 0\n\
_0803BCB8: .4byte gBattleTypeFlags\n\
_0803BCBC: .4byte 0x00000902\n\
_0803BCC0: .4byte gTrainerBattleOpponent\n\
@@ -660,398 +660,398 @@ _0803BCC8: .4byte 0x0000080b\n\
_0803BCCC: .4byte 0x0000080d\n\
_0803BCD0: .4byte gHoldEffectToType\n\
_0803BCD4:\n\
- adds r3, 0x2\n\
- adds r2, 0x1\n\
- cmp r2, 0x10\n\
- bls _0803BC84\n\
+ adds r3, 0x2\n\
+ adds r2, 0x1\n\
+ cmp r2, 0x10\n\
+ bls _0803BC84\n\
_0803BCDC:\n\
- mov r3, r10\n\
- cmp r3, 0x1D\n\
- bne _0803BCF0\n\
- movs r0, 0x96\n\
- muls r0, r6\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
+ mov r3, r10\n\
+ cmp r3, 0x1D\n\
+ bne _0803BCF0\n\
+ movs r0, 0x96\n\
+ muls r0, r6\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
_0803BCF0:\n\
- mov r0, r10\n\
- cmp r0, 0x22\n\
- bne _0803BD28\n\
- ldr r0, _0803BFDC @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- movs r0, 0x80\n\
- lsls r0, 1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0803BD28\n\
- ldr r1, _0803BFE0 @ =0xfffffe69\n\
- adds r0, r1, 0\n\
- ldrh r2, [r7]\n\
- adds r0, r2\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r0, 0x1\n\
- bhi _0803BD28\n\
- movs r0, 0x96\n\
- mov r3, r8\n\
- muls r3, r0\n\
- adds r0, r3, 0\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
+ mov r0, r10\n\
+ cmp r0, 0x22\n\
+ bne _0803BD28\n\
+ ldr r0, _0803BFDC @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x80\n\
+ lsls r0, 1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0803BD28\n\
+ ldr r1, _0803BFE0 @ =0xfffffe69\n\
+ adds r0, r1, 0\n\
+ ldrh r2, [r7]\n\
+ adds r0, r2\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x1\n\
+ bhi _0803BD28\n\
+ movs r0, 0x96\n\
+ mov r3, r8\n\
+ muls r3, r0\n\
+ adds r0, r3, 0\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
_0803BD28:\n\
- ldr r0, [sp, 0x1C]\n\
- cmp r0, 0x22\n\
- bne _0803BD60\n\
- ldr r0, _0803BFDC @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- movs r0, 0x80\n\
- lsls r0, 1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0803BD60\n\
- ldr r1, _0803BFE0 @ =0xfffffe69\n\
- adds r0, r1, 0\n\
- ldr r2, [sp, 0x4]\n\
- ldrh r2, [r2]\n\
- adds r0, r2\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r0, 0x1\n\
- bhi _0803BD60\n\
- movs r0, 0x96\n\
- ldr r3, [sp, 0x18]\n\
- muls r0, r3\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x18]\n\
+ ldr r0, [sp, 0x1C]\n\
+ cmp r0, 0x22\n\
+ bne _0803BD60\n\
+ ldr r0, _0803BFDC @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x80\n\
+ lsls r0, 1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0803BD60\n\
+ ldr r1, _0803BFE0 @ =0xfffffe69\n\
+ adds r0, r1, 0\n\
+ ldr r2, [sp, 0x4]\n\
+ ldrh r2, [r2]\n\
+ adds r0, r2\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x1\n\
+ bhi _0803BD60\n\
+ movs r0, 0x96\n\
+ ldr r3, [sp, 0x18]\n\
+ muls r0, r3\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x18]\n\
_0803BD60:\n\
- mov r0, r10\n\
- cmp r0, 0x23\n\
- bne _0803BD76\n\
- ldrh r1, [r7]\n\
- ldr r0, _0803BFE4 @ =0x00000175\n\
- cmp r1, r0\n\
- bne _0803BD76\n\
- mov r1, r8\n\
- lsls r0, r1, 17\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
+ mov r0, r10\n\
+ cmp r0, 0x23\n\
+ bne _0803BD76\n\
+ ldrh r1, [r7]\n\
+ ldr r0, _0803BFE4 @ =0x00000175\n\
+ cmp r1, r0\n\
+ bne _0803BD76\n\
+ mov r1, r8\n\
+ lsls r0, r1, 17\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
_0803BD76:\n\
- ldr r2, [sp, 0x1C]\n\
- cmp r2, 0x24\n\
- bne _0803BD8E\n\
- ldr r3, [sp, 0x4]\n\
- ldrh r1, [r3]\n\
- ldr r0, _0803BFE4 @ =0x00000175\n\
- cmp r1, r0\n\
- bne _0803BD8E\n\
- ldr r1, [sp, 0x18]\n\
- lsls r0, r1, 17\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x18]\n\
+ ldr r2, [sp, 0x1C]\n\
+ cmp r2, 0x24\n\
+ bne _0803BD8E\n\
+ ldr r3, [sp, 0x4]\n\
+ ldrh r1, [r3]\n\
+ ldr r0, _0803BFE4 @ =0x00000175\n\
+ cmp r1, r0\n\
+ bne _0803BD8E\n\
+ ldr r1, [sp, 0x18]\n\
+ lsls r0, r1, 17\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x18]\n\
_0803BD8E:\n\
- mov r2, r10\n\
- cmp r2, 0x2D\n\
- bne _0803BDA2\n\
- ldrh r0, [r7]\n\
- cmp r0, 0x19\n\
- bne _0803BDA2\n\
- mov r3, r8\n\
- lsls r0, r3, 17\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
+ mov r2, r10\n\
+ cmp r2, 0x2D\n\
+ bne _0803BDA2\n\
+ ldrh r0, [r7]\n\
+ cmp r0, 0x19\n\
+ bne _0803BDA2\n\
+ mov r3, r8\n\
+ lsls r0, r3, 17\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
_0803BDA2:\n\
- ldr r0, [sp, 0x1C]\n\
- cmp r0, 0x40\n\
- bne _0803BDB8\n\
- ldr r1, [sp, 0x4]\n\
- ldrh r0, [r1]\n\
- cmp r0, 0x84\n\
- bne _0803BDB8\n\
- ldr r2, [sp, 0x14]\n\
- lsls r0, r2, 17\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x14]\n\
+ ldr r0, [sp, 0x1C]\n\
+ cmp r0, 0x40\n\
+ bne _0803BDB8\n\
+ ldr r1, [sp, 0x4]\n\
+ ldrh r0, [r1]\n\
+ cmp r0, 0x84\n\
+ bne _0803BDB8\n\
+ ldr r2, [sp, 0x14]\n\
+ lsls r0, r2, 17\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x14]\n\
_0803BDB8:\n\
- mov r3, r10\n\
- cmp r3, 0x41\n\
- bne _0803BDCE\n\
- ldrh r0, [r7]\n\
- subs r0, 0x68\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r0, 0x1\n\
- bhi _0803BDCE\n\
- lsls r0, r6, 17\n\
- lsrs r6, r0, 16\n\
+ mov r3, r10\n\
+ cmp r3, 0x41\n\
+ bne _0803BDCE\n\
+ ldrh r0, [r7]\n\
+ subs r0, 0x68\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x1\n\
+ bhi _0803BDCE\n\
+ lsls r0, r6, 17\n\
+ lsrs r6, r0, 16\n\
_0803BDCE:\n\
- ldr r1, [sp, 0x28]\n\
- ldrb r0, [r1]\n\
- cmp r0, 0x2F\n\
- bne _0803BDE6\n\
- mov r2, r9\n\
- cmp r2, 0xA\n\
- beq _0803BDE0\n\
- cmp r2, 0xF\n\
- bne _0803BDE6\n\
+ ldr r1, [sp, 0x28]\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x2F\n\
+ bne _0803BDE6\n\
+ mov r2, r9\n\
+ cmp r2, 0xA\n\
+ beq _0803BDE0\n\
+ cmp r2, 0xF\n\
+ bne _0803BDE6\n\
_0803BDE0:\n\
- mov r3, r8\n\
- lsrs r3, 1\n\
- mov r8, r3\n\
+ mov r3, r8\n\
+ lsrs r3, 1\n\
+ mov r8, r3\n\
_0803BDE6:\n\
- ldr r0, [sp, 0x24]\n\
- ldrb r4, [r0]\n\
- cmp r4, 0x37\n\
- bne _0803BDFC\n\
- movs r0, 0x96\n\
- muls r0, r6\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
+ ldr r0, [sp, 0x24]\n\
+ ldrb r4, [r0]\n\
+ cmp r4, 0x37\n\
+ bne _0803BDFC\n\
+ movs r0, 0x96\n\
+ muls r0, r6\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
_0803BDFC:\n\
- cmp r4, 0x39\n\
- bne _0803BE2A\n\
- movs r0, 0\n\
- str r0, [sp]\n\
- movs r0, 0xE\n\
- movs r1, 0\n\
- movs r2, 0x3A\n\
- movs r3, 0\n\
- bl sub_8018324\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0803BE2A\n\
- movs r0, 0x96\n\
- mov r1, r8\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
+ cmp r4, 0x39\n\
+ bne _0803BE2A\n\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+ movs r0, 0xE\n\
+ movs r1, 0\n\
+ movs r2, 0x3A\n\
+ movs r3, 0\n\
+ bl sub_8018324\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0803BE2A\n\
+ movs r0, 0x96\n\
+ mov r1, r8\n\
+ muls r1, r0\n\
+ adds r0, r1, 0\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
_0803BE2A:\n\
- ldr r2, [sp, 0x24]\n\
- ldrb r0, [r2]\n\
- cmp r0, 0x3A\n\
- bne _0803BE5C\n\
- movs r0, 0\n\
- str r0, [sp]\n\
- movs r0, 0xE\n\
- movs r1, 0\n\
- movs r2, 0x39\n\
- movs r3, 0\n\
- bl sub_8018324\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0803BE5C\n\
- movs r0, 0x96\n\
- mov r3, r8\n\
- muls r3, r0\n\
- adds r0, r3, 0\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r8, r0\n\
+ ldr r2, [sp, 0x24]\n\
+ ldrb r0, [r2]\n\
+ cmp r0, 0x3A\n\
+ bne _0803BE5C\n\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+ movs r0, 0xE\n\
+ movs r1, 0\n\
+ movs r2, 0x39\n\
+ movs r3, 0\n\
+ bl sub_8018324\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0803BE5C\n\
+ movs r0, 0x96\n\
+ mov r3, r8\n\
+ muls r3, r0\n\
+ adds r0, r3, 0\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
_0803BE5C:\n\
- ldr r1, [sp, 0x24]\n\
- ldrb r0, [r1]\n\
- cmp r0, 0x3E\n\
- bne _0803BE78\n\
- ldr r0, [r7, 0x4C]\n\
- cmp r0, 0\n\
- beq _0803BE78\n\
- movs r0, 0x96\n\
- muls r0, r6\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
+ ldr r1, [sp, 0x24]\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x3E\n\
+ bne _0803BE78\n\
+ ldr r0, [r7, 0x4C]\n\
+ cmp r0, 0\n\
+ beq _0803BE78\n\
+ movs r0, 0x96\n\
+ muls r0, r6\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
_0803BE78:\n\
- ldr r2, [sp, 0x28]\n\
- ldrb r0, [r2]\n\
- cmp r0, 0x3F\n\
- bne _0803BE9A\n\
- ldr r3, [sp, 0x4]\n\
- ldr r0, [r3, 0x4C]\n\
- cmp r0, 0\n\
- beq _0803BE9A\n\
- movs r0, 0x96\n\
- ldr r1, [sp, 0x14]\n\
- muls r0, r1\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- str r0, [sp, 0x14]\n\
+ ldr r2, [sp, 0x28]\n\
+ ldrb r0, [r2]\n\
+ cmp r0, 0x3F\n\
+ bne _0803BE9A\n\
+ ldr r3, [sp, 0x4]\n\
+ ldr r0, [r3, 0x4C]\n\
+ cmp r0, 0\n\
+ beq _0803BE9A\n\
+ movs r0, 0x96\n\
+ ldr r1, [sp, 0x14]\n\
+ muls r0, r1\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ str r0, [sp, 0x14]\n\
_0803BE9A:\n\
- mov r2, r9\n\
- cmp r2, 0xD\n\
- bne _0803BEBE\n\
- movs r0, 0\n\
- str r0, [sp]\n\
- movs r0, 0xE\n\
- movs r1, 0\n\
- movs r2, 0\n\
- movs r3, 0xFD\n\
- bl sub_8018324\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0803BEBE\n\
- ldr r1, _0803BFE8 @ =gBattleMovePower\n\
- ldrh r0, [r1]\n\
- lsrs r0, 1\n\
- strh r0, [r1]\n\
+ mov r2, r9\n\
+ cmp r2, 0xD\n\
+ bne _0803BEBE\n\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+ movs r0, 0xE\n\
+ movs r1, 0\n\
+ movs r2, 0\n\
+ movs r3, 0xFD\n\
+ bl sub_8018324\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0803BEBE\n\
+ ldr r1, _0803BFE8 @ =gBattleMovePower\n\
+ ldrh r0, [r1]\n\
+ lsrs r0, 1\n\
+ strh r0, [r1]\n\
_0803BEBE:\n\
- mov r3, r9\n\
- cmp r3, 0xA\n\
- bne _0803BEE2\n\
- movs r0, 0\n\
- str r0, [sp]\n\
- movs r0, 0xE\n\
- movs r1, 0\n\
- movs r2, 0\n\
- movs r3, 0xFE\n\
- bl sub_8018324\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0803BEE2\n\
- ldr r1, _0803BFE8 @ =gBattleMovePower\n\
- ldrh r0, [r1]\n\
- lsrs r0, 1\n\
- strh r0, [r1]\n\
+ mov r3, r9\n\
+ cmp r3, 0xA\n\
+ bne _0803BEE2\n\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+ movs r0, 0xE\n\
+ movs r1, 0\n\
+ movs r2, 0\n\
+ movs r3, 0xFE\n\
+ bl sub_8018324\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0803BEE2\n\
+ ldr r1, _0803BFE8 @ =gBattleMovePower\n\
+ ldrh r0, [r1]\n\
+ lsrs r0, 1\n\
+ strh r0, [r1]\n\
_0803BEE2:\n\
- mov r0, r9\n\
- cmp r0, 0xC\n\
- bne _0803BF12\n\
- ldr r1, [sp, 0x24]\n\
- ldrb r0, [r1]\n\
- cmp r0, 0x41\n\
- bne _0803BF12\n\
- ldrh r0, [r7, 0x2C]\n\
- movs r1, 0x3\n\
- bl __udivsi3\n\
- ldrh r1, [r7, 0x28]\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r1, r0\n\
- bhi _0803BF12\n\
- ldr r4, _0803BFE8 @ =gBattleMovePower\n\
- ldrh r1, [r4]\n\
- movs r0, 0x96\n\
- muls r0, r1\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- strh r0, [r4]\n\
+ mov r0, r9\n\
+ cmp r0, 0xC\n\
+ bne _0803BF12\n\
+ ldr r1, [sp, 0x24]\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x41\n\
+ bne _0803BF12\n\
+ ldrh r0, [r7, 0x2C]\n\
+ movs r1, 0x3\n\
+ bl __udivsi3\n\
+ ldrh r1, [r7, 0x28]\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r1, r0\n\
+ bhi _0803BF12\n\
+ ldr r4, _0803BFE8 @ =gBattleMovePower\n\
+ ldrh r1, [r4]\n\
+ movs r0, 0x96\n\
+ muls r0, r1\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ strh r0, [r4]\n\
_0803BF12:\n\
- mov r2, r9\n\
- cmp r2, 0xA\n\
- bne _0803BF42\n\
- ldr r3, [sp, 0x24]\n\
- ldrb r0, [r3]\n\
- cmp r0, 0x42\n\
- bne _0803BF42\n\
- ldrh r0, [r7, 0x2C]\n\
- movs r1, 0x3\n\
- bl __udivsi3\n\
- ldrh r1, [r7, 0x28]\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r1, r0\n\
- bhi _0803BF42\n\
- ldr r4, _0803BFE8 @ =gBattleMovePower\n\
- ldrh r1, [r4]\n\
- movs r0, 0x96\n\
- muls r0, r1\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- strh r0, [r4]\n\
+ mov r2, r9\n\
+ cmp r2, 0xA\n\
+ bne _0803BF42\n\
+ ldr r3, [sp, 0x24]\n\
+ ldrb r0, [r3]\n\
+ cmp r0, 0x42\n\
+ bne _0803BF42\n\
+ ldrh r0, [r7, 0x2C]\n\
+ movs r1, 0x3\n\
+ bl __udivsi3\n\
+ ldrh r1, [r7, 0x28]\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r1, r0\n\
+ bhi _0803BF42\n\
+ ldr r4, _0803BFE8 @ =gBattleMovePower\n\
+ ldrh r1, [r4]\n\
+ movs r0, 0x96\n\
+ muls r0, r1\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ strh r0, [r4]\n\
_0803BF42:\n\
- mov r0, r9\n\
- cmp r0, 0xB\n\
- bne _0803BF72\n\
- ldr r1, [sp, 0x24]\n\
- ldrb r0, [r1]\n\
- cmp r0, 0x43\n\
- bne _0803BF72\n\
- ldrh r0, [r7, 0x2C]\n\
- movs r1, 0x3\n\
- bl __udivsi3\n\
- ldrh r1, [r7, 0x28]\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r1, r0\n\
- bhi _0803BF72\n\
- ldr r4, _0803BFE8 @ =gBattleMovePower\n\
- ldrh r1, [r4]\n\
- movs r0, 0x96\n\
- muls r0, r1\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- strh r0, [r4]\n\
+ mov r0, r9\n\
+ cmp r0, 0xB\n\
+ bne _0803BF72\n\
+ ldr r1, [sp, 0x24]\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x43\n\
+ bne _0803BF72\n\
+ ldrh r0, [r7, 0x2C]\n\
+ movs r1, 0x3\n\
+ bl __udivsi3\n\
+ ldrh r1, [r7, 0x28]\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r1, r0\n\
+ bhi _0803BF72\n\
+ ldr r4, _0803BFE8 @ =gBattleMovePower\n\
+ ldrh r1, [r4]\n\
+ movs r0, 0x96\n\
+ muls r0, r1\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ strh r0, [r4]\n\
_0803BF72:\n\
- mov r2, r9\n\
- cmp r2, 0x6\n\
- bne _0803BFA2\n\
- ldr r3, [sp, 0x24]\n\
- ldrb r0, [r3]\n\
- cmp r0, 0x44\n\
- bne _0803BFA2\n\
- ldrh r0, [r7, 0x2C]\n\
- movs r1, 0x3\n\
- bl __udivsi3\n\
- ldrh r1, [r7, 0x28]\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r1, r0\n\
- bhi _0803BFA2\n\
- ldr r4, _0803BFE8 @ =gBattleMovePower\n\
- ldrh r1, [r4]\n\
- movs r0, 0x96\n\
- muls r0, r1\n\
- movs r1, 0x64\n\
- bl __divsi3\n\
- strh r0, [r4]\n\
+ mov r2, r9\n\
+ cmp r2, 0x6\n\
+ bne _0803BFA2\n\
+ ldr r3, [sp, 0x24]\n\
+ ldrb r0, [r3]\n\
+ cmp r0, 0x44\n\
+ bne _0803BFA2\n\
+ ldrh r0, [r7, 0x2C]\n\
+ movs r1, 0x3\n\
+ bl __udivsi3\n\
+ ldrh r1, [r7, 0x28]\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r1, r0\n\
+ bhi _0803BFA2\n\
+ ldr r4, _0803BFE8 @ =gBattleMovePower\n\
+ ldrh r1, [r4]\n\
+ movs r0, 0x96\n\
+ muls r0, r1\n\
+ movs r1, 0x64\n\
+ bl __divsi3\n\
+ strh r0, [r4]\n\
_0803BFA2:\n\
- ldr r2, _0803BFEC @ =gBattleMoves\n\
- ldr r0, _0803BFF0 @ =gUnknown_02024BE6\n\
- ldrh r1, [r0]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- adds r0, r2\n\
- ldrb r0, [r0]\n\
- cmp r0, 0x7\n\
- bne _0803BFBC\n\
- ldr r0, [sp, 0x14]\n\
- lsrs r0, 1\n\
- str r0, [sp, 0x14]\n\
+ ldr r2, _0803BFEC @ =gBattleMoves\n\
+ ldr r0, _0803BFF0 @ =gUnknown_02024BE6\n\
+ ldrh r1, [r0]\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0x7\n\
+ bne _0803BFBC\n\
+ ldr r0, [sp, 0x14]\n\
+ lsrs r0, 1\n\
+ str r0, [sp, 0x14]\n\
_0803BFBC:\n\
- mov r1, r9\n\
- cmp r1, 0x8\n\
- bls _0803BFC4\n\
- b _0803C122\n\
+ mov r1, r9\n\
+ cmp r1, 0x8\n\
+ bls _0803BFC4\n\
+ b _0803C122\n\
_0803BFC4:\n\
- ldr r0, _0803BFF4 @ =gCritMultiplier\n\
- ldrb r1, [r0]\n\
- adds r4, r0, 0\n\
- cmp r1, 0x2\n\
- bne _0803C000\n\
- movs r0, 0x19\n\
- ldrsb r0, [r7, r0]\n\
- cmp r0, 0x6\n\
- ble _0803BFFC\n\
- ldr r2, _0803BFF8 @ =gStatStageRatios\n\
- b _0803C006\n\
- .align 2, 0\n\
+ ldr r0, _0803BFF4 @ =gCritMultiplier\n\
+ ldrb r1, [r0]\n\
+ adds r4, r0, 0\n\
+ cmp r1, 0x2\n\
+ bne _0803C000\n\
+ movs r0, 0x19\n\
+ ldrsb r0, [r7, r0]\n\
+ cmp r0, 0x6\n\
+ ble _0803BFFC\n\
+ ldr r2, _0803BFF8 @ =gStatStageRatios\n\
+ b _0803C006\n\
+ .align 2, 0\n\
_0803BFDC: .4byte gBattleTypeFlags\n\
_0803BFE0: .4byte 0xfffffe69\n\
_0803BFE4: .4byte 0x00000175\n\
@@ -1061,427 +1061,427 @@ _0803BFF0: .4byte gUnknown_02024BE6\n\
_0803BFF4: .4byte gCritMultiplier\n\
_0803BFF8: .4byte gStatStageRatios\n\
_0803BFFC:\n\
- adds r5, r6, 0\n\
- b _0803C01E\n\
+ adds r5, r6, 0\n\
+ b _0803C01E\n\
_0803C000:\n\
- ldr r2, _0803C050 @ =gStatStageRatios\n\
- movs r0, 0x19\n\
- ldrsb r0, [r7, r0]\n\
+ ldr r2, _0803C050 @ =gStatStageRatios\n\
+ movs r0, 0x19\n\
+ ldrsb r0, [r7, r0]\n\
_0803C006:\n\
- lsls r0, 1\n\
- adds r1, r0, r2\n\
- ldrb r1, [r1]\n\
- adds r5, r6, 0\n\
- muls r5, r1\n\
- adds r2, 0x1\n\
- adds r0, r2\n\
- ldrb r1, [r0]\n\
- adds r0, r5, 0\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
+ lsls r0, 1\n\
+ adds r1, r0, r2\n\
+ ldrb r1, [r1]\n\
+ adds r5, r6, 0\n\
+ muls r5, r1\n\
+ adds r2, 0x1\n\
+ adds r0, r2\n\
+ ldrb r1, [r0]\n\
+ adds r0, r5, 0\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
_0803C01E:\n\
- ldr r0, _0803C054 @ =gBattleMovePower\n\
- ldrh r0, [r0]\n\
- muls r5, r0\n\
- adds r0, r7, 0\n\
- adds r0, 0x2A\n\
- ldrb r0, [r0]\n\
- lsls r0, 1\n\
- movs r1, 0x5\n\
- bl __divsi3\n\
- adds r0, 0x2\n\
- muls r5, r0\n\
- ldrb r0, [r4]\n\
- cmp r0, 0x2\n\
- bne _0803C05C\n\
- ldr r2, [sp, 0x4]\n\
- movs r0, 0x1A\n\
- ldrsb r0, [r2, r0]\n\
- cmp r0, 0x5\n\
- bgt _0803C058\n\
- ldr r2, _0803C050 @ =gStatStageRatios\n\
- ldr r3, [sp, 0x4]\n\
- movs r0, 0x1A\n\
- ldrsb r0, [r3, r0]\n\
- b _0803C064\n\
- .align 2, 0\n\
+ ldr r0, _0803C054 @ =gBattleMovePower\n\
+ ldrh r0, [r0]\n\
+ muls r5, r0\n\
+ adds r0, r7, 0\n\
+ adds r0, 0x2A\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 1\n\
+ movs r1, 0x5\n\
+ bl __divsi3\n\
+ adds r0, 0x2\n\
+ muls r5, r0\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0x2\n\
+ bne _0803C05C\n\
+ ldr r2, [sp, 0x4]\n\
+ movs r0, 0x1A\n\
+ ldrsb r0, [r2, r0]\n\
+ cmp r0, 0x5\n\
+ bgt _0803C058\n\
+ ldr r2, _0803C050 @ =gStatStageRatios\n\
+ ldr r3, [sp, 0x4]\n\
+ movs r0, 0x1A\n\
+ ldrsb r0, [r3, r0]\n\
+ b _0803C064\n\
+ .align 2, 0\n\
_0803C050: .4byte gStatStageRatios\n\
_0803C054: .4byte gBattleMovePower\n\
_0803C058:\n\
- ldr r3, [sp, 0x14]\n\
- b _0803C07E\n\
+ ldr r3, [sp, 0x14]\n\
+ b _0803C07E\n\
_0803C05C:\n\
- ldr r2, _0803C0DC @ =gStatStageRatios\n\
- ldr r1, [sp, 0x4]\n\
- movs r0, 0x1A\n\
- ldrsb r0, [r1, r0]\n\
+ ldr r2, _0803C0DC @ =gStatStageRatios\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r0, 0x1A\n\
+ ldrsb r0, [r1, r0]\n\
_0803C064:\n\
- lsls r0, 1\n\
- adds r1, r0, r2\n\
- ldrb r1, [r1]\n\
- ldr r6, [sp, 0x14]\n\
- adds r3, r6, 0\n\
- muls r3, r1\n\
- adds r2, 0x1\n\
- adds r0, r2\n\
- ldrb r1, [r0]\n\
- adds r0, r3, 0\n\
- bl __divsi3\n\
- adds r3, r0, 0\n\
+ lsls r0, 1\n\
+ adds r1, r0, r2\n\
+ ldrb r1, [r1]\n\
+ ldr r6, [sp, 0x14]\n\
+ adds r3, r6, 0\n\
+ muls r3, r1\n\
+ adds r2, 0x1\n\
+ adds r0, r2\n\
+ ldrb r1, [r0]\n\
+ adds r0, r3, 0\n\
+ bl __divsi3\n\
+ adds r3, r0, 0\n\
_0803C07E:\n\
- adds r0, r5, 0\n\
- adds r1, r3, 0\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
- movs r1, 0x32\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
- ldr r0, [r7, 0x4C]\n\
- movs r1, 0x10\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803C0A8\n\
- ldr r1, [sp, 0x24]\n\
- ldrb r0, [r1]\n\
- cmp r0, 0x3E\n\
- beq _0803C0A8\n\
- lsrs r0, r5, 31\n\
- adds r0, r5, r0\n\
- asrs r5, r0, 1\n\
+ adds r0, r5, 0\n\
+ adds r1, r3, 0\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
+ movs r1, 0x32\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
+ ldr r0, [r7, 0x4C]\n\
+ movs r1, 0x10\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803C0A8\n\
+ ldr r1, [sp, 0x24]\n\
+ ldrb r0, [r1]\n\
+ cmp r0, 0x3E\n\
+ beq _0803C0A8\n\
+ lsrs r0, r5, 31\n\
+ adds r0, r5, r0\n\
+ asrs r5, r0, 1\n\
_0803C0A8:\n\
- movs r0, 0x1\n\
- ldr r2, [sp, 0xC]\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- beq _0803C0EA\n\
- ldrb r1, [r4]\n\
- cmp r1, 0x1\n\
- bne _0803C0EA\n\
- ldr r0, _0803C0E0 @ =gBattleTypeFlags\n\
- ldrh r0, [r0]\n\
- ands r1, r0\n\
- cmp r1, 0\n\
- beq _0803C0E4\n\
- movs r0, 0x2\n\
- bl sub_803C348\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x2\n\
- bne _0803C0E4\n\
- adds r0, r5, 0\n\
- movs r1, 0x3\n\
- bl __divsi3\n\
- lsls r5, r0, 1\n\
- b _0803C0EA\n\
- .align 2, 0\n\
+ movs r0, 0x1\n\
+ ldr r2, [sp, 0xC]\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _0803C0EA\n\
+ ldrb r1, [r4]\n\
+ cmp r1, 0x1\n\
+ bne _0803C0EA\n\
+ ldr r0, _0803C0E0 @ =gBattleTypeFlags\n\
+ ldrh r0, [r0]\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ beq _0803C0E4\n\
+ movs r0, 0x2\n\
+ bl sub_803C348\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x2\n\
+ bne _0803C0E4\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x3\n\
+ bl __divsi3\n\
+ lsls r5, r0, 1\n\
+ b _0803C0EA\n\
+ .align 2, 0\n\
_0803C0DC: .4byte gStatStageRatios\n\
_0803C0E0: .4byte gBattleTypeFlags\n\
_0803C0E4:\n\
- lsrs r0, r5, 31\n\
- adds r0, r5, r0\n\
- asrs r5, r0, 1\n\
+ lsrs r0, r5, 31\n\
+ adds r0, r5, r0\n\
+ asrs r5, r0, 1\n\
_0803C0EA:\n\
- ldr r0, _0803C148 @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803C11C\n\
- ldr r0, _0803C14C @ =gBattleMoves\n\
- ldr r3, [sp, 0x8]\n\
- lsls r1, r3, 1\n\
- adds r1, r3\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x6]\n\
- cmp r0, 0x8\n\
- bne _0803C11C\n\
- movs r0, 0x2\n\
- bl sub_803C348\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x2\n\
- bne _0803C11C\n\
- lsrs r0, r5, 31\n\
- adds r0, r5, r0\n\
- asrs r5, r0, 1\n\
+ ldr r0, _0803C148 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803C11C\n\
+ ldr r0, _0803C14C @ =gBattleMoves\n\
+ ldr r3, [sp, 0x8]\n\
+ lsls r1, r3, 1\n\
+ adds r1, r3\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x6]\n\
+ cmp r0, 0x8\n\
+ bne _0803C11C\n\
+ movs r0, 0x2\n\
+ bl sub_803C348\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x2\n\
+ bne _0803C11C\n\
+ lsrs r0, r5, 31\n\
+ adds r0, r5, r0\n\
+ asrs r5, r0, 1\n\
_0803C11C:\n\
- cmp r5, 0\n\
- bne _0803C122\n\
- movs r5, 0x1\n\
+ cmp r5, 0\n\
+ bne _0803C122\n\
+ movs r5, 0x1\n\
_0803C122:\n\
- mov r6, r9\n\
- cmp r6, 0x9\n\
- bne _0803C12A\n\
- movs r5, 0\n\
+ mov r6, r9\n\
+ cmp r6, 0x9\n\
+ bne _0803C12A\n\
+ movs r5, 0\n\
_0803C12A:\n\
- mov r0, r9\n\
- cmp r0, 0x9\n\
- bhi _0803C132\n\
- b _0803C330\n\
+ mov r0, r9\n\
+ cmp r0, 0x9\n\
+ bhi _0803C132\n\
+ b _0803C330\n\
_0803C132:\n\
- ldr r0, _0803C150 @ =gCritMultiplier\n\
- ldrb r1, [r0]\n\
- adds r4, r0, 0\n\
- cmp r1, 0x2\n\
- bne _0803C15C\n\
- movs r0, 0x1C\n\
- ldrsb r0, [r7, r0]\n\
- cmp r0, 0x6\n\
- ble _0803C158\n\
- ldr r2, _0803C154 @ =gStatStageRatios\n\
- b _0803C162\n\
- .align 2, 0\n\
+ ldr r0, _0803C150 @ =gCritMultiplier\n\
+ ldrb r1, [r0]\n\
+ adds r4, r0, 0\n\
+ cmp r1, 0x2\n\
+ bne _0803C15C\n\
+ movs r0, 0x1C\n\
+ ldrsb r0, [r7, r0]\n\
+ cmp r0, 0x6\n\
+ ble _0803C158\n\
+ ldr r2, _0803C154 @ =gStatStageRatios\n\
+ b _0803C162\n\
+ .align 2, 0\n\
_0803C148: .4byte gBattleTypeFlags\n\
_0803C14C: .4byte gBattleMoves\n\
_0803C150: .4byte gCritMultiplier\n\
_0803C154: .4byte gStatStageRatios\n\
_0803C158:\n\
- mov r5, r8\n\
- b _0803C17A\n\
+ mov r5, r8\n\
+ b _0803C17A\n\
_0803C15C:\n\
- ldr r2, _0803C1A8 @ =gStatStageRatios\n\
- movs r0, 0x1C\n\
- ldrsb r0, [r7, r0]\n\
+ ldr r2, _0803C1A8 @ =gStatStageRatios\n\
+ movs r0, 0x1C\n\
+ ldrsb r0, [r7, r0]\n\
_0803C162:\n\
- lsls r0, 1\n\
- adds r1, r0, r2\n\
- ldrb r1, [r1]\n\
- mov r5, r8\n\
- muls r5, r1\n\
- adds r2, 0x1\n\
- adds r0, r2\n\
- ldrb r1, [r0]\n\
- adds r0, r5, 0\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
+ lsls r0, 1\n\
+ adds r1, r0, r2\n\
+ ldrb r1, [r1]\n\
+ mov r5, r8\n\
+ muls r5, r1\n\
+ adds r2, 0x1\n\
+ adds r0, r2\n\
+ ldrb r1, [r0]\n\
+ adds r0, r5, 0\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
_0803C17A:\n\
- ldr r0, _0803C1AC @ =gBattleMovePower\n\
- ldrh r0, [r0]\n\
- muls r5, r0\n\
- adds r0, r7, 0\n\
- adds r0, 0x2A\n\
- ldrb r0, [r0]\n\
- lsls r0, 1\n\
- movs r1, 0x5\n\
- bl __divsi3\n\
- adds r0, 0x2\n\
- muls r5, r0\n\
- ldrb r0, [r4]\n\
- cmp r0, 0x2\n\
- bne _0803C1B4\n\
- ldr r1, [sp, 0x4]\n\
- movs r0, 0x1D\n\
- ldrsb r0, [r1, r0]\n\
- cmp r0, 0x5\n\
- bgt _0803C1B0\n\
- ldr r2, _0803C1A8 @ =gStatStageRatios\n\
- b _0803C1BC\n\
- .align 2, 0\n\
+ ldr r0, _0803C1AC @ =gBattleMovePower\n\
+ ldrh r0, [r0]\n\
+ muls r5, r0\n\
+ adds r0, r7, 0\n\
+ adds r0, 0x2A\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 1\n\
+ movs r1, 0x5\n\
+ bl __divsi3\n\
+ adds r0, 0x2\n\
+ muls r5, r0\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0x2\n\
+ bne _0803C1B4\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r0, 0x1D\n\
+ ldrsb r0, [r1, r0]\n\
+ cmp r0, 0x5\n\
+ bgt _0803C1B0\n\
+ ldr r2, _0803C1A8 @ =gStatStageRatios\n\
+ b _0803C1BC\n\
+ .align 2, 0\n\
_0803C1A8: .4byte gStatStageRatios\n\
_0803C1AC: .4byte gBattleMovePower\n\
_0803C1B0:\n\
- ldr r3, [sp, 0x18]\n\
- b _0803C1D6\n\
+ ldr r3, [sp, 0x18]\n\
+ b _0803C1D6\n\
_0803C1B4:\n\
- ldr r2, _0803C21C @ =gStatStageRatios\n\
- ldr r1, [sp, 0x4]\n\
- movs r0, 0x1D\n\
- ldrsb r0, [r1, r0]\n\
+ ldr r2, _0803C21C @ =gStatStageRatios\n\
+ ldr r1, [sp, 0x4]\n\
+ movs r0, 0x1D\n\
+ ldrsb r0, [r1, r0]\n\
_0803C1BC:\n\
- lsls r0, 1\n\
- adds r1, r0, r2\n\
- ldrb r1, [r1]\n\
- ldr r6, [sp, 0x18]\n\
- adds r3, r6, 0\n\
- muls r3, r1\n\
- adds r2, 0x1\n\
- adds r0, r2\n\
- ldrb r1, [r0]\n\
- adds r0, r3, 0\n\
- bl __divsi3\n\
- adds r3, r0, 0\n\
+ lsls r0, 1\n\
+ adds r1, r0, r2\n\
+ ldrb r1, [r1]\n\
+ ldr r6, [sp, 0x18]\n\
+ adds r3, r6, 0\n\
+ muls r3, r1\n\
+ adds r2, 0x1\n\
+ adds r0, r2\n\
+ ldrb r1, [r0]\n\
+ adds r0, r3, 0\n\
+ bl __divsi3\n\
+ adds r3, r0, 0\n\
_0803C1D6:\n\
- adds r0, r5, 0\n\
- adds r1, r3, 0\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
- movs r1, 0x32\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
- movs r0, 0x2\n\
- ldr r1, [sp, 0xC]\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803C22A\n\
- ldrb r1, [r4]\n\
- cmp r1, 0x1\n\
- bne _0803C22A\n\
- ldr r0, _0803C220 @ =gBattleTypeFlags\n\
- ldrh r0, [r0]\n\
- ands r1, r0\n\
- cmp r1, 0\n\
- beq _0803C224\n\
- movs r0, 0x2\n\
- bl sub_803C348\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x2\n\
- bne _0803C224\n\
- adds r0, r5, 0\n\
- movs r1, 0x3\n\
- bl __divsi3\n\
- lsls r5, r0, 1\n\
- b _0803C22A\n\
- .align 2, 0\n\
+ adds r0, r5, 0\n\
+ adds r1, r3, 0\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
+ movs r1, 0x32\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
+ movs r0, 0x2\n\
+ ldr r1, [sp, 0xC]\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803C22A\n\
+ ldrb r1, [r4]\n\
+ cmp r1, 0x1\n\
+ bne _0803C22A\n\
+ ldr r0, _0803C220 @ =gBattleTypeFlags\n\
+ ldrh r0, [r0]\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ beq _0803C224\n\
+ movs r0, 0x2\n\
+ bl sub_803C348\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x2\n\
+ bne _0803C224\n\
+ adds r0, r5, 0\n\
+ movs r1, 0x3\n\
+ bl __divsi3\n\
+ lsls r5, r0, 1\n\
+ b _0803C22A\n\
+ .align 2, 0\n\
_0803C21C: .4byte gStatStageRatios\n\
_0803C220: .4byte gBattleTypeFlags\n\
_0803C224:\n\
- lsrs r0, r5, 31\n\
- adds r0, r5, r0\n\
- asrs r5, r0, 1\n\
+ lsrs r0, r5, 31\n\
+ adds r0, r5, r0\n\
+ asrs r5, r0, 1\n\
_0803C22A:\n\
- ldr r0, _0803C2A4 @ =gBattleTypeFlags\n\
- ldrh r1, [r0]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803C25C\n\
- ldr r0, _0803C2A8 @ =gBattleMoves\n\
- ldr r2, [sp, 0x8]\n\
- lsls r1, r2, 1\n\
- adds r1, r2\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- ldrb r0, [r1, 0x6]\n\
- cmp r0, 0x8\n\
- bne _0803C25C\n\
- movs r0, 0x2\n\
- bl sub_803C348\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x2\n\
- bne _0803C25C\n\
- lsrs r0, r5, 31\n\
- adds r0, r5, r0\n\
- asrs r5, r0, 1\n\
+ ldr r0, _0803C2A4 @ =gBattleTypeFlags\n\
+ ldrh r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803C25C\n\
+ ldr r0, _0803C2A8 @ =gBattleMoves\n\
+ ldr r2, [sp, 0x8]\n\
+ lsls r1, r2, 1\n\
+ adds r1, r2\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ ldrb r0, [r1, 0x6]\n\
+ cmp r0, 0x8\n\
+ bne _0803C25C\n\
+ movs r0, 0x2\n\
+ bl sub_803C348\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x2\n\
+ bne _0803C25C\n\
+ lsrs r0, r5, 31\n\
+ adds r0, r5, r0\n\
+ asrs r5, r0, 1\n\
_0803C25C:\n\
- movs r0, 0\n\
- str r0, [sp]\n\
- movs r0, 0xE\n\
- movs r1, 0\n\
- movs r2, 0xD\n\
- movs r3, 0\n\
- bl sub_8018324\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0\n\
- bne _0803C30C\n\
- str r0, [sp]\n\
- movs r0, 0xE\n\
- movs r1, 0\n\
- movs r2, 0x4D\n\
- movs r3, 0\n\
- bl sub_8018324\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0803C30C\n\
- ldr r2, _0803C2AC @ =gBattleWeather\n\
- ldrh r1, [r2]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- adds r4, r2, 0\n\
- cmp r0, 0\n\
- beq _0803C2C4\n\
- mov r3, r9\n\
- cmp r3, 0xA\n\
- beq _0803C2B0\n\
- cmp r3, 0xB\n\
- beq _0803C2B8\n\
- b _0803C2C4\n\
- .align 2, 0\n\
+ movs r0, 0\n\
+ str r0, [sp]\n\
+ movs r0, 0xE\n\
+ movs r1, 0\n\
+ movs r2, 0xD\n\
+ movs r3, 0\n\
+ bl sub_8018324\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0\n\
+ bne _0803C30C\n\
+ str r0, [sp]\n\
+ movs r0, 0xE\n\
+ movs r1, 0\n\
+ movs r2, 0x4D\n\
+ movs r3, 0\n\
+ bl sub_8018324\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0803C30C\n\
+ ldr r2, _0803C2AC @ =gBattleWeather\n\
+ ldrh r1, [r2]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ adds r4, r2, 0\n\
+ cmp r0, 0\n\
+ beq _0803C2C4\n\
+ mov r3, r9\n\
+ cmp r3, 0xA\n\
+ beq _0803C2B0\n\
+ cmp r3, 0xB\n\
+ beq _0803C2B8\n\
+ b _0803C2C4\n\
+ .align 2, 0\n\
_0803C2A4: .4byte gBattleTypeFlags\n\
_0803C2A8: .4byte gBattleMoves\n\
_0803C2AC: .4byte gBattleWeather\n\
_0803C2B0:\n\
- lsrs r0, r5, 31\n\
- adds r0, r5, r0\n\
- asrs r5, r0, 1\n\
- b _0803C2C4\n\
+ lsrs r0, r5, 31\n\
+ adds r0, r5, r0\n\
+ asrs r5, r0, 1\n\
+ b _0803C2C4\n\
_0803C2B8:\n\
- lsls r0, r5, 4\n\
- subs r0, r5\n\
- movs r1, 0xA\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
+ lsls r0, r5, 4\n\
+ subs r0, r5\n\
+ movs r1, 0xA\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
_0803C2C4:\n\
- ldrh r1, [r4]\n\
- movs r0, 0x9F\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803C2DC\n\
- ldr r0, _0803C2F4 @ =gUnknown_02024BE6\n\
- ldrh r0, [r0]\n\
- cmp r0, 0x4C\n\
- bne _0803C2DC\n\
- lsrs r0, r5, 31\n\
- adds r0, r5, r0\n\
- asrs r5, r0, 1\n\
+ ldrh r1, [r4]\n\
+ movs r0, 0x9F\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803C2DC\n\
+ ldr r0, _0803C2F4 @ =gUnknown_02024BE6\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0x4C\n\
+ bne _0803C2DC\n\
+ lsrs r0, r5, 31\n\
+ adds r0, r5, r0\n\
+ asrs r5, r0, 1\n\
_0803C2DC:\n\
- ldrh r1, [r4]\n\
- movs r0, 0x60\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803C30C\n\
- mov r6, r9\n\
- cmp r6, 0xA\n\
- beq _0803C2F8\n\
- cmp r6, 0xB\n\
- beq _0803C306\n\
- b _0803C30C\n\
- .align 2, 0\n\
+ ldrh r1, [r4]\n\
+ movs r0, 0x60\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803C30C\n\
+ mov r6, r9\n\
+ cmp r6, 0xA\n\
+ beq _0803C2F8\n\
+ cmp r6, 0xB\n\
+ beq _0803C306\n\
+ b _0803C30C\n\
+ .align 2, 0\n\
_0803C2F4: .4byte gUnknown_02024BE6\n\
_0803C2F8:\n\
- lsls r0, r5, 4\n\
- subs r0, r5\n\
- movs r1, 0xA\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
- b _0803C30C\n\
+ lsls r0, r5, 4\n\
+ subs r0, r5\n\
+ movs r1, 0xA\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
+ b _0803C30C\n\
_0803C306:\n\
- lsrs r0, r5, 31\n\
- adds r0, r5, r0\n\
- asrs r5, r0, 1\n\
+ lsrs r0, r5, 31\n\
+ adds r0, r5, r0\n\
+ asrs r5, r0, 1\n\
_0803C30C:\n\
- ldr r1, _0803C344 @ =0x02017100\n\
- ldr r2, [sp, 0x10]\n\
- lsls r0, r2, 2\n\
- adds r0, r1\n\
- ldr r0, [r0]\n\
- movs r1, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0803C330\n\
- mov r3, r9\n\
- cmp r3, 0xA\n\
- bne _0803C330\n\
- lsls r0, r5, 4\n\
- subs r0, r5\n\
- movs r1, 0xA\n\
- bl __divsi3\n\
- adds r5, r0, 0\n\
+ ldr r1, _0803C344 @ =0x02017100\n\
+ ldr r2, [sp, 0x10]\n\
+ lsls r0, r2, 2\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ movs r1, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0803C330\n\
+ mov r3, r9\n\
+ cmp r3, 0xA\n\
+ bne _0803C330\n\
+ lsls r0, r5, 4\n\
+ subs r0, r5\n\
+ movs r1, 0xA\n\
+ bl __divsi3\n\
+ adds r5, r0, 0\n\
_0803C330:\n\
- adds r0, r5, 0x2\n\
- add sp, 0x2C\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\
+ adds r0, r5, 0x2\n\
+ add sp, 0x2C\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\
_0803C344: .4byte 0x02017100\n\
- .syntax divided");
+ .syntax divided");
}
#endif
diff --git a/src/clear_save_data_menu.c b/src/clear_save_data_menu.c
index 198dce340..6b0cc821a 100644
--- a/src/clear_save_data_menu.c
+++ b/src/clear_save_data_menu.c
@@ -1,13 +1,13 @@
#include "global.h"
#include "clear_save_data_menu.h"
-#include "save.h"
-#include "task.h"
-#include "songs.h"
-#include "menu.h"
#include "main.h"
-#include "sprite.h"
+#include "menu.h"
#include "palette.h"
+#include "save.h"
+#include "songs.h"
#include "sound.h"
+#include "sprite.h"
+#include "task.h"
extern u8 gSystemText_ClearAllSaveDataPrompt[];
extern u8 gSystemText_ClearingData[];
diff --git a/src/clock.c b/src/clock.c
index e660abdd3..fd9e6915a 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -1,11 +1,12 @@
#include "global.h"
-#include "main.h"
-#include "rtc.h"
+#include "berry.h"
#include "event_data.h"
#include "lottery_corner.h"
-#include "berry.h"
+#include "main.h"
#include "rom4.h"
+#include "rtc.h"
#include "wallclock.h"
+#include "clock.h"
extern void sub_80FA220(u16);
extern void sub_80BE8C4(u16);
diff --git a/src/coins.c b/src/coins.c
index ad4f5fc34..193ea249e 100644
--- a/src/coins.c
+++ b/src/coins.c
@@ -29,13 +29,13 @@ void PrintCoins(s32 a, u8 b, u8 c, u8 d)
u8 *ptr;
u8 r1;
u8 foo;
-
+
ConvertIntToDecimalString(string, a);
r1 = (b * 6 + 0x21 - 8 * (b + 2));
c = c - r1 / 8;
foo = r1 % 8;
ptr = gStringVar1;
- if(foo)
+ if (foo)
{
ptr[0] = 0xFC;
ptr[1] = 0x11;
@@ -58,16 +58,16 @@ u16 GetCoins(void)
bool8 GiveCoins(u16 coins)
{
u32 newCoins;
-
- if(GetCoins() >= MAX_COINS)
+
+ if (GetCoins() >= MAX_COINS)
return FALSE;
newCoins = coins + gSaveBlock1.coins;
- if(gSaveBlock1.coins > (u16)newCoins)
+ if (gSaveBlock1.coins > (u16)newCoins)
gSaveBlock1.coins = MAX_COINS;
else
{
gSaveBlock1.coins = newCoins;
- if((u16)newCoins > MAX_COINS)
+ if ((u16)newCoins > MAX_COINS)
gSaveBlock1.coins = MAX_COINS;
}
return TRUE;
@@ -75,7 +75,7 @@ bool8 GiveCoins(u16 coins)
bool8 TakeCoins(u16 coins)
{
- if(GetCoins() >= coins)
+ if (GetCoins() >= coins)
{
gSaveBlock1.coins -= coins;
return TRUE;
diff --git a/src/contest_painting.c b/src/contest_painting.c
index b6cdda034..41f6afabf 100644
--- a/src/contest_painting.c
+++ b/src/contest_painting.c
@@ -8,121 +8,131 @@
#include "sprite.h"
#include "string_util.h"
#include "text.h"
-
-#define MOSAIC_BIT_BG_HSIZE (0)
-#define MOSAIC_BIT_BG_VSIZE (4)
-#define MOSAIC_BIT_OBJ_HSIZE (8)
-#define MOSAIC_BIT_OBJ_VSIZE (12)
-
-enum
-{
- CONTEST_COOL,
- CONTEST_BEAUTY,
- CONTEST_CUTE,
- CONTEST_SMART,
- CONTEST_TOUGH,
-};
-
-enum
-{
- CONTESTRESULT_COOL = 9,
- CONTESTRESULT_BEAUTY = 13,
- CONTESTRESULT_CUTE = 2,
- CONTESTRESULT_SMART = 36,
- CONTESTRESULT_TOUGH = 6,
-};
-
-struct Unk2015E00
-{
- u16 unk2015e00[128][32];
- u16 unk2017e00[0];
-};
-
-struct ContestEntry
-{
- /*0x00*/ u8 var0;
- /*0x04*/ u32 var4;
- /*0x08*/ u16 var8;
- /*0x0A*/ u8 contestType;
- /*0x0B*/ u8 pokemon_name[POKEMON_NAME_LENGTH];
- /*0x15*/ u8 pad15;
- /*0x16*/ u8 trainer_name[OT_NAME_LENGTH];
-};
-
-struct Unk3000756
-{
- /*0x00*/ u8 var_0;
-};
-
-struct LabelPair
-{
- u8 (*prefix)[];
- u8 (*suffix)[];
-};
-
-struct Unk03005E20
-{
- u8 var_0;
- u8 pad1[3];
- u16 (*var_4)[][32];
- u16 (*var_8)[];
- u8 pad0C[4];
- u32 var_10;
- u16 var_14;
- u16 var_16;
- u8 var_18;
- u8 var_19;
- u8 var_1A;
- u8 var_1B;
- u8 var_1C;
- u8 var_1D;
- u8 var_1E;
- u8 var_1F;
-};
+#include "contest_painting.h"
extern u8 unk_2000000[];
-extern struct ContestEntry unk_2015de0;
-extern struct Unk2015E00 unk_2015e00;
extern u8 gUnknown_03000750;
extern u16 gUnknown_03000752;
extern u16 gUnknown_03000754;
-extern struct Unk3000756 gUnknown_03000756;
extern u16 (*gUnknown_03005E10)[][32];
-extern struct Unk03005E20 gUnknown_03005E20;
extern u8 gUnknown_03005E40[];
-extern struct ContestEntry *gUnknown_03005E8C;
extern u16 (*gUnknown_03005E90)[];
+extern struct ContestEntry unk_2015de0;
+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 u16 gPictureFramePalettes[];
-
-extern u8 gPictureFrameTiles_0[];
-extern u8 gPictureFrameTiles_1[];
-extern u8 gPictureFrameTiles_2[];
-extern u8 gPictureFrameTiles_3[];
-extern u8 gPictureFrameTiles_4[];
-extern u8 gPictureFrameTiles_5[];
-
-extern u8 gPictureFrameTilemap_0[];
-extern u8 gPictureFrameTilemap_1[];
-extern u8 gPictureFrameTilemap_2[];
-extern u8 gPictureFrameTilemap_3[];
-extern u8 gPictureFrameTilemap_4[];
-extern u8 gPictureFrameTilemap_5[];
-
-extern u8 *gUnknown_083F60AC[];
-extern struct LabelPair gUnknown_083F60C0[];
-extern struct OamData gOamData_83F6138;
-extern u16 gUnknown_083F6140[];
-
-extern u8 gContestText_ContestWinner[];
-extern u8 gOtherText_Unknown1[];
+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] =
+{
+ INCBIN_U16("graphics/picture_frame/bg0.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg1.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg2.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg3.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg4.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg5.gbapal"),
+ {0},
+ {0},
+};
+const u8 emptySpace[8 * 32] = {0};
+const u8 gPictureFrameTiles_0[] = INCBIN_U8("graphics/picture_frame/frame0.4bpp.rl");
+const u8 gPictureFrameTiles_1[] = INCBIN_U8("graphics/picture_frame/frame1.4bpp.rl");
+const u8 gPictureFrameTiles_2[] = INCBIN_U8("graphics/picture_frame/frame2.4bpp.rl");
+const u8 gPictureFrameTiles_3[] = INCBIN_U8("graphics/picture_frame/frame3.4bpp.rl");
+const u8 gPictureFrameTiles_4[] = INCBIN_U8("graphics/picture_frame/frame4.4bpp.rl");
+const u8 gPictureFrameTiles_5[] = INCBIN_U8("graphics/picture_frame/frame5.4bpp.rl");
+const u8 gPictureFrameTilemap_0[] = INCBIN_U8("graphics/picture_frame/frame0_map.bin.rl");
+const u8 gPictureFrameTilemap_1[] = INCBIN_U8("graphics/picture_frame/frame1_map.bin.rl");
+const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map.bin.rl");
+const u8 gPictureFrameTilemap_3[] = INCBIN_U8("graphics/picture_frame/frame3_map.bin.rl");
+const u8 gPictureFrameTilemap_4[] = INCBIN_U8("graphics/picture_frame/frame4_map.bin.rl");
+const u8 gPictureFrameTilemap_5[] = INCBIN_U8("graphics/picture_frame/frame5_map.bin.rl");
+const u8 *const gUnknown_083F60AC[] =
+{
+ OtherText_Cool,
+ OtherText_Beauty2,
+ OtherText_Cute,
+ OtherText_Smart,
+ OtherText_Tough,
+};
+const struct LabelPair gUnknown_083F60C0[] =
+{
+ {OtherText_NonstopSuperCool, OtherText_Terminator6},
+ {OtherText_GoodLookingPoke, OtherText_Terminator7},
+ {OtherText_MarvelousGreat, OtherText_Terminator8},
+ {OtherText_CenturyLastVenus, OtherText_Terminator9},
+ {OtherText_Terminator10, OtherText_DazzlingSmile},
+ {OtherText_PokeCenterIdol, OtherText_Terminator11},
+ {OtherText_LovelyAndSweet, OtherText_Terminator12},
+ {OtherText_ThePretty, OtherText_WinningPortrait},
+ {OtherText_GiveUsWink, OtherText_Terminator13},
+ {OtherText_SmartnessMaestro, OtherText_Terminator15},
+ {OtherText_ChosenPokeAmong, OtherText_Terminator15},
+ {OtherText_TheExcellent, OtherText_ItsMomentOfElegance},
+ {OtherText_PowerfullyMuscular, OtherText_Terminator16},
+ {OtherText_StrongErEst, OtherText_Terminator17},
+ {OtherText_MightyTough, OtherText_Exclamation},
+};
+const struct OamData gOamData_83F6138 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 1,
+ .bpp = 1,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+const u16 gUnknown_083F6140[] = {0, 0};
static void ShowContestPainting();
static void CB2_HoldContestPainting(void);
@@ -144,29 +154,29 @@ __attribute__((naked))
void sub_8106630(u32 arg0)
{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- ldr r2, _0810665C @ =0x02015de0\n\
- subs r4, r2, 0x2\n\
- subs r5, r2, 0x1\n\
- ldr r3, _08106660 @ =gSaveBlock1\n\
- subs r0, 0x1\n\
- lsls r1, r0, 5\n\
- adds r1, r3\n\
- ldr r3, _08106664 @ =0x00002dfc\n\
- adds r1, r3\n\
- ldm r1!, {r3,r6,r7}\n\
- stm r2!, {r3,r6,r7}\n\
- ldm r1!, {r3,r6,r7}\n\
- stm r2!, {r3,r6,r7}\n\
- ldm r1!, {r6,r7}\n\
- stm r2!, {r6,r7}\n\
- strb r0, [r4]\n\
- movs r0, 0\n\
- strb r0, [r5]\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ push {r4-r7,lr}\n\
+ ldr r2, _0810665C @ =0x02015de0\n\
+ subs r4, r2, 0x2\n\
+ subs r5, r2, 0x1\n\
+ ldr r3, _08106660 @ =gSaveBlock1\n\
+ subs r0, 0x1\n\
+ lsls r1, r0, 5\n\
+ adds r1, r3\n\
+ ldr r3, _08106664 @ =0x00002dfc\n\
+ adds r1, r3\n\
+ ldm r1!, {r3,r6,r7}\n\
+ stm r2!, {r3,r6,r7}\n\
+ ldm r1!, {r3,r6,r7}\n\
+ stm r2!, {r3,r6,r7}\n\
+ ldm r1!, {r6,r7}\n\
+ stm r2!, {r6,r7}\n\
+ strb r0, [r4]\n\
+ movs r0, 0\n\
+ strb r0, [r5]\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_0810665C: .4byte 0x02015de0\n\
_08106660: .4byte gSaveBlock1\n\
_08106664: .4byte 0x00002dfc\n\
@@ -194,7 +204,7 @@ static void ShowContestPainting(void)
{
u8 *addr;
size_t size;
-
+
ResetPaletteFade();
addr = (void *)VRAM;
size = 0x18000;
@@ -261,7 +271,7 @@ static void HoldContestPainting(void)
if ((gMain.newKeys & 1) || (gMain.newKeys & 2))
{
u8 two = 2; //needed to make the asm match
-
+
gUnknown_03000750 = two;
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
}
@@ -312,9 +322,9 @@ static void ContestPaintingPrintCaption(u8 contestType, u8 arg1)
}
else
{
- ptr = StringCopy(ptr, *gUnknown_083F60C0[type].prefix);
+ ptr = StringCopy(ptr, gUnknown_083F60C0[type].prefix);
ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name);
- ptr = StringCopy(ptr, *gUnknown_083F60C0[type].suffix);
+ ptr = StringCopy(ptr, gUnknown_083F60C0[type].suffix);
xPos = 3;
yPos = 14;
@@ -379,88 +389,93 @@ struct MonCoords
};
#ifdef NONMATCHING
-static void sub_8106AC4(u16 species, u8 arg1) {
+static void sub_8106AC4(u16 species, u8 arg1)
+{
void *pal;
// Unsure what gUnknown_03005E8C->var0 is supposed to be.
pal = species_and_otid_get_pal(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0);
LZDecompressVram(pal, gUnknown_03005E90);
- if (arg1 == 1) {
+ if (arg1 == 1)
+ {
HandleLoadSpecialPokePic(
- &gMonFrontPicTable[species],
- gMonFrontPicCoords[species].x,
- gMonFrontPicCoords[species].y,
- 0x2000000,
- gUnknown_081FAF4C[1],
- species,
- (u32) gUnknown_03005E8C->var0
+ &gMonFrontPicTable[species],
+ gMonFrontPicCoords[species].x,
+ gMonFrontPicCoords[species].y,
+ 0x2000000,
+ gUnknown_081FAF4C[1],
+ species,
+ (u32)gUnknown_03005E8C->var0
);
sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10);
- } else {
+ }
+ else
+ {
HandleLoadSpecialPokePic(
- &gMonBackPicTable[species],
- gMonBackPicCoords[species].x,
- gMonBackPicCoords[species].y,
- 0x2000000,
- gUnknown_081FAF4C[0],
- species,
- (u32) gUnknown_03005E8C->var0
+ &gMonBackPicTable[species],
+ gMonBackPicCoords[species].x,
+ gMonBackPicCoords[species].y,
+ 0x2000000,
+ gUnknown_081FAF4C[0],
+ species,
+ (u32)gUnknown_03005E8C->var0
);
sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10);
}
}
#else
__attribute__((naked))
-static void sub_8106AC4(u16 arg0, u8 arg2) {
+static void sub_8106AC4(u16 arg0, u8 arg2)
+{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- sub sp, 0xC\n\
- adds r4, r1, 0\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- lsls r4, 24\n\
- lsrs r4, 24\n\
- ldr r7, _08106B28 @ =gUnknown_03005E8C\n\
- ldr r0, [r7]\n\
- ldr r1, [r0, 0x4]\n\
- ldr r2, [r0]\n\
- adds r0, r6, 0\n\
- bl species_and_otid_get_pal\n\
- ldr r1, _08106B2C @ =gUnknown_03005E90\n\
- mov r8, r1\n\
- ldr r1, [r1]\n\
- bl LZDecompressVram\n\
- cmp r4, 0\n\
- bne _08106B40\n\
- lsls r0, r6, 3\n\
- ldr r1, _08106B30 @ =gMonFrontPicTable\n\
- adds r0, r1\n\
- ldr r1, _08106B34 @ =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, _08106B38 @ =gUnknown_081FAF4C\n\
- ldr r5, [r4, 0x4]\n\
- str r5, [sp]\n\
- str r6, [sp, 0x4]\n\
- ldr r4, [r7]\n\
- ldr r4, [r4]\n\
- str r4, [sp, 0x8]\n\
- bl HandleLoadSpecialPokePic\n\
- mov r2, r8\n\
- ldr r1, [r2]\n\
- ldr r0, _08106B3C @ =gUnknown_03005E10\n\
- ldr r2, [r0]\n\
- adds r0, r5, 0\n\
- bl sub_8106B90\n\
- b _08106B74\n\
- .align 2, 0\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ sub sp, 0xC\n\
+ adds r4, r1, 0\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ ldr r7, _08106B28 @ =gUnknown_03005E8C\n\
+ ldr r0, [r7]\n\
+ ldr r1, [r0, 0x4]\n\
+ ldr r2, [r0]\n\
+ adds r0, r6, 0\n\
+ bl species_and_otid_get_pal\n\
+ ldr r1, _08106B2C @ =gUnknown_03005E90\n\
+ mov r8, r1\n\
+ ldr r1, [r1]\n\
+ bl LZDecompressVram\n\
+ cmp r4, 0\n\
+ bne _08106B40\n\
+ lsls r0, r6, 3\n\
+ ldr r1, _08106B30 @ =gMonFrontPicTable\n\
+ adds r0, r1\n\
+ ldr r1, _08106B34 @ =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, _08106B38 @ =gUnknown_081FAF4C\n\
+ ldr r5, [r4, 0x4]\n\
+ str r5, [sp]\n\
+ str r6, [sp, 0x4]\n\
+ ldr r4, [r7]\n\
+ ldr r4, [r4]\n\
+ str r4, [sp, 0x8]\n\
+ bl HandleLoadSpecialPokePic\n\
+ mov r2, r8\n\
+ ldr r1, [r2]\n\
+ ldr r0, _08106B3C @ =gUnknown_03005E10\n\
+ ldr r2, [r0]\n\
+ adds r0, r5, 0\n\
+ bl sub_8106B90\n\
+ b _08106B74\n\
+ .align 2, 0\n\
_08106B28: .4byte gUnknown_03005E8C\n\
_08106B2C: .4byte gUnknown_03005E90\n\
_08106B30: .4byte gMonFrontPicTable\n\
@@ -468,38 +483,38 @@ _08106B34: .4byte gMonFrontPicCoords\n\
_08106B38: .4byte gUnknown_081FAF4C\n\
_08106B3C: .4byte gUnknown_03005E10\n\
_08106B40:\n\
- lsls r0, r6, 3\n\
- ldr r1, _08106B80 @ =gMonBackPicTable\n\
- adds r0, r1\n\
- ldr r1, _08106B84 @ =gMonBackPicCoords\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, _08106B88 @ =gUnknown_081FAF4C\n\
- ldr r5, [r4]\n\
- str r5, [sp]\n\
- str r6, [sp, 0x4]\n\
- ldr r4, [r7]\n\
- ldr r4, [r4]\n\
- str r4, [sp, 0x8]\n\
- bl HandleLoadSpecialPokePic\n\
- mov r0, r8\n\
- ldr r1, [r0]\n\
- ldr r0, _08106B8C @ =gUnknown_03005E10\n\
- ldr r2, [r0]\n\
- adds r0, r5, 0\n\
- bl sub_8106B90\n\
+ lsls r0, r6, 3\n\
+ ldr r1, _08106B80 @ =gMonBackPicTable\n\
+ adds r0, r1\n\
+ ldr r1, _08106B84 @ =gMonBackPicCoords\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, _08106B88 @ =gUnknown_081FAF4C\n\
+ ldr r5, [r4]\n\
+ str r5, [sp]\n\
+ str r6, [sp, 0x4]\n\
+ ldr r4, [r7]\n\
+ ldr r4, [r4]\n\
+ str r4, [sp, 0x8]\n\
+ bl HandleLoadSpecialPokePic\n\
+ mov r0, r8\n\
+ ldr r1, [r0]\n\
+ ldr r0, _08106B8C @ =gUnknown_03005E10\n\
+ ldr r2, [r0]\n\
+ adds r0, r5, 0\n\
+ bl sub_8106B90\n\
_08106B74:\n\
- add sp, 0xC\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ add sp, 0xC\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_08106B80: .4byte gMonBackPicTable\n\
_08106B84: .4byte gMonBackPicCoords\n\
_08106B88: .4byte gUnknown_081FAF4C\n\
@@ -515,7 +530,7 @@ void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8])
u16 j;
u16 k;
u16 l;
-
+
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
@@ -527,7 +542,7 @@ void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8])
//u8 *arr = a[i][j][k];
//u8 r1 = arr[l / 2];
u8 r1 = a[i][j][k][l / 2];
-
+
if (l & 1)
r1 /= 16;
else
@@ -547,102 +562,102 @@ __attribute__((naked))
void sub_8106B90()
{
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\
- mov r10, r0\n\
- mov r9, r1\n\
- str r2, [sp]\n\
- movs r0, 0\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\
+ mov r10, r0\n\
+ mov r9, r1\n\
+ str r2, [sp]\n\
+ movs r0, 0\n\
_08106BA4:\n\
- movs r3, 0\n\
- adds r1, r0, 0x1\n\
- str r1, [sp, 0x4]\n\
- lsls r0, 3\n\
- str r0, [sp, 0x8]\n\
+ movs r3, 0\n\
+ adds r1, r0, 0x1\n\
+ str r1, [sp, 0x4]\n\
+ lsls r0, 3\n\
+ str r0, [sp, 0x8]\n\
_08106BAE:\n\
- movs r1, 0\n\
- adds r2, r3, 0x1\n\
- mov r8, r2\n\
- ldr r7, [sp, 0x8]\n\
- adds r0, r7, r3\n\
- lsls r0, 5\n\
- mov r12, r0\n\
- lsls r4, r3, 3\n\
+ movs r1, 0\n\
+ adds r2, r3, 0x1\n\
+ mov r8, r2\n\
+ ldr r7, [sp, 0x8]\n\
+ adds r0, r7, r3\n\
+ lsls r0, 5\n\
+ mov r12, r0\n\
+ lsls r4, r3, 3\n\
_08106BBE:\n\
- movs r3, 0\n\
- lsls r0, r1, 2\n\
- adds r6, r1, 0x1\n\
- mov r2, r12\n\
- adds r5, r2, r0\n\
- ldr r7, [sp, 0x8]\n\
- adds r0, r7, r1\n\
- lsls r0, 7\n\
- ldr r1, [sp]\n\
- adds r2, r0, r1\n\
+ movs r3, 0\n\
+ lsls r0, r1, 2\n\
+ adds r6, r1, 0x1\n\
+ mov r2, r12\n\
+ adds r5, r2, r0\n\
+ ldr r7, [sp, 0x8]\n\
+ adds r0, r7, r1\n\
+ lsls r0, 7\n\
+ ldr r1, [sp]\n\
+ adds r2, r0, r1\n\
_08106BD2:\n\
- lsrs r0, r3, 1\n\
- adds r0, r5, r0\n\
- add r0, r10\n\
- ldrb r1, [r0]\n\
- movs r0, 0x1\n\
- ands r0, r3\n\
- cmp r0, 0\n\
- beq _08106BE6\n\
- lsrs r1, 4\n\
- b _08106BEA\n\
+ lsrs r0, r3, 1\n\
+ adds r0, r5, r0\n\
+ add r0, r10\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _08106BE6\n\
+ lsrs r1, 4\n\
+ b _08106BEA\n\
_08106BE6:\n\
- movs r0, 0xF\n\
- ands r1, r0\n\
+ movs r0, 0xF\n\
+ ands r1, r0\n\
_08106BEA:\n\
- cmp r1, 0\n\
- bne _08106BFC\n\
- adds r0, r4, r3\n\
- lsls r0, 1\n\
- adds r0, r2\n\
- movs r7, 0x80\n\
- lsls r7, 8\n\
- adds r1, r7, 0\n\
- b _08106C08\n\
+ cmp r1, 0\n\
+ bne _08106BFC\n\
+ adds r0, r4, r3\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ movs r7, 0x80\n\
+ lsls r7, 8\n\
+ adds r1, r7, 0\n\
+ b _08106C08\n\
_08106BFC:\n\
- adds r0, r4, r3\n\
- lsls r0, 1\n\
- adds r0, r2\n\
- lsls r1, 1\n\
- add r1, r9\n\
- ldrh r1, [r1]\n\
+ adds r0, r4, r3\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ lsls r1, 1\n\
+ add r1, r9\n\
+ ldrh r1, [r1]\n\
_08106C08:\n\
- strh r1, [r0]\n\
- adds r0, r3, 0x1\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- cmp r3, 0x7\n\
- bls _08106BD2\n\
- lsls r0, r6, 16\n\
- lsrs r1, r0, 16\n\
- cmp r1, 0x7\n\
- bls _08106BBE\n\
- mov r1, r8\n\
- lsls r0, r1, 16\n\
- lsrs r3, r0, 16\n\
- cmp r3, 0x7\n\
- bls _08106BAE\n\
- ldr r2, [sp, 0x4]\n\
- lsls r0, r2, 16\n\
- lsrs r0, 16\n\
- cmp r0, 0x7\n\
- bls _08106BA4\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\
+ strh r1, [r0]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ cmp r3, 0x7\n\
+ bls _08106BD2\n\
+ lsls r0, r6, 16\n\
+ lsrs r1, r0, 16\n\
+ cmp r1, 0x7\n\
+ bls _08106BBE\n\
+ mov r1, r8\n\
+ lsls r0, r1, 16\n\
+ lsrs r3, r0, 16\n\
+ cmp r3, 0x7\n\
+ bls _08106BAE\n\
+ ldr r2, [sp, 0x4]\n\
+ lsls r0, r2, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x7\n\
+ bls _08106BA4\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");
}
#endif
@@ -650,38 +665,38 @@ _08106C08:\n\
static void sub_8106C40(u8 arg0, u8 arg1)
{
u8 x, y;
-
- LoadPalette(gPictureFramePalettes, 0, 128 * 2);
+
+ LoadPalette(gPictureFramePalettes, 0, sizeof(gPictureFramePalettes));
if (arg1 == 1)
{
switch (gUnknown_03005E8C->contestType / 3)
{
case CONTEST_COOL:
- RLUnCompVram(gPictureFrameTiles_0, (void *) VRAM);
+ RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM);
RLUnCompWram(gPictureFrameTilemap_0, gUnknown_03005E10);
break;
case CONTEST_BEAUTY:
- RLUnCompVram(gPictureFrameTiles_1, (void *) VRAM);
+ RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM);
RLUnCompWram(gPictureFrameTilemap_1, gUnknown_03005E10);
break;
case CONTEST_CUTE:
- RLUnCompVram(gPictureFrameTiles_2, (void *) VRAM);
+ RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM);
RLUnCompWram(gPictureFrameTilemap_2, gUnknown_03005E10);
break;
case CONTEST_SMART:
- RLUnCompVram(gPictureFrameTiles_3, (void *) VRAM);
+ RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM);
RLUnCompWram(gPictureFrameTilemap_3, gUnknown_03005E10);
break;
case CONTEST_TOUGH:
- RLUnCompVram(gPictureFrameTiles_4, (void *) VRAM);
+ RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM);
RLUnCompWram(gPictureFrameTilemap_4, gUnknown_03005E10);
break;
}
-
- #define VRAM_PICTURE_DATA(x, y) (((u16 *)(VRAM + 0x6000))[(y) * 32 + (x)])
-
+
+#define VRAM_PICTURE_DATA(x, y) (((u16 *)(VRAM + 0x6000))[(y) * 32 + (x)])
+
// Set the background
- for (y = 0; y < 20; y++)
+ for (y = 0; y < 20; y++)
{
for (x = 0; x < 32; x++)
VRAM_PICTURE_DATA(x, y) = 0x1015;
@@ -697,37 +712,37 @@ static void sub_8106C40(u8 arg0, u8 arg1)
// Re-set the entire top row to the first top frame part
for (x = 0; x < 16; x++)
VRAM_PICTURE_DATA(x + 7, 2) = (*gUnknown_03005E10)[2][7];
-
- #undef VRAM_PICTURE_DATA
+
+#undef VRAM_PICTURE_DATA
}
else if (arg0 < 8)
{
- RLUnCompVram(gPictureFrameTiles_5, (void *) VRAM);
- RLUnCompVram(gPictureFrameTilemap_5, (void *) (VRAM + 0x6000));
+ RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_5, (void *)(VRAM + 0x6000));
}
else
{
switch (gUnknown_03005E8C->contestType / 3)
{
case CONTEST_COOL:
- RLUnCompVram(gPictureFrameTiles_0, (void *) VRAM);
- RLUnCompVram(gPictureFrameTilemap_0, (void *) (VRAM + 0x6000));
+ RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_0, (void *)(VRAM + 0x6000));
break;
case CONTEST_BEAUTY:
- RLUnCompVram(gPictureFrameTiles_1, (void *) VRAM);
- RLUnCompVram(gPictureFrameTilemap_1, (void *) (VRAM + 0x6000));
+ RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_1, (void *)(VRAM + 0x6000));
break;
case CONTEST_CUTE:
- RLUnCompVram(gPictureFrameTiles_2, (void *) VRAM);
- RLUnCompVram(gPictureFrameTilemap_2, (void *) (VRAM + 0x6000));
+ RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_2, (void *)(VRAM + 0x6000));
break;
case CONTEST_SMART:
- RLUnCompVram(gPictureFrameTiles_3, (void *) VRAM);
- RLUnCompVram(gPictureFrameTilemap_3, (void *) (VRAM + 0x6000));
+ RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_3, (void *)(VRAM + 0x6000));
break;
case CONTEST_TOUGH:
- RLUnCompVram(gPictureFrameTiles_4, (void *) VRAM);
- RLUnCompVram(gPictureFrameTilemap_4, (void *) (VRAM + 0x6000));
+ RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_4, (void *)(VRAM + 0x6000));
break;
}
}
@@ -739,14 +754,14 @@ static void sub_8106E98(u8 arg0)
#ifndef NONMATCHING
asm(""::"r"(arg0));
#endif
-
+
gMain.oamBuffer[0] = gOamData_83F6138;
gMain.oamBuffer[0].tileNum = 0;
-
+
#ifndef NONMATCHING
if (arg0) arg0 = gMain.oamBuffer[0].tileNum;
#endif
-
+
gMain.oamBuffer[0].x = 88;
gMain.oamBuffer[0].y = 24;
}
diff --git a/src/credits.c b/src/credits.c
index 665279f8e..7685a033d 100644
--- a/src/credits.c
+++ b/src/credits.c
@@ -1,15 +1,30 @@
#include "global.h"
+#include "asm.h"
+#include "decompress.h"
#include "m4a.h"
#include "main.h"
#include "menu.h"
#include "palette.h"
#include "songs.h"
#include "sound.h"
-#include "sprite.h"
-#include "task.h"
-#include "text.h"
-enum {
+asm(".set REG_BASE, 0x4000000");
+asm(".set OFFSET_REG_BLDCNT, 0x50");
+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
+{
PAGE_TITLE,
PAGE_DIRECTOR,
PAGE_ART_DIRECTOR,
@@ -71,11 +86,15 @@ enum {
#define COLOR_DARK_GREEN 0x1967
#define COLOR_LIGHT_GREEN 0x328D
-enum {
+enum
+{
TDA_0 = 0,
TDA_TASK_C_ID = 1,
+ TDA_TASK_E_ID = 2,
TDA_TASK_D_ID = 3,
TDA_4 = 4,
+ TDA_PLAYER_CYCLIST = 5,
+ TDA_RIVAL_CYCLIST = 6,
TDA_7 = 7, // Has something to do with the bike scene
TDA_11 = 11, // Gets set depending on whether the bike or the grass scene should be shown
TDA_12 = 12,
@@ -90,30 +109,45 @@ enum {
TDB_3 = 3,
TDC_0 = 0,
-
- TDD_0 = 0,
- TDD_1 = 1,
+ TDC_1 = 1,
+ TDC_2 = 2,
+ TDC_3 = 3,
+ TDC_4 = 4,
+ TDC_5 = 5,
+
+ TDD_STATE = 0,
+ TDD_TASK_A_ID = 1,
TDD_2 = 2,
-};
+ TDD_3 = 3,
-struct Unk201C000 {
- u8 pad_00[0x88];
- u16 var_88;
- u16 var_8A;
- u16 var_8C;
+ TDE_0 = 0,
+ TDE_1 = 1,
+ TDE_TASK_A_ID = 2,
};
-struct HallOfFame {
- u8 sheet0[0x800];
- u8 sheet1[0x800];
- u8 sheet2[0x800];
+struct Unk201C000
+{
+ u16 unk0[8];
+ u8 pad_10[0x78];
+ u16 unk88;
+ u16 unk8A;
+ u16 unk8C;
+ u16 unk8E;
};
-struct CreditsEntry {
+struct CreditsEntry
+{
u8 var_0;
u8 *text;
};
+extern u8 unk_2000000[];
+
+#define EWRAM_1F800 ((u16 *)(unk_2000000 + 0x1F800))
+#define HALL_OF_FAME_SHEET_0 ((u8 *)(unk_2000000 + 0x1E000))
+#define HALL_OF_FAME_SHEET_1 ((u8 *)(unk_2000000 + 0x1E800))
+#define HALL_OF_FAME_SHEET_2 ((u8 *)(unk_2000000 + 0x1F000))
+
extern struct Unk201C000 unk_201C000;
extern struct HallOfFame gHallOfFame;
@@ -121,30 +155,62 @@ extern u8 unk_201e800[0x800];
extern u8 unk_201f000[0x800];
extern u16 unk_201f800[];
+extern struct SpriteTemplate gUnknown_02024E8C;
+
extern s16 gUnknown_02039320;
extern u16 gUnknown_02039322; // TASK A
extern u8 gUnknown_02039324;
extern u8 gUnknown_02039325;
-extern u16 gUnknown_0203935C;
+extern u16 gUnknown_02039358;
+extern u16 gUnknown_0203935A;
+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 gBirchBagTilemap[];
+extern u8 gBirchGrassTilemap[];
extern u8 gBirchHelpGfx[];
-// data/credits
-extern u16 gUnknown_0840B7BC[32];
-extern u16 gUnknown_0840B7FC[32];
+// data/hall_of_fame
+extern void *gUnknown_0840B5A0[];
+
+// data/credits
+const u16 gUnknown_0840B7BC[] = INCBIN_U16("graphics/credits/palette_1.gbapal");
+const u8 gUnknown_0840B7FC[] = INCBIN_U8("graphics/credits/ampersand.4bpp");
+extern u8 gUnknown_0840B83C[];
+extern u8 gUnknown_0840B84B[];
+extern u8 gUnknown_0840B85A[];
+extern u8 gUnknown_0840B869[];
+extern u8 gUnknown_0840B878[];
extern struct CreditsEntry *gCreditsEntryPointerTable[][5];
+extern u8 gUnknown_0840CA00[][2];
extern struct SpriteSheet gUnknown_0840CAA0;
extern struct SpritePalette gUnknown_0840CAB0;
+extern const union AnimCmd *const gSpriteAnimTable_0840CA54[];
+extern const union AnimCmd *const gSpriteAnimTable_0840CA94[];
+extern struct SpriteTemplate gSpriteTemplate_840CAEC;
+
+// data/intro_credits_graphics
+extern const struct SpriteSheet gIntro2BrendanSpriteSheet;
+extern const struct SpriteSheet gIntro2MaySpriteSheet;
+extern const struct SpriteSheet gIntro2BicycleSpriteSheet;
+extern const struct SpritePalette gIntro2SpritePalettes[];
+extern const struct SpriteSheet gUnknown_08416E24;
+extern const struct SpriteSheet gUnknown_08416E34;
+
+// graphics
+extern u8 gCreditsCopyrightEnd_Gfx[];
+extern u16 gIntroCopyright_Pal[16];
static void task_a_8143B38(u8 taskIdA);
-void task_a_8143B68(u8 taskIdA);
+static void task_a_8143B68(u8 taskIdA);
static void task_a_8143BFC(u8 taskIdA);
-static void task_a_080C9BFC(u8 taskIdA);
+static void task_a_80C9BFC(u8 taskIdA);
static void task_a_8143CC0(u8 taskIdA);
static void task_a_8143D04(u8 taskIdA);
static void task_a_8143EBC(u8 taskIdA);
@@ -157,21 +223,25 @@ static void task_a_8144114(u8 taskIdA);
static void sub_8144130(void);
static void task_b_81441B8(u8 taskIdB);
static u8 sub_8144454(u8 page, u8 taskIdA);
-
-void task_d_8144514(u8 taskIdD);
-u8 sub_8144ECC(u8 data, u8 taskIdA);
-void sub_81450AC(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);
-void sub_81452D0(int, int);
+static void sub_81452D0(u16 arg0, u16 arg1);
+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 void vblank_8143948(void) {
+static void vblank_8143948(void)
+{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-static void sub_814395C(void) {
+static void sub_814395C(void)
+{
RunTasks();
AnimateSprites();
BuildOamBuffer();
@@ -200,7 +270,8 @@ static void sub_814395C(void) {
gUnknown_02039325 = 1;
}
-void sub_81439D0(void) {
+void sub_81439D0(void)
+{
u8 taskIdA;
s16 taskIdC;
u8 taskIdB;
@@ -234,7 +305,7 @@ void sub_81439D0(void) {
InitMenuWindow(&gWindowConfig_81E7208);
LoadPalette(&gUnknown_0840B7BC, 0x80, sizeof(gUnknown_0840B7BC));
- CpuCopy16(&gUnknown_0840B7FC, (void *) (VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC));
+ CpuCopy16(&gUnknown_0840B7FC, (void *)(VRAM + 0xBEE0), sizeof(gUnknown_0840B7FC));
REG_BG0VOFS = 0xFFFC;
@@ -245,7 +316,6 @@ void sub_81439D0(void) {
BeginNormalPaletteFade(-1, 0, 16, 0, 0);
-
savedIme = REG_IME;
REG_IME = 0;
REG_IE |= INTR_FLAG_VBLANK;
@@ -262,14 +332,15 @@ void sub_81439D0(void) {
sub_81458DC();
- c000->var_88 = 0;
- c000->var_8A = 0;
- c000->var_8C = 0;
+ c000->unk88 = 0;
+ c000->unk8A = 0;
+ c000->unk8C = 0;
gUnknown_02039322 = taskIdA;
}
-void task_a_8143B38(u8 taskIdA) {
+static void task_a_8143B38(u8 taskIdA)
+{
if (gPaletteFade.active)
{
return;
@@ -278,7 +349,8 @@ void task_a_8143B38(u8 taskIdA) {
gTasks[taskIdA].func = task_a_8143B68;
}
-void task_a_8143B68(u8 taskIdA) {
+static void task_a_8143B68(u8 taskIdA)
+{
u16 data11;
if (gTasks[taskIdA].data[TDA_4])
@@ -312,7 +384,8 @@ void task_a_8143B68(u8 taskIdA) {
}
}
-static void task_a_8143BFC(u8 taskIdA) {
+static void task_a_8143BFC(u8 taskIdA)
+{
if (gPaletteFade.active)
{
return;
@@ -320,10 +393,11 @@ static void task_a_8143BFC(u8 taskIdA) {
REG_DISPCNT = 0;
sub_81450AC(taskIdA);
- gTasks[taskIdA].func = task_a_080C9BFC;
+ gTasks[taskIdA].func = task_a_80C9BFC;
}
-static void task_a_080C9BFC(u8 taskIdA) {
+static void task_a_80C9BFC(u8 taskIdA)
+{
u16 backup;
SetVBlankCallback(NULL);
@@ -345,7 +419,8 @@ static void task_a_080C9BFC(u8 taskIdA) {
gTasks[taskIdA].func = task_a_8143B38;
}
-static void task_a_8143CC0(u8 taskIdA) {
+static void task_a_8143CC0(u8 taskIdA)
+{
if (gPaletteFade.active)
{
return;
@@ -356,36 +431,33 @@ static void task_a_8143CC0(u8 taskIdA) {
gTasks[taskIdA].func = task_a_8143D04;
}
-#ifdef NONMATCHING
-static void task_a_8143D04(u8 taskIdA) {
- switch (gMain.state) {
+void task_a_8143D04(u8 taskIdA)
+{
+ switch (gMain.state)
+ {
default:
- case 0: {
+ case 0:
+ {
u16 i;
ResetSpriteData();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 8;
- LZ77UnCompVram(&gBirchHelpGfx, (void *) VRAM);
- LZ77UnCompVram(&gBirchBagTilemap, (void *) (VRAM + 0x3800));
- LoadPalette(gBirchBagGrassPal + 2, 1, 31 * 2);
-
- for (i = 0; i < 0x800; i++) {
- gHallOfFame.sheet0[i] = 0x11;
- }
-
- for (i = 0; i < 0x800; i++) {
- gHallOfFame.sheet1[i] = 0x22;
- }
-
- for (i = 0; i < 0x800; i++) {
- gHallOfFame.sheet2[i] = 0x33;
- }
-
- unk_201f800[0] = 0;
- unk_201f800[1] = 0x53FF; // light yellow
- unk_201f800[2] = 0x529F; // light red
- unk_201f800[3] = 0x7E94; // light blue
+ LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM);
+ LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800));
+ LoadPalette(gBirchBagGrassPal + 1, 1, 31 * 2);
+
+ for (i = 0; i < 0x800; i++)
+ HALL_OF_FAME_SHEET_0[i] = 0x11;
+ for (i = 0; i < 0x800; i++)
+ HALL_OF_FAME_SHEET_1[i] = 0x22;
+ for (i = 0; i < 0x800; i++)
+ HALL_OF_FAME_SHEET_2[i] = 0x33;
+
+ EWRAM_1F800[0] = 0;
+ EWRAM_1F800[1] = 0x53FF; // light yellow
+ EWRAM_1F800[2] = 0x529F; // light red
+ EWRAM_1F800[3] = 0x7E94; // light blue
LoadSpriteSheet(&gUnknown_0840CAA0);
LoadSpritePalette(&gUnknown_0840CAB0);
@@ -393,11 +465,10 @@ static void task_a_8143D04(u8 taskIdA) {
gMain.state += 1;
break;
}
-
- case 1: {
+ case 1:
gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(task_d_8144514, 0);
- gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_0] = 1;
- gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_1] = taskIdA;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_STATE] = 1;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_TASK_A_ID] = taskIdA;
gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_2] = gTasks[taskIdA].data[TDA_7];
BeginNormalPaletteFade(-1, 0, 16, 0, 0);
@@ -411,210 +482,10 @@ static void task_a_8143D04(u8 taskIdA) {
gTasks[taskIdA].func = task_a_8143B38;
break;
}
- }
}
-#else
-__attribute__((naked))
-static void task_a_8143D04(u8 taskId) {
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- sub sp, 0x4\n\
- lsls r0, 24\n\
- lsrs r6, r0, 24\n\
- ldr r0, _08143DC8 @ =gMain\n\
- ldr r1, _08143DCC @ =0x0000043c\n\
- adds r1, r0\n\
- mov r8, r1\n\
- ldrb r7, [r1]\n\
- cmp r7, 0\n\
- beq _08143D24\n\
- cmp r7, 0x1\n\
- beq _08143E0C\n\
-_08143D24:\n\
- bl ResetSpriteData\n\
- bl FreeAllSpritePalettes\n\
- ldr r1, _08143DD0 @ =gReservedSpritePaletteCount\n\
- movs r0, 0x8\n\
- strb r0, [r1]\n\
- ldr r0, _08143DD4 @ =gBirchHelpGfx\n\
- movs r1, 0xC0\n\
- lsls r1, 19\n\
- bl LZ77UnCompVram\n\
- ldr r0, _08143DD8 @ =gBirchGrassTilemap\n\
- ldr r1, _08143DDC @ =0x06003800\n\
- bl LZ77UnCompVram\n\
- ldr r0, _08143DE0 @ =gBirchBagGrassPal + 2\n\
- movs r1, 0x1\n\
- movs r2, 0x3E\n\
- bl LoadPalette\n\
- movs r1, 0\n\
- ldr r4, _08143DE4 @ =0x0201e000\n\
- movs r3, 0x11\n\
- ldr r2, _08143DE8 @ =0x000007ff\n\
-_08143D56:\n\
- adds r0, r1, r4\n\
- strb r3, [r0]\n\
- adds r0, r1, 0x1\n\
- lsls r0, 16\n\
- lsrs r1, r0, 16\n\
- cmp r1, r2\n\
- bls _08143D56\n\
- movs r1, 0\n\
- ldr r2, _08143DEC @ =0x0201f800\n\
- ldr r6, _08143DF0 @ =gUnknown_0840CAA0\n\
- ldr r0, _08143DF4 @ =0xfffff000\n\
- adds r5, r2, r0\n\
- movs r4, 0x22\n\
- ldr r3, _08143DE8 @ =0x000007ff\n\
-_08143D72:\n\
- adds r0, r1, r5\n\
- strb r4, [r0]\n\
- adds r0, r1, 0x1\n\
- lsls r0, 16\n\
- lsrs r1, r0, 16\n\
- cmp r1, r3\n\
- bls _08143D72\n\
- movs r1, 0\n\
- ldr r5, _08143DF8 @ =0x0201f000\n\
- movs r4, 0x33\n\
- ldr r3, _08143DE8 @ =0x000007ff\n\
-_08143D88:\n\
- adds r0, r1, r5\n\
- strb r4, [r0]\n\
- adds r0, r1, 0x1\n\
- lsls r0, 16\n\
- lsrs r1, r0, 16\n\
- cmp r1, r3\n\
- bls _08143D88\n\
- movs r0, 0\n\
- strh r0, [r2]\n\
- ldr r1, _08143DFC @ =0x000053ff\n\
- adds r0, r1, 0\n\
- strh r0, [r2, 0x2]\n\
- ldr r1, _08143E00 @ =0x0000529f\n\
- adds r0, r1, 0\n\
- strh r0, [r2, 0x4]\n\
- ldr r1, _08143E04 @ =0x00007e94\n\
- adds r0, r1, 0\n\
- strh r0, [r2, 0x6]\n\
- adds r0, r6, 0\n\
- bl LoadSpriteSheet\n\
- ldr r0, _08143E08 @ =gUnknown_0840CAB0\n\
- bl LoadSpritePalette\n\
- ldr r1, _08143DC8 @ =gMain\n\
- ldr r2, _08143DCC @ =0x0000043c\n\
- adds r1, r2\n\
- ldrb r0, [r1]\n\
- adds r0, 0x1\n\
- strb r0, [r1]\n\
- b _08143E90\n\
- .align 2, 0\n\
-_08143DC8: .4byte gMain\n\
-_08143DCC: .4byte 0x0000043c\n\
-_08143DD0: .4byte gReservedSpritePaletteCount\n\
-_08143DD4: .4byte gBirchHelpGfx\n\
-_08143DD8: .4byte gBirchGrassTilemap\n\
-_08143DDC: .4byte 0x06003800\n\
-_08143DE0: .4byte gBirchBagGrassPal + 2\n\
-_08143DE4: .4byte 0x0201e000\n\
-_08143DE8: .4byte 0x000007ff\n\
-_08143DEC: .4byte 0x0201f800\n\
-_08143DF0: .4byte gUnknown_0840CAA0\n\
-_08143DF4: .4byte 0xfffff000\n\
-_08143DF8: .4byte 0x0201f000\n\
-_08143DFC: .4byte 0x000053ff\n\
-_08143E00: .4byte 0x0000529f\n\
-_08143E04: .4byte 0x00007e94\n\
-_08143E08: .4byte gUnknown_0840CAB0\n\
-_08143E0C:\n\
- ldr r0, _08143EA0 @ =task_d_8144514\n\
- movs r1, 0\n\
- bl CreateTask\n\
- ldr r2, _08143EA4 @ =gTasks\n\
- lsls r4, r6, 2\n\
- adds r4, r6\n\
- lsls r4, 3\n\
- adds r4, r2\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- movs r1, 0\n\
- mov r9, r1\n\
- movs r5, 0\n\
- strh r0, [r4, 0xE]\n\
- movs r0, 0xE\n\
- ldrsh r1, [r4, r0]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r0, 3\n\
- adds r0, r2\n\
- strh r7, [r0, 0x8]\n\
- movs r0, 0xE\n\
- ldrsh r1, [r4, r0]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r0, 3\n\
- adds r0, r2\n\
- strh r6, [r0, 0xA]\n\
- movs r0, 0xE\n\
- ldrsh r1, [r4, r0]\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- lsls r0, 3\n\
- adds r0, r2\n\
- ldrh r1, [r4, 0x16]\n\
- strh r1, [r0, 0xC]\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- str r5, [sp]\n\
- movs r1, 0\n\
- movs r2, 0x10\n\
- movs r3, 0\n\
- bl BeginNormalPaletteFade\n\
- ldr r0, _08143EA8 @ =REG_BG3HOFS\n\
- strh r5, [r0]\n\
- ldr r1, _08143EAC @ =REG_BG3VOFS\n\
- movs r0, 0x20\n\
- strh r0, [r1]\n\
- subs r1, 0x10\n\
- ldr r2, _08143EB0 @ =0x00000703\n\
- adds r0, r2, 0\n\
- strh r0, [r1]\n\
- subs r1, 0xE\n\
- movs r2, 0xCA\n\
- lsls r2, 5\n\
- adds r0, r2, 0\n\
- strh r0, [r1]\n\
- mov r1, r9\n\
- mov r0, r8\n\
- strb r1, [r0]\n\
- ldr r0, _08143EB4 @ =gUnknown_0203935C\n\
- strh r5, [r0]\n\
- ldr r0, _08143EB8 @ =sub_8143B38\n\
- str r0, [r4]\n\
-_08143E90:\n\
- add sp, 0x4\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\
-_08143EA0: .4byte task_d_8144514\n\
-_08143EA4: .4byte gTasks\n\
-_08143EA8: .4byte 0x4000000 + 0x1c\n\
-_08143EAC: .4byte 0x4000000 + 0x1e\n\
-_08143EB0: .4byte 0x00000703\n\
-_08143EB4: .4byte gUnknown_0203935C\n\
-_08143EB8: .4byte task_a_8143B38\n\
- .syntax divided\n");
-}
-#endif
-static void task_a_8143EBC(u8 taskIdA) {
+static void task_a_8143EBC(u8 taskIdA)
+{
if (gTasks[taskIdA].data[TDA_12])
{
gTasks[taskIdA].data[TDA_12] -= 1;
@@ -625,7 +496,8 @@ static void task_a_8143EBC(u8 taskIdA) {
gTasks[taskIdA].func = task_a_8143F04;
}
-static void task_a_8143F04(u8 taskIdA) {
+static void task_a_8143F04(u8 taskIdA)
+{
if (gPaletteFade.active)
{
return;
@@ -635,7 +507,8 @@ static void task_a_8143F04(u8 taskIdA) {
gTasks[taskIdA].func = task_a_8143F3C;
}
-static void task_a_8143F3C(u8 taskIdA) {
+static void task_a_8143F3C(u8 taskIdA)
+{
u16 backup;
sub_8144130();
@@ -657,7 +530,8 @@ static void task_a_8143F3C(u8 taskIdA) {
gTasks[taskIdA].func = task_a_8143FDC;
}
-static void task_a_8143FDC(u8 taskIdA) {
+static void task_a_8143FDC(u8 taskIdA)
+{
if (gTasks[taskIdA].data[TDA_0])
{
gTasks[taskIdA].data[TDA_0] -= 1;
@@ -668,7 +542,8 @@ static void task_a_8143FDC(u8 taskIdA) {
gTasks[taskIdA].func = task_a_8144024;
}
-static void task_a_8144024(u8 taskIdA) {
+static void task_a_8144024(u8 taskIdA)
+{
if (gPaletteFade.active)
{
return;
@@ -681,7 +556,8 @@ static void task_a_8144024(u8 taskIdA) {
gTasks[taskIdA].func = task_a_8144080;
}
-static void task_a_8144080(u8 taskIdA) {
+static void task_a_8144080(u8 taskIdA)
+{
if (gPaletteFade.active)
{
return;
@@ -716,7 +592,8 @@ static void task_a_8144080(u8 taskIdA) {
gTasks[taskIdA].data[TDA_0] -= 1;
}
-static void task_a_8144114(u8 taskIdA) {
+static void task_a_8144114(u8 taskIdA)
+{
if (gPaletteFade.active)
{
return;
@@ -725,7 +602,8 @@ static void task_a_8144114(u8 taskIdA) {
SoftReset(0xFF);
}
-static void sub_8144130(void) {
+static void sub_8144130(void)
+{
REG_DISPCNT = 0;
REG_BG3HOFS = 0;
@@ -741,12 +619,13 @@ static void sub_8144130(void) {
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);
+ DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2);
}
-static void task_b_81441B8(u8 taskIdB) {
+static void task_b_81441B8(u8 taskIdB)
+{
u16 i;
switch (gTasks[taskIdB].data[TDB_0])
@@ -788,7 +667,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);
+ 9 + i * 2, 240);
}
gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1;
@@ -834,7 +713,7 @@ static void task_b_81441B8(u8 taskIdB) {
return;
}
- if (sub_8144454((u8) gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8) gTasks[taskIdB].data[TDB_TASK_A_ID]))
+ if (sub_8144454((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID]))
{
gTasks[taskIdB].data[TDB_0] += 1;
return;
@@ -872,7 +751,8 @@ static void task_b_81441B8(u8 taskIdB) {
#define LAST_PAGE (PAGE_TEXT_EDITOR)
-static u8 sub_8144454(u8 page, u8 taskIdA) {
+static u8 sub_8144454(u8 page, u8 taskIdA)
+{
// Starts with bike + ocean + morning
if (page == PAGE_PROGRAMMERS_1)
@@ -935,3 +815,1669 @@ static u8 sub_8144454(u8 page, u8 taskIdA) {
return FALSE;
}
+
+#define UNK_DEFINE_44 (0x44)
+
+#define EWRAM_1C000 (*(struct Unk201C000 *)(unk_2000000 + 0x1C000))
+
+static void task_d_8144514(u8 taskIdD)
+{
+ struct Unk201C000 *r6 = &EWRAM_1C000;
+ u8 r2;
+
+ switch (gTasks[taskIdD].data[TDD_STATE])
+ {
+ case 0:
+ break;
+ case 1:
+ if (r6->unk8A == 0 && gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] == 0)
+ break;
+ gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] = 0;
+ 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)
+ 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)
+ {
+ r6->unk8C++;
+ gSprites[r2].data3 = 50;
+ }
+ else
+ {
+ r6->unk8C = 0;
+ gSprites[r2].data3 = 512;
+ }
+ r6->unk88++;
+ if (r6->unk8A == 2)
+ r6->unk8A = 0;
+ else
+ r6->unk8A++;
+ gTasks[taskIdD].data[TDD_3] = 50;
+ gTasks[taskIdD].data[TDD_STATE]++;
+ break;
+ case 3:
+ if (gTasks[taskIdD].data[TDD_3] != 0)
+ gTasks[taskIdD].data[TDD_3]--;
+ else
+ gTasks[taskIdD].data[TDD_STATE] = 1;
+ break;
+ }
+}
+
+__attribute__((naked))
+void task_c_8144664(u8 taskIdC)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ ldr r1, _0814468C @ =gTasks\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ movs r2, 0x8\n\
+ ldrsh r0, [r0, r2]\n\
+ adds r6, r1, 0\n\
+ cmp r0, 0x32\n\
+ bls _08144680\n\
+ b _0814492C\n\
+_08144680:\n\
+ lsls r0, 2\n\
+ ldr r1, _08144690 @ =_08144694\n\
+ adds r0, r1\n\
+ ldr r0, [r0]\n\
+ mov pc, r0\n\
+ .align 2, 0\n\
+_0814468C: .4byte gTasks\n\
+_08144690: .4byte _08144694\n\
+ .align 2, 0\n\
+_08144694:\n\
+ .4byte _08144760\n\
+ .4byte _08144784\n\
+ .4byte _081447D8\n\
+ .4byte _081447F0\n\
+ .4byte _0814482C\n\
+ .4byte _08144850\n\
+ .4byte _0814489C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _081448A8\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _081448C8\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _081448EC\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _0814492C\n\
+ .4byte _08144920\n\
+_08144760:\n\
+ lsls r4, r5, 2\n\
+ adds r4, r5\n\
+ lsls r4, 3\n\
+ adds r4, r6\n\
+ ldrh r0, [r4, 0x12]\n\
+ lsls r0, 16\n\
+ asrs r0, 17\n\
+ movs r1, 0x7F\n\
+ ands r0, r1\n\
+ movs r1, 0xC\n\
+ bl Sin\n\
+ ldr r1, _08144780 @ =gUnknown_0203935A\n\
+ strh r0, [r1]\n\
+ b _081447A8\n\
+ .align 2, 0\n\
+_08144780: .4byte gUnknown_0203935A\n\
+_08144784:\n\
+ ldr r7, _081447B0 @ =gUnknown_0203935A\n\
+ movs r3, 0\n\
+ ldrsh r4, [r7, r3]\n\
+ cmp r4, 0\n\
+ beq _081447B4\n\
+ lsls r4, r5, 2\n\
+ adds r4, r5\n\
+ lsls r4, 3\n\
+ adds r4, r6\n\
+ ldrh r0, [r4, 0x12]\n\
+ lsls r0, 16\n\
+ asrs r0, 17\n\
+ movs r1, 0x7F\n\
+ ands r0, r1\n\
+ movs r1, 0xC\n\
+ bl Sin\n\
+ strh r0, [r7]\n\
+_081447A8:\n\
+ ldrh r0, [r4, 0x12]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x12]\n\
+ b _0814492C\n\
+ .align 2, 0\n\
+_081447B0: .4byte gUnknown_0203935A\n\
+_081447B4:\n\
+ ldr r3, _081447D4 @ =gSprites\n\
+ lsls r1, r5, 2\n\
+ adds r1, r5\n\
+ lsls r1, 3\n\
+ adds r1, r6\n\
+ movs r0, 0xC\n\
+ ldrsh r2, [r1, r0]\n\
+ lsls r0, r2, 4\n\
+ adds r0, r2\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ movs r2, 0x2\n\
+ strh r2, [r0, 0x2E]\n\
+ strh r4, [r1, 0x12]\n\
+ b _08144848\n\
+ .align 2, 0\n\
+_081447D4: .4byte gSprites\n\
+_081447D8:\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r1, r0, r6\n\
+ ldrh r2, [r1, 0x12]\n\
+ movs r3, 0x12\n\
+ ldrsh r0, [r1, r3]\n\
+ cmp r0, 0x3F\n\
+ bgt _08144848\n\
+ adds r0, r2, 0x1\n\
+ strh r0, [r1, 0x12]\n\
+ b _08144866\n\
+_081447F0:\n\
+ ldr r3, _08144828 @ =gSprites\n\
+ lsls r2, r5, 2\n\
+ adds r2, r5\n\
+ lsls r2, 3\n\
+ adds r2, r6\n\
+ movs r0, 0xC\n\
+ ldrsh r1, [r2, r0]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ movs r1, 0x3\n\
+ strh r1, [r0, 0x2E]\n\
+ movs r0, 0xE\n\
+ ldrsh r1, [r2, r0]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ movs r1, 0x1\n\
+ strh r1, [r0, 0x2E]\n\
+ movs r0, 0x78\n\
+ strh r0, [r2, 0x10]\n\
+ ldrh r0, [r2, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2, 0x8]\n\
+ b _0814492C\n\
+ .align 2, 0\n\
+_08144828: .4byte gSprites\n\
+_0814482C:\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r1, r0, r6\n\
+ ldrh r2, [r1, 0x10]\n\
+ movs r3, 0x10\n\
+ ldrsh r0, [r1, r3]\n\
+ cmp r0, 0\n\
+ beq _08144844\n\
+ subs r0, r2, 0x1\n\
+ strh r0, [r1, 0x10]\n\
+ b _0814492C\n\
+_08144844:\n\
+ movs r0, 0x40\n\
+ strh r0, [r1, 0x12]\n\
+_08144848:\n\
+ ldrh r0, [r1, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r1, 0x8]\n\
+ b _0814492C\n\
+_08144850:\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r4, r0, r6\n\
+ ldrh r1, [r4, 0x12]\n\
+ movs r2, 0x12\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0\n\
+ ble _0814487C\n\
+ subs r0, r1, 0x1\n\
+ strh r0, [r4, 0x12]\n\
+_08144866:\n\
+ movs r1, 0x7F\n\
+ ands r0, r1\n\
+ movs r1, 0x14\n\
+ bl Sin\n\
+ ldr r1, _08144878 @ =gUnknown_0203935A\n\
+ strh r0, [r1]\n\
+ b _0814492C\n\
+ .align 2, 0\n\
+_08144878: .4byte gUnknown_0203935A\n\
+_0814487C:\n\
+ ldr r2, _08144898 @ =gSprites\n\
+ movs r3, 0xC\n\
+ ldrsh r1, [r4, r3]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r2\n\
+ movs r1, 0x1\n\
+ strh r1, [r0, 0x2E]\n\
+ ldrh r0, [r4, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x8]\n\
+ b _0814492C\n\
+ .align 2, 0\n\
+_08144898: .4byte gSprites\n\
+_0814489C:\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r0, r6\n\
+ movs r1, 0x32\n\
+ b _0814492A\n\
+_081448A8:\n\
+ ldr r3, _081448C4 @ =gSprites\n\
+ lsls r1, r5, 2\n\
+ adds r1, r5\n\
+ lsls r1, 3\n\
+ adds r1, r6\n\
+ movs r0, 0xE\n\
+ ldrsh r2, [r1, r0]\n\
+ lsls r0, r2, 4\n\
+ adds r0, r2\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ movs r2, 0x2\n\
+ b _081448E0\n\
+ .align 2, 0\n\
+_081448C4: .4byte gSprites\n\
+_081448C8:\n\
+ ldr r3, _081448E8 @ =gSprites\n\
+ lsls r1, r5, 2\n\
+ adds r1, r5\n\
+ lsls r1, 3\n\
+ adds r1, r6\n\
+ movs r0, 0xC\n\
+ ldrsh r2, [r1, r0]\n\
+ lsls r0, r2, 4\n\
+ adds r0, r2\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ movs r2, 0x4\n\
+_081448E0:\n\
+ strh r2, [r0, 0x2E]\n\
+ movs r0, 0x32\n\
+ strh r0, [r1, 0x8]\n\
+ b _0814492C\n\
+ .align 2, 0\n\
+_081448E8: .4byte gSprites\n\
+_081448EC:\n\
+ ldr r3, _0814491C @ =gSprites\n\
+ lsls r2, r5, 2\n\
+ adds r2, r5\n\
+ lsls r2, 3\n\
+ adds r2, r6\n\
+ movs r0, 0xC\n\
+ ldrsh r1, [r2, r0]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ movs r1, 0x5\n\
+ strh r1, [r0, 0x2E]\n\
+ movs r0, 0xE\n\
+ ldrsh r1, [r2, r0]\n\
+ lsls r0, r1, 4\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ movs r1, 0x3\n\
+ strh r1, [r0, 0x2E]\n\
+ movs r0, 0x32\n\
+ strh r0, [r2, 0x8]\n\
+ b _0814492C\n\
+ .align 2, 0\n\
+_0814491C: .4byte gSprites\n\
+_08144920:\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ adds r0, r6\n\
+ movs r1, 0\n\
+_0814492A:\n\
+ strh r1, [r0, 0x8]\n\
+_0814492C:\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
+}
+
+#define UNK_DEF_1F3 (499)
+
+void task_e_8144934(u8 taskIdE)
+{
+ s16 taskIdC;
+
+ switch (gTasks[taskIdE].data[TDE_0])
+ {
+ default:
+ case 0:
+ if (gTasks[taskIdE].data[TDE_1] != 0x7FFF)
+ {
+
+ if (gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_B_ID]].data[TDB_CURRENT_PAGE] == PAGE_ART_DIRECTOR)
+ {
+ gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 20;
+ gTasks[taskIdE].data[TDE_1] = 0x7FFF;
+ }
+ }
+
+ sub_8149020(0);
+ break;
+
+ case 1:
+ sub_8149020(0);
+ break;
+
+ case 2:
+ if (gTasks[taskIdE].data[TDE_1] != 0x7FFF)
+ {
+ taskIdC = gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID];
+
+ // Floor to multiple of 128
+ if ((gTasks[taskIdC].data[TDC_5] & -128) == 640)
+ {
+ gTasks[taskIdC].data[TDC_0] = 1;
+ gTasks[taskIdE].data[TDE_1] = 0x7FFF;
+ }
+ }
+ sub_8149020(1);
+ break;
+
+ case 3:
+ if (gTasks[taskIdE].data[TDE_1] != 0x7FFF)
+ {
+
+ if (gTasks[taskIdE].data[TDE_1] == UNK_DEF_1F3)
+ {
+ gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 10;
+ gTasks[taskIdE].data[TDE_1] = 0x7FFF;
+ }
+ else
+ {
+ gTasks[taskIdE].data[TDE_1] += 1;
+ }
+ }
+
+ sub_8149020(1);
+ break;
+
+ case 4:
+ sub_8149020(2);
+ break;
+ }
+}
+
+#define UNK_DEFINE_45 (0x45)
+
+static void sub_8144A68(u8 data, u8 taskIdA)
+{
+ switch (data)
+ {
+ case 0:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 272;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8);
+ break;
+
+ case 1:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(0, 0x2000, 0x20, 8);
+ break;
+
+ case 2:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8);
+ break;
+
+ case 3:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = -32;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(1, 0x2000, 0x200, 8);
+ break;
+
+ case 4:
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = 0;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 88;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 152;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46;
+ gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data0 = 0;
+ gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data0 = 0;
+ gTasks[taskIdA].data[TDA_0] = sub_8148EC0(2, 0x2000, 0x200, 8);
+ break;
+ }
+
+ gTasks[taskIdA].data[TDA_TASK_E_ID] = CreateTask(task_e_8144934, 0);
+ gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_0] = data;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_1] = 0;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_TASK_A_ID] = taskIdA;
+
+ gTasks[taskIdA].data[TDA_TASK_C_ID] = CreateTask(task_c_8144664, 0);
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_0] = 0;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_1] = taskIdA;
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_2] = gTasks[taskIdA].data[TDA_PLAYER_CYCLIST];
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_3] = gTasks[taskIdA].data[TDA_RIVAL_CYCLIST];
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_4] = 0;
+
+ if (data == 2)
+ {
+ gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_5] = UNK_DEFINE_45;
+ }
+}
+
+static bool8 sub_8144ECC(u8 data, u8 taskIdA)
+{
+ u8 spriteId;
+
+ switch (gMain.state)
+ {
+ default:
+ case 0:
+ REG_DISPCNT = 0;
+ REG_BG3HOFS = 8;
+ REG_BG3VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ gMain.state = 1;
+ break;
+
+ case 1:
+ gUnknown_02039358 = 34;
+ gUnknown_0203935A = 0;
+ sub_8148CB0(data);
+ gMain.state += 1;
+ break;
+
+ case 2:
+ if (gSaveBlock2.playerGender == MALE)
+ {
+ LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet);
+ LoadCompressedObjectPic(&gUnknown_08416E34);
+ LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet);
+ LoadSpritePalettes(gIntro2SpritePalettes);
+
+ spriteId = intro_create_brendan_sprite(120, 46);
+ gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = spritecb_player_8145378;
+ gSprites[spriteId].anims = gSpriteAnimTable_0840CA54;
+
+ spriteId = intro_create_may_sprite(272, 46);
+ gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = spritecb_rival_8145420;
+ gSprites[spriteId].anims = gSpriteAnimTable_0840CA94;
+ }
+ else
+ {
+ LoadCompressedObjectPic(&gIntro2MaySpriteSheet);
+ LoadCompressedObjectPic(&gUnknown_08416E24);
+ LoadCompressedObjectPic(&gIntro2BicycleSpriteSheet);
+ LoadSpritePalettes(gIntro2SpritePalettes);
+
+ spriteId = intro_create_may_sprite(120, 46);
+ gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = spritecb_player_8145378;
+ gSprites[spriteId].anims = gSpriteAnimTable_0840CA54;
+
+ spriteId = intro_create_brendan_sprite(272, 46);
+ gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId;
+ gSprites[spriteId].callback = spritecb_rival_8145420;
+ gSprites[spriteId].anims = gSpriteAnimTable_0840CA94;
+ };
+
+ gMain.state += 1;
+ break;
+
+ case 3:
+ sub_8144A68(data, taskIdA);
+ sub_8148E90(data);
+ gMain.state = 0;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void sub_81450AC(u8 taskIdA)
+{
+ if (gTasks[taskIdA].data[TDA_0] != 0)
+ {
+ DestroyTask(gTasks[taskIdA].data[TDA_0]);
+ gTasks[taskIdA].data[TDA_0] = 0;
+ }
+
+ if (gTasks[taskIdA].data[TDA_TASK_C_ID] != 0)
+ {
+ DestroyTask(gTasks[taskIdA].data[TDA_TASK_C_ID]);
+ gTasks[taskIdA].data[TDA_TASK_C_ID] = 0;
+ }
+
+ if (gTasks[taskIdA].data[TDA_TASK_E_ID] != 0)
+ {
+ DestroyTask(gTasks[taskIdA].data[TDA_TASK_E_ID]);
+ gTasks[taskIdA].data[TDA_TASK_E_ID] = 0;
+ }
+
+ if (gTasks[taskIdA].data[TDA_TASK_D_ID] != 0)
+ {
+ DestroyTask(gTasks[taskIdA].data[TDA_TASK_D_ID]);
+ gTasks[taskIdA].data[TDA_TASK_D_ID] = 0;
+ }
+
+ 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");
+}
+
+u16 sub_8145208(u8 arg0)
+{
+
+ u16 out = (arg0 & 0x3F) + 80;
+
+ if (arg0 == 0xFF)
+ {
+ return 1;
+ }
+
+ if (arg0 & (1 << 7))
+ {
+ out |= 0x800;
+ }
+
+ if (arg0 & (1 << 6))
+ {
+ out |= 0x400;
+ }
+
+ 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");
+}
+
+static void sub_81452D0(u16 arg0, u16 arg1)
+{
+ 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);
+}
+
+static void spritecb_player_8145378(struct Sprite *sprite)
+{
+ if (gUnknown_0203935C != 0)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ switch (sprite->data0)
+ {
+ case 0:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ break;
+
+ case 1:
+ StartSpriteAnimIfDifferent(sprite, 1);
+ if (sprite->pos1.x > -32)
+ {
+ sprite->pos1.x -= 1;
+ }
+ break;
+
+ case 2:
+ StartSpriteAnimIfDifferent(sprite, 2);
+ break;
+
+ case 3:
+ StartSpriteAnimIfDifferent(sprite, 3);
+ break;
+
+ case 4:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if (sprite->pos1.x > 120)
+ {
+ sprite->pos1.x -= 1;
+ }
+ break;
+
+ case 5:
+ StartSpriteAnimIfDifferent(sprite, 0);
+ if (sprite->pos1.x > -32)
+ {
+ sprite->pos1.x -= 1;
+ }
+ break;
+ }
+}
+
+static void spritecb_rival_8145420(struct Sprite *sprite)
+{
+ if (gUnknown_0203935C != 0)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ switch (sprite->data0)
+ {
+ case 0:
+ sprite->pos2.y = 0;
+ StartSpriteAnimIfDifferent(sprite, 0);
+ break;
+
+ case 1:
+ if (sprite->pos1.x > 200)
+ {
+ StartSpriteAnimIfDifferent(sprite, 1);
+ }
+ else
+ {
+ StartSpriteAnimIfDifferent(sprite, 2);
+ }
+
+ if (sprite->pos1.x > -32)
+ {
+ sprite->pos1.x -= 2;
+ }
+
+ sprite->pos2.y = -gUnknown_0203935A;
+ break;
+
+ case 2:
+ sprite->data7 += 1;
+ StartSpriteAnimIfDifferent(sprite, 0);
+
+ if ((sprite->data7 & 3) == 0)
+ {
+ sprite->pos1.x += 1;
+ }
+ break;
+
+ case 3:
+ StartSpriteAnimIfDifferent(sprite, 0);
+
+ if (sprite->pos1.x > -32)
+ {
+ sprite->pos1.x -= 1;
+ }
+ break;
+
+
+ }
+}
+
+__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");
+}
+
+#ifdef NONMATCHING
+u8 sub_81456B4(u16 nationalNum, u16 x, u16 y, u16 arg3)
+{
+ u32 species;
+ u32 personality;
+ void *palette;
+ u8 spriteId;
+ u8 spriteId2;
+
+ species = NationalPokedexNumToSpecies(nationalNum);
+ switch (species)
+ {
+ case SPECIES_UNOWN:
+ personality = gSaveBlock2.pokedex.unownPersonality;
+ break;
+
+ case SPECIES_SPINDA:
+ personality = gSaveBlock2.pokedex.spindaPersonality;
+ break;
+
+ default:
+ personality = 0;
+ break;
+ }
+
+ LoadSpecialPokePic(
+ &gMonFrontPicTable[species],
+ gMonFrontPicCoords[species].x,
+ gMonFrontPicCoords[species].y,
+ 0x2000000,
+ gUnknown_0840B5A0[arg3],
+ species,
+ personality,
+ 1
+ );
+
+ palette = species_and_otid_get_pal(species, 0, 0xFFFF);
+ LoadCompressedPalette(palette, 0x100 + (arg3 * 16), 0x20);
+ sub_8143648(arg3, arg3);
+
+ spriteId = CreateSprite(&gUnknown_02024E8C, x, y, 0);
+ gSprites[spriteId].oam.paletteNum = arg3;
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].data1 = arg3 + 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);
+
+ 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)
+{
+ if (gSprites[sprite->data0].data0 == 10 || gUnknown_0203935C)
+ {
+ DestroySprite(sprite);
+ return;
+ }
+
+ sprite->invisible = gSprites[sprite->data0].invisible;
+ sprite->oam.objMode = gSprites[sprite->data0].oam.objMode;
+ sprite->oam.affineMode = gSprites[sprite->data0].oam.affineMode;
+ sprite->oam.matrixNum = gSprites[sprite->data0].oam.matrixNum;
+ sprite->pos1.x = gSprites[sprite->data0].pos1.x;
+ 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 sub_8090D90\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");
+}
diff --git a/src/daycare.c b/src/daycare.c
index 23f0305d8..1729efb2a 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -4,30 +4,28 @@
u8 *pokemon_get_nick(struct Pokemon *mon, u8 *dest)
{
- s8 nickname[POKEMON_NAME_LENGTH * 2];
+ s8 nickname[POKEMON_NAME_LENGTH * 2];
- GetMonData(mon, MON_DATA_NICKNAME, nickname);
- return StringCopy10(dest, nickname);
+ GetMonData(mon, MON_DATA_NICKNAME, nickname);
+ return StringCopy10(dest, nickname);
}
u8 *pokemon_get_nick_(struct BoxPokemon *mon, u8 *dest)
{
- s8 nickname[POKEMON_NAME_LENGTH * 2];
+ s8 nickname[POKEMON_NAME_LENGTH * 2];
- GetBoxMonData(mon, MON_DATA_NICKNAME, nickname);
- return StringCopy10(dest, nickname);
+ GetBoxMonData(mon, MON_DATA_NICKNAME, nickname);
+ return StringCopy10(dest, nickname);
}
u8 daycare_count_pokemon(struct BoxPokemon *daycare_data)
{
- u8 i, count;
- count = 0;
+ u8 i, count;
+ count = 0;
- for(i = 0;i <= 1;i++) {
- if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0) {
- count++;
- }
- }
+ for (i = 0; i <= 1; i++)
+ if (GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0)
+ count++;
- return count;
+ return count;
}
diff --git a/src/decompress.c b/src/decompress.c
index 8f573fecb..fb91ebd67 100644
--- a/src/decompress.c
+++ b/src/decompress.c
@@ -1,7 +1,8 @@
#include "global.h"
#include "decompress.h"
-#include "species.h"
#include "asm.h"
+#include "species.h"
+#include "text.h"
#define WRAM 0x02000000
@@ -22,7 +23,7 @@ void LZDecompressVram(const void *src, void *dest)
void LoadCompressedObjectPic(const struct SpriteSheet *a)
{
struct SpriteSheet spriteSheet;
-
+
LZ77UnCompWram(a->data, (void *)WRAM);
spriteSheet.data = (void *)WRAM;
spriteSheet.size = a->size;
@@ -33,7 +34,7 @@ void LoadCompressedObjectPic(const struct SpriteSheet *a)
void LoadCompressedObjectPicOverrideBuffer(const struct SpriteSheet *a, void *buffer)
{
struct SpriteSheet spriteSheet;
-
+
LZ77UnCompWram(a->data, buffer);
spriteSheet.data = buffer;
spriteSheet.size = a->size;
@@ -44,7 +45,7 @@ void LoadCompressedObjectPicOverrideBuffer(const struct SpriteSheet *a, void *bu
void LoadCompressedObjectPalette(const struct SpritePalette *a)
{
struct SpritePalette spritePalette;
-
+
LZ77UnCompWram(a->data, (void *)WRAM);
spritePalette.data = (void *)WRAM;
spritePalette.tag = a->tag;
@@ -54,7 +55,7 @@ void LoadCompressedObjectPalette(const struct SpritePalette *a)
void LoadCompressedObjectPaletteOverrideBuffer(const struct SpritePalette *a, void *buffer)
{
struct SpritePalette spritePalette;
-
+
LZ77UnCompWram(a->data, buffer);
spritePalette.data = buffer;
spritePalette.tag = a->tag;
@@ -72,8 +73,8 @@ void DecompressPicFromTable_2(const struct SpriteSheet *a, u8 b, u8 c, void *d,
void HandleLoadSpecialPokePic(const struct SpriteSheet *spriteSheet, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g)
{
u32 frontOrBack;
-
- // gUnknown_081FAF4C appears to be a list of pointers to locations to store poke pics for back and front pic here. the first and third pointers are used for back while the others are used for front.
+
+ // gUnknown_081FAF4C appears to be a list of pointers to locations to store poke pics for back and front pic here. the first and third pointers are used for back while the others are used for front.
if (dest == gUnknown_081FAF4C[0] || dest == gUnknown_081FAF4C[2])
frontOrBack = 0; // backPic
else
@@ -85,12 +86,12 @@ void HandleLoadSpecialPokePic(const struct SpriteSheet *spriteSheet, u32 b, u32
void LoadSpecialPokePic(const struct SpriteSheet *spriteSheet, u32 b, u32 c, u32 d, void *dest, s32 species, u32 g, u32 frontOrBack)
{
u8 frontOrBack8 = frontOrBack;
-
+
if (species == SPECIES_UNOWN)
{
u16 i = (((g & 0x3000000) >> 18) | ((g & 0x30000) >> 12) | ((g & 0x300) >> 6) | (g & 3)) % 0x1C;
-
- // if it is Unown A, set the index to where Unown begins, otherwise add the egg index to get the correct letter to load.
+
+ // if it is Unown A, set the index to where Unown begins, otherwise add the egg index to get the correct letter to load.
if (i == 0)
i = SPECIES_UNOWN;
else
diff --git a/src/decoration.c b/src/decoration.c
index cf137799a..279a7568b 100644
--- a/src/decoration.c
+++ b/src/decoration.c
@@ -12,14 +12,15 @@ void sub_80FEC94(u8 arg0);
void sub_80FECB8(u8 arg0);
void sub_80FECE0(u8 arg0);
-void sub_80FE7EC(u8 arg0) {
+void sub_80FE7EC(u8 arg0)
+{
sub_8072DEC();
MenuZeroFillWindowRect(0, 0, 29, 19);
sub_80FEC94(arg0);
sub_80FECB8(gUnknown_020388F6);
- MenuDrawTextWindow(15, 12, 29, 19);
+ MenuDrawTextWindow(15, 12, 29, 19);
sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4);
InitMenu(0, 1, 2, gUnknown_020388F3 + 1, gUnknown_020388F2, 13);
diff --git a/src/dewford_trend.c b/src/dewford_trend.c
index d534a9990..b2a8e81da 100644
--- a/src/dewford_trend.c
+++ b/src/dewford_trend.c
@@ -1,23 +1,32 @@
#include "global.h"
#include "asm.h"
+#include "event_data.h"
#include "link.h"
#include "rng.h"
-#include "event_data.h"
+#include "text.h"
+#include "dewford_trend.h"
+
+extern u8 unk_2000000[];
-extern struct EasyChatPair unk_2007800[5];
-extern struct EasyChatPair unk_2007900[5];
extern u16 gScriptResult;
extern u16 gSpecialVar_0x8004;
+static void sub_80FA46C(struct EasyChatPair *s, u16 b, u8 c);
+static bool8 sub_80FA670(struct EasyChatPair *a, struct EasyChatPair *b, u8 c);
+static void sub_80FA740(struct EasyChatPair *s);
+static bool8 SB1ContainsWords(u16 *a);
+static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2);
+static s16 sub_80FA828(struct EasyChatPair *a, u16 b);
+
void sub_80FA17C(void)
{
u16 i;
- for(i = 0; i < 5; i++)
+ for (i = 0; i < 5; i++)
{
gSaveBlock1.easyChatPairs[i].words[0] = sub_80EB72C(10);
- if(Random() & 1)
+ if (Random() & 1)
gSaveBlock1.easyChatPairs[i].words[1] = sub_80EB72C(12);
else
gSaveBlock1.easyChatPairs[i].words[1] = sub_80EB72C(13);
@@ -35,22 +44,22 @@ void sub_80FA220(u16 a)
u32 sp0;
u32 sp4;
- if(a != 0)
+ if (a != 0)
{
sp0 = a * 5;
- for(i = 0; i < 5; i++)
+ for (i = 0; i < 5; i++)
{
//_080FA24A
u32 r2 = sp0;
u32 r4;
- if(gSaveBlock1.easyChatPairs[i].unk1_6 == 0)
+ if (gSaveBlock1.easyChatPairs[i].unk1_6 == 0)
{
- if(gSaveBlock1.easyChatPairs[i].unk0_0 >= r2)
+ if (gSaveBlock1.easyChatPairs[i].unk0_0 >= r2)
{
gSaveBlock1.easyChatPairs[i].unk0_0 -= r2;
- if(gSaveBlock1.easyChatPairs[i].unk0_0 == 0)
+ if (gSaveBlock1.easyChatPairs[i].unk0_0 == 0)
gSaveBlock1.easyChatPairs[i].unk1_6 = 1;
continue;
}
@@ -60,18 +69,18 @@ void sub_80FA220(u16 a)
}
//_080FA2A0
r4 = gSaveBlock1.easyChatPairs[i].unk0_0 + r2;
- if(r4 > gSaveBlock1.easyChatPairs[i].unk0_7)
+ if (r4 > gSaveBlock1.easyChatPairs[i].unk0_7)
{
sp4 = r4 % gSaveBlock1.easyChatPairs[i].unk0_7;
r4 = r4 / gSaveBlock1.easyChatPairs[i].unk0_7;
- if(r4 == 0)
+ if (r4 == 0)
gSaveBlock1.easyChatPairs[i].unk1_6 = 1;
else
gSaveBlock1.easyChatPairs[i].unk1_6 = 0;
- if(gSaveBlock1.easyChatPairs[i].unk1_6)
+ if (gSaveBlock1.easyChatPairs[i].unk1_6)
{
gSaveBlock1.easyChatPairs[i].unk0_0 += sp4;
continue;
@@ -83,7 +92,7 @@ void sub_80FA220(u16 a)
//_080FA310
gSaveBlock1.easyChatPairs[i].unk0_0 = r4;
- if(gSaveBlock1.easyChatPairs[i].unk0_0 == gSaveBlock1.easyChatPairs[i].unk0_7)
+ if (gSaveBlock1.easyChatPairs[i].unk0_0 == gSaveBlock1.easyChatPairs[i].unk0_7)
gSaveBlock1.easyChatPairs[i].unk1_6 = 0;
}
sub_80FA46C(gSaveBlock1.easyChatPairs, 5, 0);
@@ -96,173 +105,173 @@ __attribute__((naked))
void sub_80FA220(u16 a)
{
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, 0x8\n\
- lsls r0, 16\n\
- lsrs r1, r0, 16\n\
- cmp r1, 0\n\
- bne _080FA236\n\
- b _080FA34E\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x8\n\
+ lsls r0, 16\n\
+ lsrs r1, r0, 16\n\
+ cmp r1, 0\n\
+ bne _080FA236\n\
+ b _080FA34E\n\
_080FA236:\n\
- lsls r0, r1, 2\n\
- adds r0, r1\n\
- str r0, [sp]\n\
- movs r0, 0\n\
- mov r10, r0\n\
- movs r1, 0x7F\n\
- mov r9, r1\n\
- movs r2, 0x80\n\
- negs r2, r2\n\
- mov r8, r2\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ str r0, [sp]\n\
+ movs r0, 0\n\
+ mov r10, r0\n\
+ movs r1, 0x7F\n\
+ mov r9, r1\n\
+ movs r2, 0x80\n\
+ negs r2, r2\n\
+ mov r8, r2\n\
_080FA24A:\n\
- ldr r2, [sp]\n\
- mov r4, r10\n\
- lsls r0, r4, 3\n\
- ldr r1, _080FA28C @ =gSaveBlock1 + 0x2DD4\n\
- adds r5, r0, r1\n\
- ldrb r6, [r5, 0x1]\n\
- movs r0, 0x40\n\
- ands r0, r6\n\
- cmp r0, 0\n\
- bne _080FA2A0\n\
- ldrb r4, [r5]\n\
- lsls r3, r4, 25\n\
- lsrs r1, r3, 25\n\
- lsls r0, r2, 16\n\
- lsrs r0, 16\n\
- cmp r1, r0\n\
- bcc _080FA290\n\
- adds r0, r1, 0\n\
- subs r0, r2\n\
- mov r2, r9\n\
- ands r0, r2\n\
- mov r1, r8\n\
- ands r1, r4\n\
- orrs r1, r0\n\
- strb r1, [r5]\n\
- movs r0, 0x7F\n\
- ands r1, r0\n\
- cmp r1, 0\n\
- bne _080FA336\n\
- movs r0, 0x40\n\
- orrs r0, r6\n\
- b _080FA334\n\
- .align 2, 0\n\
+ ldr r2, [sp]\n\
+ mov r4, r10\n\
+ lsls r0, r4, 3\n\
+ ldr r1, _080FA28C @ =gSaveBlock1 + 0x2DD4\n\
+ adds r5, r0, r1\n\
+ ldrb r6, [r5, 0x1]\n\
+ movs r0, 0x40\n\
+ ands r0, r6\n\
+ cmp r0, 0\n\
+ bne _080FA2A0\n\
+ ldrb r4, [r5]\n\
+ lsls r3, r4, 25\n\
+ lsrs r1, r3, 25\n\
+ lsls r0, r2, 16\n\
+ lsrs r0, 16\n\
+ cmp r1, r0\n\
+ bcc _080FA290\n\
+ adds r0, r1, 0\n\
+ subs r0, r2\n\
+ mov r2, r9\n\
+ ands r0, r2\n\
+ mov r1, r8\n\
+ ands r1, r4\n\
+ orrs r1, r0\n\
+ strb r1, [r5]\n\
+ movs r0, 0x7F\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ bne _080FA336\n\
+ movs r0, 0x40\n\
+ orrs r0, r6\n\
+ b _080FA334\n\
+ .align 2, 0\n\
_080FA28C: .4byte gSaveBlock1 + 0x2DD4\n\
_080FA290:\n\
- lsrs r0, r3, 25\n\
- subs r2, r0\n\
- mov r0, r8\n\
- ands r0, r4\n\
- strb r0, [r5]\n\
- movs r0, 0x40\n\
- orrs r0, r6\n\
- strb r0, [r5, 0x1]\n\
+ lsrs r0, r3, 25\n\
+ subs r2, r0\n\
+ mov r0, r8\n\
+ ands r0, r4\n\
+ strb r0, [r5]\n\
+ movs r0, 0x40\n\
+ orrs r0, r6\n\
+ strb r0, [r5, 0x1]\n\
_080FA2A0:\n\
- ldrb r7, [r5]\n\
- lsls r0, r7, 25\n\
- lsrs r0, 25\n\
- adds r4, r0, r2\n\
- ldrh r0, [r5]\n\
- lsls r6, r0, 18\n\
- lsls r0, r4, 16\n\
- lsrs r0, 16\n\
- lsrs r1, r6, 25\n\
- cmp r0, r1\n\
- bls _080FA310\n\
- adds r0, r4, 0\n\
- bl __umodsi3\n\
- adds r3, r0, 0\n\
- lsrs r1, r6, 25\n\
- adds r0, r4, 0\n\
- str r3, [sp, 0x4]\n\
- bl __udivsi3\n\
- adds r4, r0, 0\n\
- movs r0, 0x1\n\
- eors r4, r0\n\
- ands r4, r0\n\
- lsls r2, r4, 6\n\
- ldrb r0, [r5, 0x1]\n\
- movs r4, 0x41\n\
- negs r4, r4\n\
- adds r1, r4, 0\n\
- ands r0, r1\n\
- orrs r0, r2\n\
- strb r0, [r5, 0x1]\n\
- movs r1, 0x40\n\
- ands r0, r1\n\
- ldr r3, [sp, 0x4]\n\
- cmp r0, 0\n\
- beq _080FA2FA\n\
- adds r1, r3, 0\n\
- mov r0, r9\n\
- ands r1, r0\n\
- mov r0, r8\n\
- ands r0, r7\n\
- orrs r0, r1\n\
- strb r0, [r5]\n\
- b _080FA336\n\
+ ldrb r7, [r5]\n\
+ lsls r0, r7, 25\n\
+ lsrs r0, 25\n\
+ adds r4, r0, r2\n\
+ ldrh r0, [r5]\n\
+ lsls r6, r0, 18\n\
+ lsls r0, r4, 16\n\
+ lsrs r0, 16\n\
+ lsrs r1, r6, 25\n\
+ cmp r0, r1\n\
+ bls _080FA310\n\
+ adds r0, r4, 0\n\
+ bl __umodsi3\n\
+ adds r3, r0, 0\n\
+ lsrs r1, r6, 25\n\
+ adds r0, r4, 0\n\
+ str r3, [sp, 0x4]\n\
+ bl __udivsi3\n\
+ adds r4, r0, 0\n\
+ movs r0, 0x1\n\
+ eors r4, r0\n\
+ ands r4, r0\n\
+ lsls r2, r4, 6\n\
+ ldrb r0, [r5, 0x1]\n\
+ movs r4, 0x41\n\
+ negs r4, r4\n\
+ adds r1, r4, 0\n\
+ ands r0, r1\n\
+ orrs r0, r2\n\
+ strb r0, [r5, 0x1]\n\
+ movs r1, 0x40\n\
+ ands r0, r1\n\
+ ldr r3, [sp, 0x4]\n\
+ cmp r0, 0\n\
+ beq _080FA2FA\n\
+ adds r1, r3, 0\n\
+ mov r0, r9\n\
+ ands r1, r0\n\
+ mov r0, r8\n\
+ ands r0, r7\n\
+ orrs r0, r1\n\
+ strb r0, [r5]\n\
+ b _080FA336\n\
_080FA2FA:\n\
- ldrh r0, [r5]\n\
- lsls r0, 18\n\
- lsrs r0, 25\n\
- subs r0, r3\n\
- mov r1, r9\n\
- ands r0, r1\n\
- mov r1, r8\n\
- ands r1, r7\n\
- orrs r1, r0\n\
- strb r1, [r5]\n\
- b _080FA336\n\
+ ldrh r0, [r5]\n\
+ lsls r0, 18\n\
+ lsrs r0, 25\n\
+ subs r0, r3\n\
+ mov r1, r9\n\
+ ands r0, r1\n\
+ mov r1, r8\n\
+ ands r1, r7\n\
+ orrs r1, r0\n\
+ strb r1, [r5]\n\
+ b _080FA336\n\
_080FA310:\n\
- mov r2, r9\n\
- ands r4, r2\n\
- mov r0, r8\n\
- ands r0, r7\n\
- orrs r0, r4\n\
- strb r0, [r5]\n\
- lsls r0, 25\n\
- ldrh r1, [r5]\n\
- lsls r1, 18\n\
- lsrs r0, 25\n\
- lsrs r1, 25\n\
- cmp r0, r1\n\
- bne _080FA336\n\
- ldrb r0, [r5, 0x1]\n\
- movs r4, 0x41\n\
- negs r4, r4\n\
- adds r1, r4, 0\n\
- ands r0, r1\n\
+ mov r2, r9\n\
+ ands r4, r2\n\
+ mov r0, r8\n\
+ ands r0, r7\n\
+ orrs r0, r4\n\
+ strb r0, [r5]\n\
+ lsls r0, 25\n\
+ ldrh r1, [r5]\n\
+ lsls r1, 18\n\
+ lsrs r0, 25\n\
+ lsrs r1, 25\n\
+ cmp r0, r1\n\
+ bne _080FA336\n\
+ ldrb r0, [r5, 0x1]\n\
+ movs r4, 0x41\n\
+ negs r4, r4\n\
+ adds r1, r4, 0\n\
+ ands r0, r1\n\
_080FA334:\n\
- strb r0, [r5, 0x1]\n\
+ strb r0, [r5, 0x1]\n\
_080FA336:\n\
- mov r0, r10\n\
- adds r0, 0x1\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- mov r10, r0\n\
- cmp r0, 0x4\n\
- bls _080FA24A\n\
- ldr r0, _080FA360 @ =gSaveBlock1 + 0x2DD4\n\
- movs r1, 0x5\n\
- movs r2, 0\n\
- bl sub_80FA46C\n\
+ mov r0, r10\n\
+ adds r0, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r10, r0\n\
+ cmp r0, 0x4\n\
+ bls _080FA24A\n\
+ ldr r0, _080FA360 @ =gSaveBlock1 + 0x2DD4\n\
+ movs r1, 0x5\n\
+ movs r2, 0\n\
+ bl sub_80FA46C\n\
_080FA34E:\n\
- add sp, 0x8\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\
+ add sp, 0x8\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\
_080FA360: .4byte gSaveBlock1 + 0x2DD4\n\
- .syntax divided\n");
+ .syntax divided\n");
}
#endif
@@ -271,12 +280,12 @@ bool8 sub_80FA364(u16 *a)
struct EasyChatPair s = {0};
u16 i;
- if(!SB1ContainsWords(a))
+ if (!SB1ContainsWords(a))
{
- if(!FlagGet(SYS_POPWORD_INPUT))
+ if (!FlagGet(SYS_POPWORD_INPUT))
{
FlagSet(SYS_POPWORD_INPUT);
- if(!FlagGet(SYS_MIX_RECORD))
+ if (!FlagGet(SYS_MIX_RECORD))
{
gSaveBlock1.easyChatPairs[0].words[0] = a[0];
gSaveBlock1.easyChatPairs[0].words[1] = a[1];
@@ -290,13 +299,13 @@ bool8 sub_80FA364(u16 *a)
s.unk1_6 = 1;
sub_80FA740(&s);
- for(i = 0; i < 5; i++)
+ for (i = 0; i < 5; i++)
{
- if(sub_80FA670(&s, &gSaveBlock1.easyChatPairs[i], 0))
+ if (sub_80FA670(&s, &gSaveBlock1.easyChatPairs[i], 0))
{
u16 r3 = 4;
- while(r3 > i)
+ while (r3 > i)
{
gSaveBlock1.easyChatPairs[r3] = gSaveBlock1.easyChatPairs[r3 - 1];
r3--;
@@ -311,17 +320,17 @@ bool8 sub_80FA364(u16 *a)
return 0;
}
-void sub_80FA46C(struct EasyChatPair *s, u16 b, u8 c)
+static void sub_80FA46C(struct EasyChatPair *s, u16 b, u8 c)
{
u16 h;
- for(h = 0; h < b; h++)
+ for (h = 0; h < b; h++)
{
u16 i;
- for(i = h + 1; i < b; i++)
+ for (i = h + 1; i < b; i++)
{
- if(sub_80FA670(&s[i], &s[h], c))
+ if (sub_80FA670(&s[i], &s[h], c))
{
struct EasyChatPair temp;
@@ -333,8 +342,7 @@ void sub_80FA46C(struct EasyChatPair *s, u16 b, u8 c)
}
}
-#ifdef NONMATCHING
-void sub_80FA4E4(u8 *a, u32 b)
+void sub_80FA4E4(void *a, u32 b, u8 unused)
{
u16 i;
u16 j;
@@ -343,165 +351,37 @@ void sub_80FA4E4(u8 *a, u32 b)
struct EasyChatPair *dst;
u16 players = GetLinkPlayerCount();
- for(i = 0; i < players; i++)
- memcpy(&unk_2007800[i * 5], a + i * b, 40);
-
- //_080FA520
-
- src = unk_2007800;
- //dst = unk_2007900
- dst = (u8 *)src + 0x100; //ToDo: Get this part to match
-
+ for (i = 0; i < players; i++)
+ memcpy(&ARRAY_2007800[i * 5], (u8 *)a + i * b, 40);
+ src = ARRAY_2007800;
+ dst = ARRAY_2007900;
r7 = 0;
- //_080FA530
- for(i = 0; i < players; i++)
+ for (i = 0; i < players; i++)
{
- for(j = 0; j < 5; j++)
+ for (j = 0; j < 5; j++)
{
s16 foo = sub_80FA828(src, r7);
- if(foo < 0)
+ if (foo < 0)
{
*(dst++) = *src;
r7++;
}
- //_080FA558
else
{
- if(unk_2007900[foo].unk0_0 < src->unk0_0)
+ if (ARRAY_2007900[foo].unk0_0 < src->unk0_0)
{
- unk_2007900[foo] = *src;
+ ARRAY_2007900[foo] = *src;
}
}
- //_080FA572
src++;
}
}
- //_080FA588
- sub_80FA46C(unk_2007900, r7, 2);
- src = unk_2007900;
+ sub_80FA46C(ARRAY_2007900, r7, 2);
+ src = ARRAY_2007900;
dst = gSaveBlock1.easyChatPairs;
- for(i = 0; i < 5; i++)
+ for (i = 0; i < 5; i++)
*(dst++) = *(src++);
}
-#else
-__attribute__((naked))
-void sub_80FA4E4(struct EasyChatPair *a, u32 b, u8 c)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- sub sp, 0x4\n\
- adds r6, r0, 0\n\
- adds r5, r1, 0\n\
- bl GetLinkPlayerCount\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- mov r8, r0\n\
- movs r4, 0\n\
- cmp r4, r8\n\
- bcs _080FA520\n\
-_080FA500:\n\
- lsls r0, r4, 2\n\
- adds r0, r4\n\
- lsls r0, 3\n\
- ldr r1, _080FA554 @ =0x02007800\n\
- adds r0, r1\n\
- adds r1, r4, 0\n\
- muls r1, r5\n\
- adds r1, r6, r1\n\
- movs r2, 0x28\n\
- bl memcpy\n\
- adds r0, r4, 0x1\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- cmp r4, r8\n\
- bcc _080FA500\n\
-_080FA520:\n\
- ldr r5, _080FA554 @ =0x02007800\n\
- movs r0, 0x80\n\
- lsls r0, 1\n\
- adds r3, r5, r0\n\
- movs r7, 0\n\
- movs r4, 0\n\
- cmp r4, r8\n\
- bcs _080FA588\n\
-_080FA530:\n\
- movs r6, 0\n\
-_080FA532:\n\
- adds r0, r5, 0\n\
- adds r1, r7, 0\n\
- str r3, [sp]\n\
- bl sub_80FA828\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- ldr r3, [sp]\n\
- cmp r0, 0\n\
- bge _080FA558\n\
- ldr r0, [r5]\n\
- ldr r1, [r5, 0x4]\n\
- stm r3!, {r0,r1}\n\
- adds r0, r7, 0x1\n\
- lsls r0, 16\n\
- lsrs r7, r0, 16\n\
- b _080FA572\n\
- .align 2, 0\n\
-_080FA554: .4byte 0x02007800\n\
-_080FA558:\n\
- lsls r1, r0, 3\n\
- ldr r0, _080FA5B4 @ =0x02007900\n\
- adds r2, r1, r0\n\
- ldrb r1, [r2]\n\
- lsls r1, 25\n\
- ldrb r0, [r5]\n\
- lsls r0, 25\n\
- cmp r1, r0\n\
- bcs _080FA572\n\
- ldr r0, [r5]\n\
- ldr r1, [r5, 0x4]\n\
- str r0, [r2]\n\
- str r1, [r2, 0x4]\n\
-_080FA572:\n\
- adds r5, 0x8\n\
- adds r0, r6, 0x1\n\
- lsls r0, 16\n\
- lsrs r6, r0, 16\n\
- cmp r6, 0x4\n\
- bls _080FA532\n\
- adds r0, r4, 0x1\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- cmp r4, r8\n\
- bcc _080FA530\n\
-_080FA588:\n\
- ldr r4, _080FA5B4 @ =0x02007900\n\
- adds r0, r4, 0\n\
- adds r1, r7, 0\n\
- movs r2, 0x2\n\
- bl sub_80FA46C\n\
- adds r5, r4, 0\n\
- ldr r3, _080FA5B8 @ =gSaveBlock1 + 0x2DD4\n\
- movs r4, 0\n\
-_080FA59A:\n\
- ldm r5!, {r0,r1}\n\
- stm r3!, {r0,r1}\n\
- adds r0, r4, 0x1\n\
- lsls r0, 16\n\
- lsrs r4, r0, 16\n\
- cmp r4, 0x4\n\
- bls _080FA59A\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\
-_080FA5B4: .4byte 0x02007900\n\
-_080FA5B8: .4byte gSaveBlock1 + 0x2DD4\n\
- .syntax divided\n");
-}
-#endif
void sub_80FA5BC(void)
{
@@ -528,65 +408,65 @@ void sub_80FA648(void)
gScriptResult = (gSaveBlock1.easyChatPairs[0].words[0] + gSaveBlock1.easyChatPairs[0].words[1]) & 7;
}
-bool8 sub_80FA670(struct EasyChatPair *a, struct EasyChatPair *b, u8 c)
+static bool8 sub_80FA670(struct EasyChatPair *a, struct EasyChatPair *b, u8 c)
{
- switch(c)
+ switch (c)
{
case 0:
- if(a->unk0_0 > b->unk0_0)
+ if (a->unk0_0 > b->unk0_0)
return 1;
- if(a->unk0_0 < b->unk0_0)
+ if (a->unk0_0 < b->unk0_0)
return 0;
- if(a->unk0_7 > b->unk0_7)
+ if (a->unk0_7 > b->unk0_7)
return 1;
- if(a->unk0_7 < b->unk0_7)
+ if (a->unk0_7 < b->unk0_7)
return 0;
break;
case 1:
- if(a->unk0_7 > b->unk0_7)
+ if (a->unk0_7 > b->unk0_7)
return 1;
- if(a->unk0_7 < b->unk0_7)
+ if (a->unk0_7 < b->unk0_7)
return 0;
- if(a->unk0_0 > b->unk0_0)
+ if (a->unk0_0 > b->unk0_0)
return 1;
- if(a->unk0_0 < b->unk0_0)
+ if (a->unk0_0 < b->unk0_0)
return 0;
break;
case 2:
- if(a->unk0_0 > b->unk0_0)
+ if (a->unk0_0 > b->unk0_0)
return 1;
- if(a->unk0_0 < b->unk0_0)
+ if (a->unk0_0 < b->unk0_0)
return 0;
- if(a->unk0_7 > b->unk0_7)
+ if (a->unk0_7 > b->unk0_7)
return 1;
- if(a->unk0_7 < b->unk0_7)
+ if (a->unk0_7 < b->unk0_7)
return 0;
- if(a->unk2 > b->unk2)
+ if (a->unk2 > b->unk2)
return 1;
- if(a->unk2 < b->unk2)
+ if (a->unk2 < b->unk2)
return 0;
- if(a->words[0] > b->words[0])
+ if (a->words[0] > b->words[0])
return 1;
- if(a->words[0] < b->words[0])
+ if (a->words[0] < b->words[0])
return 0;
- if(a->words[1] > b->words[1])
+ if (a->words[1] > b->words[1])
return 1;
- if(a->words[1] < b->words[1])
+ if (a->words[1] < b->words[1])
return 0;
return 1;
}
return Random() & 1;
}
-void sub_80FA740(struct EasyChatPair *s)
+static void sub_80FA740(struct EasyChatPair *s)
{
u16 r4;
r4 = Random() % 98;
- if(r4 > 50)
+ if (r4 > 50)
{
r4 = Random() % 98;
- if(r4 > 80)
+ if (r4 > 80)
r4 = Random() % 98;
}
s->unk0_7 = r4 + 30;
@@ -594,38 +474,38 @@ void sub_80FA740(struct EasyChatPair *s)
s->unk2 = Random();
}
-bool8 SB1ContainsWords(u16 *a)
+static bool8 SB1ContainsWords(u16 *a)
{
u16 i;
- for(i = 0; i < 5; i++)
+ for (i = 0; i < 5; i++)
{
- if(IsEasyChatPairEqual(a, gSaveBlock1.easyChatPairs[i].words) != 0)
+ if (IsEasyChatPairEqual(a, gSaveBlock1.easyChatPairs[i].words) != 0)
return TRUE;
}
return FALSE;
}
-bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2)
+static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2)
{
u16 i;
- for(i = 0; i < 2; i++)
+ for (i = 0; i < 2; i++)
{
- if(*(words1++) != *(words2++))
+ if (*(words1++) != *(words2++))
return FALSE;
}
return TRUE;
}
-s16 sub_80FA828(struct EasyChatPair *a, u16 b)
+static s16 sub_80FA828(struct EasyChatPair *a, u16 b)
{
s16 i;
- struct EasyChatPair *s = unk_2007900;
+ struct EasyChatPair *s = ARRAY_2007900;
- for(i = 0; i < b; i++)
+ for (i = 0; i < b; i++)
{
- if(IsEasyChatPairEqual(a->words, s->words))
+ if (IsEasyChatPairEqual(a->words, s->words))
return i;
s++;
}
diff --git a/src/diploma.c b/src/diploma.c
index 8fabe3a2f..649f4a33d 100644
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -10,10 +10,6 @@
#include "task.h"
#include "text.h"
-extern u8 gDiplomaTiles[];
-extern u8 gDiplomaTilemap[];
-extern u8 gDiplomaPalettes[];
-extern u8 gStringVar1[];
extern u8 gOtherText_NationalDex[];
extern u8 gOtherText_HoennDex[];
extern u8 gOtherText_DiplomaCertificationGameFreak[];
@@ -25,6 +21,15 @@ static void Task_DiplomaWaitForKeyPress(u8);
static void Task_DiplomaFadeOut(u8);
static void DisplayDiplomaText(void);
+static const u16 gDiplomaPalettes[][16] =
+{
+ INCBIN_U16("graphics/misc/diploma_national.gbapal"),
+ INCBIN_U16("graphics/misc/diploma_hoenn.gbapal"),
+};
+
+static const u8 gDiplomaTilemap[] = INCBIN_U8("graphics/misc/diploma_map.bin.lz");
+static const u8 gDiplomaTiles[] = INCBIN_U8("graphics/misc/diploma.4bpp.lz");
+
static void VBlankCB(void)
{
LoadOam();
@@ -35,9 +40,9 @@ static void VBlankCB(void)
void sub_8145D88(void)
{
u32 savedIme;
-
+
SetVBlankCallback(NULL);
-
+
REG_DISPCNT = 0;
REG_BG3CNT = 0;
REG_BG2CNT = 0;
@@ -51,14 +56,14 @@ void sub_8145D88(void)
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(gDiplomaTiles, (void *)VRAM);
LZ77UnCompVram(gDiplomaTilemap, (void *)(VRAM + 0x3000));
-
+
remove_some_task();
ResetTasks();
ResetSpriteData();
@@ -69,22 +74,22 @@ void sub_8145D88(void)
InitMenuWindow(&gWindowConfig_81E6CE4);
DisplayDiplomaText();
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
-
+
savedIme = REG_IME;
REG_IME = 0;
REG_IE |= INTR_FLAG_VBLANK;
REG_IME = savedIme;
REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
-
+
SetVBlankCallback(VBlankCB);
SetMainCallback2(MainCB2);
-
+
REG_BLDCNT = 0;
REG_BLDALPHA = 0;
REG_BLDY = 0;
REG_BG3CNT = 0x4603;
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
-
+
CreateTask(Task_DiplomaFadeIn, 0);
}
@@ -98,13 +103,13 @@ static void MainCB2(void)
static void Task_DiplomaFadeIn(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
gTasks[taskId].func = Task_DiplomaWaitForKeyPress;
}
static void Task_DiplomaWaitForKeyPress(u8 taskId)
{
- if(gMain.newKeys & (A_BUTTON | B_BUTTON))
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].func = Task_DiplomaFadeOut;
@@ -113,7 +118,7 @@ static void Task_DiplomaWaitForKeyPress(u8 taskId)
static void Task_DiplomaFadeOut(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
DestroyTask(taskId);
SetMainCallback2(sub_80546F0);
@@ -122,7 +127,7 @@ static void Task_DiplomaFadeOut(u8 taskId)
static void DisplayDiplomaText(void)
{
- if(sub_8090FF4())
+ if (sub_8090FF4())
{
REG_BG3HOFS = 256;
StringCopy(gStringVar1, gOtherText_NationalDex);
diff --git a/src/event_data.c b/src/event_data.c
index b1c0632ec..c6aecf13c 100644
--- a/src/event_data.c
+++ b/src/event_data.c
@@ -2,29 +2,34 @@
#include "event_data.h"
#include "pokedex.h"
-extern u8 gUnknown_0202E8E2[];
+#define TEMP_FLAGS_SIZE 0x4
+#define TEMP_UPPER_FLAGS_SIZE 0x8
+#define TEMP_VARS_SIZE 0x20
+
+extern u8 gUnknown_0202E8E2[16];
extern u16 *gSpecialVars[];
void InitEventData(void)
{
memset(gSaveBlock1.flags, 0, sizeof(gSaveBlock1.flags));
memset(gSaveBlock1.vars, 0, sizeof(gSaveBlock1.vars));
- memset(gUnknown_0202E8E2, 0, 16);
+ memset(gUnknown_0202E8E2, 0, sizeof(gUnknown_0202E8E2));
}
void ClearTempFieldEventData(void)
{
- memset(gSaveBlock1.flags, 0, 4);
- memset(gSaveBlock1.vars, 0, 32);
+ memset(gSaveBlock1.flags, 0, TEMP_FLAGS_SIZE);
+ memset(gSaveBlock1.vars, 0, TEMP_VARS_SIZE);
FlagReset(SYS_ENC_UP_ITEM);
FlagReset(SYS_ENC_DOWN_ITEM);
FlagReset(SYS_USE_STRENGTH);
FlagReset(SYS_CTRL_OBJ_DELETE);
}
+// probably had different flag splits at one point.
void ClearUpperFlags(void)
{
- memset(gSaveBlock1.flags + 0x118, 0, 8);
+ memset(gSaveBlock1.flags + 0x118, 0, TEMP_UPPER_FLAGS_SIZE);
}
void DisableNationalPokedex(void)
diff --git a/src/field_camera.c b/src/field_camera.c
index c55d8e2a3..442bc095b 100644
--- a/src/field_camera.c
+++ b/src/field_camera.c
@@ -1,14 +1,12 @@
#include "global.h"
#include "field_camera.h"
#include "asm.h"
+#include "asm_fieldmap.h"
#include "berry.h"
#include "field_player_avatar.h"
-#include "asm_fieldmap.h"
#include "sprite.h"
#include "text.h"
-extern u16 gBGTilemapBuffers[4][0x400];
-
extern u8 gUnknown_0202E854;
@@ -91,8 +89,8 @@ void sub_8057A58(void)
*gBGVOffsetRegs[2] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8;
*gBGHOffsetRegs[3] = gUnknown_03000590.unk0 + gUnknown_03000598;
*gBGVOffsetRegs[3] = gUnknown_03000590.unk1 + gUnknown_0300059A + 8;
-
- if(gUnknown_03000590.unk4)
+
+ if (gUnknown_03000590.unk4)
{
DmaCopy16(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800);
DmaCopy16(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800);
@@ -119,17 +117,17 @@ static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData)
u8 j;
u32 r6;
u8 temp;
-
- for(i = 0; i < 32; i += 2)
+
+ for (i = 0; i < 32; i += 2)
{
temp = gUnknown_03000590.unk3 + i;
- if(temp >= 32)
+ if (temp >= 32)
temp -= 32;
r6 = temp * 32;
- for(j = 0; j < 32; j += 2)
+ for (j = 0; j < 32; j += 2)
{
temp = gUnknown_03000590.unk2 + j;
- if(temp >= 32)
+ if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, r6 + temp, x + j / 2, y + i / 2);
}
@@ -139,14 +137,14 @@ static void DrawWholeMapViewInternal(int x, int y, struct MapData *mapData)
static void RedrawMapSlicesForCameraUpdate(struct UnknownStruct *a, int x, int y)
{
struct MapData *mapData = gMapHeader.mapData;
-
- if(x > 0)
+
+ if (x > 0)
RedrawMapSliceWest(a, mapData);
- if(x < 0)
+ if (x < 0)
RedrawMapSliceEast(a, mapData);
- if(y > 0)
+ if (y > 0)
RedrawMapSliceNorth(a, mapData);
- if(y < 0)
+ if (y < 0)
RedrawMapSliceSouth(a, mapData);
a->unk4 = TRUE;
}
@@ -156,15 +154,15 @@ static void RedrawMapSliceNorth(struct UnknownStruct *a, struct MapData *mapData
u8 i;
u8 temp;
u32 r7;
-
+
temp = a->unk3 + 28;
- if(temp >= 32)
+ if (temp >= 32)
temp -= 32;
r7 = temp * 32;
- for(i = 0; i < 32; i += 2)
+ for (i = 0; i < 32; i += 2)
{
temp = a->unk2 + i;
- if(temp >= 32)
+ if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y + 14);
}
@@ -175,11 +173,11 @@ static void RedrawMapSliceSouth(struct UnknownStruct *a, struct MapData *mapData
u8 i;
u8 temp;
u32 r7 = a->unk3 * 32;
-
- for(i = 0; i < 32; i += 2)
+
+ for (i = 0; i < 32; i += 2)
{
temp = a->unk2 + i;
- if(temp >= 32)
+ if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, r7 + temp, gSaveBlock1.pos.x + i / 2, gSaveBlock1.pos.y);
}
@@ -190,11 +188,11 @@ static void RedrawMapSliceEast(struct UnknownStruct *a, struct MapData *mapData)
u8 i;
u8 temp;
u32 r6 = a->unk2;
-
- for(i = 0; i < 32; i += 2)
+
+ for (i = 0; i < 32; i += 2)
{
temp = a->unk3 + i;
- if(temp >= 32)
+ if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, temp * 32 + r6, gSaveBlock1.pos.x, gSaveBlock1.pos.y + i / 2);
}
@@ -205,13 +203,13 @@ static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData)
u8 i;
u8 temp;
u8 r5 = a->unk2 + 28;
-
- if(r5 >= 32)
+
+ if (r5 >= 32)
r5 -= 32;
- for(i = 0; i < 32; i += 2)
+ for (i = 0; i < 32; i += 2)
{
temp = a->unk3 + i;
- if(temp >= 32)
+ if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapData, temp * 32 + r5, gSaveBlock1.pos.x + 14, gSaveBlock1.pos.y + i / 2);
}
@@ -220,8 +218,8 @@ static void RedrawMapSliceWest(struct UnknownStruct *a, struct MapData *mapData)
void CurrentMapDrawMetatileAt(int a, int b)
{
int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, a, b);
-
- if(offset >= 0)
+
+ if (offset >= 0)
{
DrawMetatileAt(gMapHeader.mapData, offset, a, b);
gUnknown_03000590.unk4 = TRUE;
@@ -231,8 +229,8 @@ void CurrentMapDrawMetatileAt(int a, int b)
void DrawDoorMetatileAt(int x, int y, u16 *arr)
{
int offset = MapPosToBgTilemapOffset(&gUnknown_03000590, x, y);
-
- if(offset >= 0)
+
+ if (offset >= 0)
{
DrawMetatile(1, arr, offset);
gUnknown_03000590.unk4 = TRUE;
@@ -243,10 +241,10 @@ static void DrawMetatileAt(struct MapData *mapData, u16 b, int c, int d)
{
u16 metatileId = MapGridGetMetatileIdAt(c, d);
u16 *metatiles;
-
- if(metatileId > 1024)
+
+ if (metatileId > 1024)
metatileId = 0;
- if(metatileId < 512)
+ if (metatileId < 512)
metatiles = mapData->primaryTileset->metatiles;
else
{
@@ -258,19 +256,19 @@ static void DrawMetatileAt(struct MapData *mapData, u16 b, int c, int d)
static void DrawMetatile(s32 a, u16 *b, u16 c)
{
- switch(a)
+ 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];
@@ -281,12 +279,12 @@ static void DrawMetatile(s32 a, u16 *b, u16 c)
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;
@@ -297,12 +295,12 @@ static void DrawMetatile(s32 a, u16 *b, u16 c)
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];
@@ -315,25 +313,25 @@ static s32 MapPosToBgTilemapOffset(struct UnknownStruct *a, s32 x, s32 y)
{
x -= gSaveBlock1.pos.x;
x *= 2;
- if(x >= 32 || x < 0)
+ if (x >= 32 || x < 0)
return -1;
x = x + a->unk2;
- if(x >= 32)
+ if (x >= 32)
x -= 32;
-
+
y = (y - gSaveBlock1.pos.y) * 2;
- if(y >= 32 || y < 0)
+ if (y >= 32 || y < 0)
return -1;
y = y + a->unk3;
- if(y >= 32)
+ if (y >= 32)
y -= 32;
-
+
return y * 32 + x;
}
static void CameraUpdateCallback(struct CameraSomething *a)
{
- if(a->unk4 != 0)
+ if (a->unk4 != 0)
{
a->unk8 = gSprites[a->unk4].data2;
a->unkC = gSprites[a->unk4].data3;
@@ -352,7 +350,7 @@ void ResetCameraUpdateInfo(void)
u32 InitCameraUpdateCallback(u8 a)
{
- if(gUnknown_03004880.unk4 != 0)
+ if (gUnknown_03004880.unk4 != 0)
DestroySprite(&gSprites[gUnknown_03004880.unk4]);
gUnknown_03004880.unk4 = AddCameraObject(a);
gUnknown_03004880.callback = CameraUpdateCallback;
@@ -367,8 +365,8 @@ void CameraUpdate(void)
int r1;
int r7;
int r8;
-
- if(gUnknown_03004880.callback != NULL)
+
+ if (gUnknown_03004880.callback != NULL)
gUnknown_03004880.callback(&gUnknown_03004880);
r7 = gUnknown_03004880.unk8;
r8 = gUnknown_03004880.unkC;
@@ -376,43 +374,43 @@ void CameraUpdate(void)
deltaY = 0;
r1 = gUnknown_03004880.unk10;
r0 = gUnknown_03004880.unk14;
-
-
- if(r1 == 0 && r7 != 0)
+
+
+ if (r1 == 0 && r7 != 0)
{
- if(r7 > 0)
+ if (r7 > 0)
deltaX = 1;
else
deltaX = -1;
}
- if(r0 == 0 && r8 != 0)
+ if (r0 == 0 && r8 != 0)
{
- if(r8 > 0)
+ if (r8 > 0)
deltaY = 1;
else
deltaY = -1;
}
- if(r1 != 0 && r1 == -r7)
+ if (r1 != 0 && r1 == -r7)
{
- if(r7 > 0)
+ if (r7 > 0)
deltaX = 1;
else
deltaX = -1;
}
- if(r0 != 0 && r0 == -r8)
+ if (r0 != 0 && r0 == -r8)
{
- if(r8 > 0)
+ if (r8 > 0)
deltaX = 1;
else
deltaX = -1;
}
-
+
gUnknown_03004880.unk10 += r7;
- gUnknown_03004880.unk10 = gUnknown_03004880.unk10 - 16 * (gUnknown_03004880.unk10 / 16);
+ gUnknown_03004880.unk10 = gUnknown_03004880.unk10 - 16 * (gUnknown_03004880.unk10 / 16);
gUnknown_03004880.unk14 += r8;
gUnknown_03004880.unk14 = gUnknown_03004880.unk14 - 16 * (gUnknown_03004880.unk14 / 16);
-
- if(deltaX != 0 || deltaY != 0)
+
+ if (deltaX != 0 || deltaY != 0)
{
CameraMove(deltaX, deltaY);
UpdateFieldObjectsForCameraUpdate(deltaX, deltaY);
@@ -421,7 +419,7 @@ void CameraUpdate(void)
tilemap_move_something(&gUnknown_03000590, deltaX * 2, deltaY * 2);
RedrawMapSlicesForCameraUpdate(&gUnknown_03000590, deltaX * 2, deltaY * 2);
}
-
+
coords8_add(&gUnknown_03000590, r7, r8);
gUnknown_0300489C -= r7;
gUnknown_03004898 -= r8;
@@ -467,7 +465,7 @@ void UpdateCameraPanning(void)
static void CameraPanningCB_PanAhead(void)
{
u8 var;
-
+
if (gUnknown_0202E854 == 0)
{
InstallCameraPanAheadCallback();
@@ -484,7 +482,7 @@ static void CameraPanningCB_PanAhead(void)
{
gUnknown_0300059C = 0;
}
-
+
var = player_get_direction_upper_nybble();
if (var == 2)
{
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c
index 495327b9b..9bff65004 100644
--- a/src/field_control_avatar.c
+++ b/src/field_control_avatar.c
@@ -1,112 +1,179 @@
#include "global.h"
#include "asm.h"
+#include "battle_setup.h"
+#include "event_data.h"
#include "field_player_avatar.h"
+#include "flags.h"
#include "metatile_behavior.h"
#include "rom4.h"
+#include "safari_zone.h"
#include "script.h"
+#include "songs.h"
#include "sound.h"
#include "trainer_see.h"
+#include "vars.h"
+#include "wild_encounter.h"
+#include "bike.h"
+#include "field_control_avatar.h"
+struct Coords32
+{
+ s32 x;
+ s32 y;
+};
+
+extern const struct Coords32 gUnknown_0821664C[];
+extern u16 gScriptLastTalked;
+extern u16 gScriptFacing;
+extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
+extern u16 gSpecialVar_0x8004;
+extern u16 gSpecialVar_0x8005;
+extern u8 gUnknown_0202E8C0;
+extern u16 gUnknown_0202E8C2;
+
+//scripts
+extern u8 gUnknown_081A2C51[];
extern u8 gUnknown_0815281E[];
extern u8 gUnknown_08152C39[];
extern u8 gUnknown_0815F36C[];
extern u8 gUnknown_0815F43A[];
extern u8 gUnknown_081A0009[];
+extern u8 gUnknown_081C6C02[];
+extern u8 HiddenItemScript[];
+extern u8 Event_TV[];
+extern u8 gUnknown_081A0009[];
+extern u8 ClosedSootopolisGymDoorScript[];
+extern u8 gUnknown_081A4363[];
+extern u8 gUnknown_081C346A[];
+extern u8 gUnknown_081616E1[];
+extern u8 Event_WorldMap[];
+extern u8 Event_RunningShoesManual[];
+extern u8 PictureBookShelfScript[];
+extern u8 BookshelfScript[];
+extern u8 PokemonCenterBookshelfScript[];
+extern u8 VaseScript[];
+extern u8 TrashCanScript[];
+extern u8 ShopShelfScript[];
+extern u8 BlueprintScript[];
+extern u8 gUnknown_0815F36C[];
+extern u8 gUnknown_0815F43A[];
+extern u8 gUnknown_0815F523[];
+extern u8 gUnknown_0815F528[];
+extern u8 UseSurfScript[];
+extern u8 UseWaterfallScript[];
+extern u8 CannotUseWaterfallScript[];
+extern u8 UseDiveScript[];
+extern u8 UnderwaterUseDiveScript[];
+extern u8 GraniteCave_B1F_EventScript_1C6BC5[];
+extern u8 gUnknown_081A14B8[];
+extern u8 Event_EggHatch[];
+extern u8 gUnknown_0815FD0D[];
+extern u8 gUnknown_081C6BDE[];
+
+static void player_get_pos_to_and_height(struct MapPosition *);
+static void player_get_next_pos_and_height(struct MapPosition *);
+static u16 cur_mapdata_block_role_at_player_pos(int);
+static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c);
+static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c);
+static u8 *sub_8068364(struct MapPosition *, u8, u8);
+static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *, u8, u8 c);
+static u8 *sub_8068500(struct MapPosition *, u8, u8);
+static u8 *TryGetFieldMoveScript(struct MapPosition *, u8, u8);
+static bool32 sub_8068770(void);
+static bool32 sub_80687A4(void);
+static bool8 sub_80687E4(struct MapPosition *, u16, u16);
+bool8 mapheader_trigger_activate_at__run_now(struct MapPosition *);
+bool8 sub_8068870(u16 a);
+bool8 sub_8068894(void);
+static void happiness_algorithm_step(void);
+static bool8 overworld_poison_step(void);
+static bool8 is_it_battle_time_3(u16);
+static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *, u16, u8);
+bool8 sub_8068A64(struct MapPosition *, u16);
+static bool8 sub_8068B30(u16);
+static bool8 is_non_stair_warp_tile(u16, u8);
+static s8 map_warp_check_packed(struct MapHeader *, struct MapPosition *);
+static void sub_8068C30(struct MapHeader *, s8, struct MapPosition *);
+static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8);
+static s8 map_warp_check(struct MapHeader *, u16, u16, u8);
+static u8 *mapheader_trigger_activate_at(struct MapHeader *, u16, u16, u8);
+static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);
+u8 sub_8068F18(void);
+
+extern u8 mapheader_run_first_tag2_script_list_match(void);
+extern void sub_8071310(void);
+extern int sub_80A6D1C(void);
+extern u8 sub_80BC050();
+extern u8 sub_80422A0(void);
+extern s32 overworld_poison(void);
+extern void sub_8080E88();
+extern void walkrun_find_lowest_active_bit_in_bitfield(void);
+extern void sub_8080F2C(u8);
+extern void sub_8080F48(void);
+extern void sub_8080F58(void);
+extern void sub_80BC038();
+extern void DoCoordEventWeather(u8);
-__attribute__((naked))
-void sub_8067EEC(struct UnkInputStruct *s)
-{
- asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- movs r1, 0x2\n\
- negs r1, r1\n\
- movs r3, 0x3\n\
- negs r3, r3\n\
- movs r4, 0x5\n\
- negs r4, r4\n\
- movs r5, 0x9\n\
- negs r5, r5\n\
- movs r2, 0\n\
- strb r2, [r0]\n\
- ldrb r2, [r0, 0x1]\n\
- ands r1, r2\n\
- ands r1, r3\n\
- ands r1, r4\n\
- ands r1, r5\n\
- strb r1, [r0, 0x1]\n\
- movs r1, 0\n\
- strb r1, [r0, 0x2]\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided\n");
-}
-
-extern u16 cur_mapdata_block_role_at_player_pos(int);
-
-void process_overworld_input(struct UnkInputStruct *pStruct, u16 keys, u16 heldKeys)
+void FieldClearPlayerInput(struct FieldInput *input)
+{
+ input->pressedAButton = 0;
+ input->input_field_0_1 = 0;
+ input->pressedStartButton = 0;
+ input->pressedSelectButton = 0;
+ input->input_field_0_4 = 0;
+ input->input_field_0_5 = 0;
+ input->input_field_0_6 = 0;
+ input->pressedBButton = 0;
+ input->input_field_1_0 = 0;
+ input->input_field_1_1 = 0;
+ input->input_field_1_2 = 0;
+ input->input_field_1_3 = 0;
+ input->dpadDirection = 0;
+}
+
+void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys)
{
u8 r6 = gPlayerAvatar.running1;
u8 r9 = gPlayerAvatar.running2;
- bool8 r7 = MetatileBehavior_IsMoveTile(cur_mapdata_block_role_at_player_pos(r9));
-
- if ((r6 == 2 && r7 == FALSE) || r6 == 0)
+ bool8 forcedMove = MetatileBehavior_IsMoveTile(cur_mapdata_block_role_at_player_pos(r9));
+
+ if ((r6 == 2 && forcedMove == FALSE) || r6 == 0)
{
- if (sub_80E6034() != 4)
+ if (GetPlayerSpeed() != 4)
{
- if (keys & START_BUTTON)
- pStruct->input_field_0_2 = TRUE;
- if (keys & SELECT_BUTTON)
- pStruct->input_field_0_3 = TRUE;
- if (keys & A_BUTTON)
- pStruct->input_field_0_0 = TRUE;
- if (keys & B_BUTTON)
- pStruct->input_field_0_7 = TRUE;
+ if (newKeys & START_BUTTON)
+ input->pressedStartButton = TRUE;
+ if (newKeys & SELECT_BUTTON)
+ input->pressedSelectButton = TRUE;
+ if (newKeys & A_BUTTON)
+ input->pressedAButton = TRUE;
+ if (newKeys & B_BUTTON)
+ input->pressedBButton = TRUE;
}
if (heldKeys & (DPAD_UP | DPAD_DOWN | DPAD_LEFT | DPAD_RIGHT))
{
- pStruct->input_field_0_4 = TRUE;
- pStruct->input_field_0_5 = TRUE;
+ input->input_field_0_4 = TRUE;
+ input->input_field_0_5 = TRUE;
}
}
- if (r7 == FALSE)
+ if (forcedMove == FALSE)
{
if (r6 == 2 && r9 == 2)
- pStruct->input_field_0_6 = TRUE;
- if (r7 == FALSE && r6 == 2)
- pStruct->input_field_0_1 = TRUE;
+ input->input_field_0_6 = TRUE;
+ if (forcedMove == FALSE && r6 == 2)
+ input->input_field_0_1 = TRUE;
}
if (heldKeys & DPAD_UP)
- pStruct->input_field_2 = 2;
+ input->dpadDirection = DIR_NORTH;
else if (heldKeys & DPAD_DOWN)
- pStruct->input_field_2 = 1;
+ input->dpadDirection = DIR_SOUTH;
else if (heldKeys & DPAD_LEFT)
- pStruct->input_field_2 = 3;
+ input->dpadDirection = DIR_WEST;
else if (heldKeys & DPAD_RIGHT)
- pStruct->input_field_2 = 4;
+ input->dpadDirection = DIR_EAST;
}
-struct MapPosition
-{
- s16 x;
- s16 y;
- u8 height;
-};
-
-void player_get_pos_to_and_height(struct MapPosition *);
-extern u8 mapheader_run_first_tag2_script_list_match(void);
-extern int sub_80687A4(void);
-extern u8 sub_80687E4();
-extern u8 is_it_battle_time_3();
-extern u8 mapheader_run_first_tag2_script_list_match_conditionally();
-void player_get_next_pos_and_height(struct MapPosition *);
-u8 sub_80681F0(struct MapPosition *position, u16 b, u8 c);
-extern u8 map_warp_consider_2_to_inside();
-extern int sub_8068770(void);
-extern void sub_8071310(void);
-extern int sub_80A6D1C(void);
-
-int sub_8068024(struct UnkInputStruct *s)
+int sub_8068024(struct FieldInput *input)
{
struct MapPosition position;
u8 r6;
@@ -116,57 +183,56 @@ int sub_8068024(struct UnkInputStruct *s)
player_get_pos_to_and_height(&position);
r4 = MapGridGetMetatileBehaviorAt(position.x, position.y);
if (CheckTrainers() == TRUE)
- return 1;
+ return TRUE;
if (mapheader_run_first_tag2_script_list_match() == 1)
- return 1;
- if (s->input_field_0_7 && sub_80687A4() == 1)
- return 1;
- if (s->input_field_0_6)
+ return TRUE;
+ if (input->pressedBButton && sub_80687A4() == 1)
+ return TRUE;
+ if (input->input_field_0_6)
{
IncrementGameStat(5);
if (sub_80687E4(&position, r4, r6) == 1)
- return 1;
+ return TRUE;
}
- if (s->input_field_0_1 && is_it_battle_time_3(r4) == 1)
- return 1;
- if (s->input_field_0_4 && s->input_field_2 == r6)
+ if (input->input_field_0_1 && is_it_battle_time_3(r4) == 1)
+ return TRUE;
+ if (input->input_field_0_4 && input->dpadDirection == r6)
{
if (mapheader_run_first_tag2_script_list_match_conditionally(&position, r4, r6) == 1)
- return 1;
+ return TRUE;
}
player_get_next_pos_and_height(&position);
r4 = MapGridGetMetatileBehaviorAt(position.x, position.y);
- if (s->input_field_0_0 && sub_80681F0(&position, r4, r6) == 1)
- return 1;
- if (s->input_field_0_5 && s->input_field_2 == r6)
+ if (input->pressedAButton && sub_80681F0(&position, r4, r6) == 1)
+ return TRUE;
+ if (input->input_field_0_5 && input->dpadDirection == r6)
{
if (map_warp_consider_2_to_inside(&position, r4, r6) == 1)
- return 1;
+ return TRUE;
}
- if (s->input_field_0_0 && sub_8068770() == 1)
- return 1;
- if (s->input_field_0_2)
+ if (input->pressedAButton && sub_8068770() == 1)
+ return TRUE;
+ if (input->pressedStartButton)
{
- PlaySE(6);
+ PlaySE(SE_WIN_OPEN);
sub_8071310();
- return 1;
+ return TRUE;
}
- //_08068154
- if (s->input_field_0_3 && sub_80A6D1C() == 1)
- return 1;
+ if (input->pressedSelectButton && sub_80A6D1C() == 1)
+ return TRUE;
return FALSE;
}
-void player_get_pos_to_and_height(struct MapPosition *position)
+static void player_get_pos_to_and_height(struct MapPosition *position)
{
PlayerGetDestCoords(&position->x, &position->y);
position->height = PlayerGetZCoord();
}
-void player_get_next_pos_and_height(struct MapPosition *position)
+static void player_get_next_pos_and_height(struct MapPosition *position)
{
s16 x, y;
-
+
GetXYCoordsOneStepInFrontOfPlayer(&position->x, &position->y);
PlayerGetDestCoords(&x, &y);
if (MapGridGetZCoordAt(x, y) != 0)
@@ -175,43 +241,36 @@ void player_get_next_pos_and_height(struct MapPosition *position)
position->height = 0;
}
-u16 cur_mapdata_block_role_at_player_pos(int unused)
+static u16 cur_mapdata_block_role_at_player_pos(int unused)
{
s16 x, y;
-
+
PlayerGetDestCoords(&x, &y);
return MapGridGetMetatileBehaviorAt(x, y);
}
-u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c);
-
-u8 sub_80681F0(struct MapPosition *position, u16 b, u8 c)
+static bool8 sub_80681F0(struct MapPosition *position, u16 b, u8 c)
{
u8 *script = TryGetScriptOnPressingA(position, b, c);
-
+
if (script == NULL)
return FALSE;
-
+
if (script != gUnknown_0815281E
&& script != gUnknown_08152C39
&& script != gUnknown_0815F36C
&& script != gUnknown_0815F43A
&& script != gUnknown_081A0009)
PlaySE(5);
-
+
ScriptContext1_SetupScript(script);
return TRUE;
}
-u8 *sub_8068364();
-u8 *TryGetInvisibleMapObjectScript();
-u8 *sub_8068500();
-u8 *TryGetFieldMoveScript();
-
-u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c)
+static u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c)
{
u8 *script;
-
+
script = sub_8068364(position, b, c);
if (script != NULL)
return script;
@@ -224,6 +283,605 @@ u8 *TryGetScriptOnPressingA(struct MapPosition *position, u8 b, u8 c)
script = TryGetFieldMoveScript(position, b, c);
if (script != NULL)
return script;
-
+
return NULL;
}
+
+u8 *sub_80682A8(struct MapPosition *position, u8 unused, u8 c)
+{
+ u8 r3;
+ s32 i;
+
+ if (!MetatileBehavior_IsCounter(MapGridGetMetatileBehaviorAt(position->x, position->y)))
+ r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height);
+ else
+ r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height);
+ if (r3 == 16 || gMapObjects[r3].localId == 0xFF)
+ return NULL;
+ for (i = 0; i < 4; i++)
+ {
+ if (gLinkPlayerMapObjects[i].active == TRUE && gLinkPlayerMapObjects[i].mapObjId == r3)
+ return NULL;
+ }
+ gSelectedMapObject = r3;
+ gScriptLastTalked = gMapObjects[r3].localId;
+ gScriptFacing = c;
+ return GetFieldObjectScriptPointerByFieldObjectId(r3);
+}
+
+static u8 *sub_8068364(struct MapPosition *position, u8 b, u8 c)
+{
+ u8 r3;
+ u8 *script;
+
+ r3 = GetFieldObjectIdByXYZ(position->x, position->y, position->height);
+ if (r3 == 16 || gMapObjects[r3].localId == 0xFF)
+ {
+ if (MetatileBehavior_IsCounter(b) != TRUE)
+ return NULL;
+ r3 = GetFieldObjectIdByXYZ(position->x + gUnknown_0821664C[c].x, position->y + gUnknown_0821664C[c].y, position->height);
+ if (r3 == 16 || gMapObjects[r3].localId == 0xFF)
+ return NULL;
+ }
+ //_080683E8
+ gSelectedMapObject = r3;
+ gScriptLastTalked = gMapObjects[r3].localId;
+ gScriptFacing = c;
+ script = GetFieldObjectScriptPointerByFieldObjectId(r3);
+ script = GetRamScript(gScriptLastTalked, script);
+ return script;
+}
+
+static u8 *TryGetInvisibleMapObjectScript(struct MapPosition *position, u8 unused, u8 c)
+{
+ struct BgEvent *bgEvent = FindInvisibleMapObjectByPosition(&gMapHeader, position->x - 7, position->y - 7, position->height);
+
+ if (bgEvent == NULL)
+ return NULL;
+ if (bgEvent->bgUnion.script == NULL)
+ 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;
+ }
+ return NULL;
+ }
+ return bgEvent->bgUnion.script;
+}
+
+static u8 *sub_8068500(struct MapPosition *position, u8 b, u8 c)
+{
+ s8 height;
+
+ if (MetatileBehavior_IsPlayerFacingTVScreen(b, c) == TRUE)
+ return Event_TV;
+ if (MetatileBehavior_IsPC(b) == TRUE)
+ return gUnknown_081A0009;
+ if (MetatileBehavior_IsClosedSootopolisGymDoor(b) == TRUE)
+ return ClosedSootopolisGymDoorScript;
+ if (is_tile_x84(b) == TRUE)
+ return gUnknown_081A4363;
+ if (MetatileBehavior_IsPokeblockFeeder(b) == TRUE)
+ return gUnknown_081C346A;
+ if (MetatileBehavior_IsTrickHousePuzzleDoor(b) == TRUE)
+ return gUnknown_081616E1;
+ if (MetatileBehavior_IsRegionMap(b) == TRUE)
+ return Event_WorldMap;
+ if (sub_805791C(b) == TRUE)
+ return Event_RunningShoesManual;
+ if (MetatileBehavior_IsPictureBookShelf(b) == TRUE)
+ return PictureBookShelfScript;
+ if (MetatileBehavior_IsBookShelf(b) == TRUE)
+ return BookshelfScript;
+ if (MetatileBehavior_IsPokeCenterBookShelf(b) == TRUE)
+ return PokemonCenterBookshelfScript;
+ if (MetatileBehavior_IsVase(b) == TRUE)
+ return VaseScript;
+ if (MetatileBehavior_IsTrashCan(b) == TRUE)
+ return TrashCanScript;
+ if (MetatileBehavior_IsShopShelf(b) == TRUE)
+ return ShopShelfScript;
+ if (MetatileBehavior_IsBlueprint(b) == TRUE)
+ return BlueprintScript;
+ height = position->height;
+ if (height == MapGridGetZCoordAt(position->x, position->y))
+ {
+ if (MetatileBehavior_IsSecretBasePC(b) == TRUE)
+ return gUnknown_0815F36C;
+ if (sub_805724C(b) == TRUE)
+ return gUnknown_0815F43A;
+ if (sub_8057364(b) == TRUE)
+ return gUnknown_0815F523;
+ if (sub_8057378(b) == TRUE)
+ return gUnknown_0815F528;
+ }
+ return NULL;
+}
+
+static u8 *TryGetFieldMoveScript(struct MapPosition *unused1, u8 b, u8 unused2)
+{
+ if (FlagGet(BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE)
+ return UseSurfScript;
+ if (MetatileBehavior_IsWaterfall(b) == TRUE)
+ {
+ if (FlagGet(BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE)
+ return UseWaterfallScript;
+ else
+ return CannotUseWaterfallScript;
+ }
+ return NULL;
+}
+
+static bool32 sub_8068770(void)
+{
+ if (FlagGet(BADGE07_GET) && sub_8068F18() == 2)
+ {
+ ScriptContext1_SetupScript(UseDiveScript);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_80687A4(void)
+{
+ if (FlagGet(BADGE07_GET) && gMapHeader.mapType == 5 && sub_8068F18() == 1)
+ {
+ ScriptContext1_SetupScript(UnderwaterUseDiveScript);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_80687E4(struct MapPosition *position, u16 b, u16 unused)
+{
+ if (mapheader_trigger_activate_at__run_now(position) == TRUE)
+ return TRUE;
+ if (sub_8068A64(position, b) == TRUE)
+ return TRUE;
+ if (sub_8068870(b) == TRUE)
+ return TRUE;
+ if (sub_8068894() == TRUE)
+ return TRUE;
+ if (UpdateRepelCounter() == TRUE)
+ return TRUE;
+ return FALSE;
+}
+
+bool8 mapheader_trigger_activate_at__run_now(struct MapPosition *position)
+{
+ u8 *script = mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height);
+
+ if (script == NULL)
+ return FALSE;
+ ScriptContext1_SetupScript(script);
+ return TRUE;
+}
+
+//can be u8, u16, or u32
+bool8 sub_8068870(u16 a)
+{
+ if (MetatileBehavior_IsCrackedFloorHole(a))
+ {
+ ScriptContext1_SetupScript(GraniteCave_B1F_EventScript_1C6BC5);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8068894(void)
+{
+ sub_8082B78();
+ happiness_algorithm_step();
+ if (overworld_poison_step() == TRUE)
+ {
+ ScriptContext1_SetupScript(gUnknown_081A14B8);
+ return TRUE;
+ }
+ if (sub_80422A0())
+ {
+ IncrementGameStat(13);
+ ScriptContext1_SetupScript(Event_EggHatch);
+ return TRUE;
+ }
+ if (SafariZoneTakeStep() == TRUE)
+ return TRUE;
+ if (sub_810D9B0(1) == TRUE)
+ {
+ ScriptContext1_SetupScript(gUnknown_0815FD0D);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void unref_sub_80688F8(void)
+{
+ VarSet(VAR_HAPPINESS_STEP_COUNTER, 0);
+}
+
+static void happiness_algorithm_step(void)
+{
+ u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER);
+ int i;
+
+ (*ptr)++;
+ (*ptr) %= 128;
+ if (*ptr == 0)
+ {
+ struct Pokemon *pkmn = gPlayerParty;
+
+ for (i = 5; i >= 0; i--)
+ {
+ AdjustFriendship(pkmn, 5);
+ pkmn++;
+ }
+ }
+}
+
+void overworld_poison_timer_set(void)
+{
+ VarSet(VAR_POISON_STEP_COUNTER, 0);
+}
+
+static bool8 overworld_poison_step(void)
+{
+ u16 *ptr;
+
+ if (gMapHeader.mapType != 9)
+ {
+ ptr = GetVarPointer(VAR_POISON_STEP_COUNTER);
+ (*ptr)++;
+ (*ptr) %= 4;
+ if (*ptr == 0)
+ {
+ switch (overworld_poison())
+ {
+ case 0:
+ return FALSE;
+ case 1:
+ return FALSE;
+ case 2:
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+void prev_quest_postbuffer_cursor_backup_reset(void)
+{
+ gUnknown_0202E8C0 = 0;
+}
+
+static bool8 is_it_battle_time_3(u16 a)
+{
+ if (gUnknown_0202E8C0 < 4)
+ {
+ gUnknown_0202E8C0++;
+ gUnknown_0202E8C2 = a;
+ return FALSE;
+ }
+ if (StandardWildEncounter(a, gUnknown_0202E8C2) == TRUE)
+ {
+ gUnknown_0202E8C0 = 0;
+ gUnknown_0202E8C2 = a;
+ return TRUE;
+ }
+ else
+ {
+ gUnknown_0202E8C2 = a;
+ return FALSE;
+ }
+}
+
+static bool8 mapheader_run_first_tag2_script_list_match_conditionally(struct MapPosition *position, u16 b, u8 c)
+{
+ s8 r6 = map_warp_check_packed(&gMapHeader, position);
+
+ if (is_non_stair_warp_tile(b, c) == TRUE && r6 != -1)
+ {
+ walkrun_find_lowest_active_bit_in_bitfield();
+ sub_8068C30(&gMapHeader, r6, position);
+ sub_8080E88();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8068A64(struct MapPosition *position, u16 b)
+{
+ s8 r4 = map_warp_check_packed(&gMapHeader, position);
+
+ if (r4 != -1 && sub_8068B30(b) == TRUE)
+ {
+ walkrun_find_lowest_active_bit_in_bitfield();
+ sub_8068C30(&gMapHeader, r4, position);
+ if (MetatileBehavior_IsEscalator(b) == TRUE)
+ {
+ sub_8080F2C(b);
+ return TRUE;
+ }
+ if (MetatileBehavior_IsLavaridgeB1FWarp(b) == TRUE)
+ {
+ sub_8080F48();
+ return TRUE;
+ }
+ if (MetatileBehavior_IsLavaridge1FWarp(b) == TRUE)
+ {
+ sub_8080F58();
+ return TRUE;
+ }
+ if (MetatileBehavior_IsAquaHideoutWarp(b) == TRUE)
+ {
+ sub_8080F68();
+ return TRUE;
+ }
+ if (MetatileBehavior_IsMtPyreHole(b) == TRUE)
+ {
+ ScriptContext1_SetupScript(gUnknown_081C6BDE);
+ return TRUE;
+ }
+ sub_8080E88();
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_8068B30(u16 a)
+{
+ if (MetatileBehavior_IsWarpDoor(a) != TRUE
+ && MetatileBehavior_IsLadder(a) != TRUE
+ && MetatileBehavior_IsEscalator(a) != TRUE
+ && MetatileBehavior_IsNonAnimDoor(a) != TRUE
+ && MetatileBehavior_IsLavaridgeB1FWarp(a) != TRUE
+ && MetatileBehavior_IsLavaridge1FWarp(a) != TRUE
+ && MetatileBehavior_IsAquaHideoutWarp(a) != TRUE
+ && MetatileBehavior_IsMtPyreHole(a) != TRUE)
+ return FALSE;
+ return TRUE;
+}
+
+static bool8 is_non_stair_warp_tile(u16 a, u8 b)
+{
+ switch (b)
+ {
+ case 2:
+ return MetatileBehavior_IsNorthArrowWarp(a);
+ case 1:
+ return MetatileBehavior_IsSouthArrowWarp(a);
+ case 3:
+ return MetatileBehavior_IsWestArrowWarp(a);
+ case 4:
+ return MetatileBehavior_IsEastArrowWarp(a);
+ }
+ return FALSE;
+}
+
+static s8 map_warp_check_packed(struct MapHeader *mapHeader, struct MapPosition *position)
+{
+ return map_warp_check(mapHeader, position->x - 7, position->y - 7, position->height);
+}
+
+static void sub_8068C30(struct MapHeader *unused, s8 b, struct MapPosition *position)
+{
+ struct WarpEvent *warpEvent = &gMapHeader.events->warps[b];
+
+ if (warpEvent->mapNum == 0x7F)
+ {
+ copy_saved_warp2_bank_and_enter_x_to_warp1(warpEvent->mapGroup);
+ }
+ else
+ {
+ struct MapHeader *mapHeader;
+
+ warp1_set_2(warpEvent->unk7, warpEvent->mapNum, warpEvent->mapGroup);
+ sub_80535C4(position->x, position->y);
+ mapHeader = get_mapheader_by_bank_and_number(warpEvent->unk7, warpEvent->mapNum);
+ if (mapHeader->events->warps[warpEvent->mapGroup].mapNum == 0x7F)
+ saved_warp2_set(mapHeader->events->warps[b].mapGroup, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, b);
+ }
+}
+
+static bool8 map_warp_consider_2_to_inside(struct MapPosition *position, u16 b, u8 c)
+{
+ s8 r4;
+
+ if (c == 2)
+ {
+ if (sub_80571C0(b) == TRUE)
+ {
+ sub_80BC038(position, gMapHeader.events);
+ return TRUE;
+ }
+ if (MetatileBehavior_IsWarpDoor(b) == TRUE)
+ {
+ r4 = map_warp_check_packed(&gMapHeader, position);
+ if (r4 != -1 && sub_8068B30(b) == TRUE)
+ {
+ walkrun_find_lowest_active_bit_in_bitfield();
+ sub_8068C30(&gMapHeader, r4, position);
+ sub_8080EF0();
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+static s8 map_warp_check(struct MapHeader *mapHeader, u16 b, u16 c, u8 d)
+{
+ s32 i;
+ struct WarpEvent *warpEvent = mapHeader->events->warps;
+ u8 warpCount = mapHeader->events->warpCount;
+
+ for (i = 0; i < warpCount; i++, warpEvent++)
+ {
+ if ((u16)warpEvent->x == b && (u16)warpEvent->y == c)
+ {
+ if ((u8)warpEvent->warpId == d || (u8)warpEvent->warpId == 0)
+ return i;
+ }
+ }
+ return -1;
+}
+
+static u8 *trigger_activate(struct CoordEvent *coordEvent)
+{
+ if (coordEvent != NULL)
+ {
+ if (coordEvent->script == NULL)
+ {
+ DoCoordEventWeather(coordEvent->trigger);
+ return NULL;
+ }
+ if (coordEvent->trigger == 0)
+ {
+ ScriptContext2_RunNewScript(coordEvent->script);
+ return NULL;
+ }
+ if (VarGet(coordEvent->trigger) == (u8)coordEvent->index)
+ return coordEvent->script;
+ }
+ return NULL;
+}
+
+static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 b, u16 c, u8 d)
+{
+ s32 i;
+ struct CoordEvent *coordEvents = mapHeader->events->coordEvents;
+ u8 coordEventCount = mapHeader->events->coordEventCount;
+ u8 *script;
+
+ for (i = 0; i < coordEventCount; i++)
+ {
+ if ((u16)coordEvents[i].x == b && (u16)coordEvents[i].y == c)
+ {
+ if (coordEvents[i].unk4 == d || coordEvents[i].unk4 == 0)
+ {
+ script = trigger_activate(&coordEvents[i]);
+ if (script != NULL)
+ return script;
+ }
+ }
+ }
+ return NULL;
+}
+
+u8 *sub_8068E24(struct MapPosition *position)
+{
+ return mapheader_trigger_activate_at(&gMapHeader, position->x - 7, position->y - 7, position->height);
+}
+
+static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHeader, u16 b, u16 c, u8 d)
+{
+ u8 i;
+ struct BgEvent *bgEvents = mapHeader->events->bgEvents;
+ u8 bgEventCount = mapHeader->events->bgEventCount;
+
+ for (i = 0; i < bgEventCount; i++)
+ {
+ if ((u16)bgEvents[i].x == b && (u16)bgEvents[i].y == c)
+ {
+ if (bgEvents[i].unk4 == d || bgEvents[i].unk4 == 0)
+ return &bgEvents[i];
+ }
+ }
+ return NULL;
+}
+
+int dive_warp(struct MapPosition *position, u16 b)
+{
+ if (gMapHeader.mapType == 5 && sub_805750C(b) == 0)
+ {
+ if (sub_80538B0(position->x - 7, position->y - 7))
+ {
+ walkrun_find_lowest_active_bit_in_bitfield();
+ sp13E_warp_to_last_warp();
+ PlaySE(SE_W291);
+ return TRUE;
+ }
+ }
+ else if (sub_80574EC(b) == TRUE)
+ {
+ if (sub_80538D0(position->x - 7, position->y - 7))
+ {
+ walkrun_find_lowest_active_bit_in_bitfield();
+ sp13E_warp_to_last_warp();
+ PlaySE(SE_W291);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+u8 sub_8068F18(void)
+{
+ s16 x, y;
+ u8 r5;
+
+ PlayerGetDestCoords(&x, &y);
+ r5 = MapGridGetMetatileBehaviorAt(x, y);
+ if (gMapHeader.mapType == 5 && sub_805750C(r5) == 0)
+ {
+ if (sub_80538B0(x - 7, y - 7) == TRUE)
+ return 1;
+ }
+ else if (sub_80574EC(r5) == TRUE)
+ {
+ if (sub_80538D0(x - 7, y - 7) == TRUE)
+ return 2;
+ }
+ return 0;
+}
+
+u8 *GetFieldObjectScriptPointerForComparison(void)
+{
+ u8 r4;
+ struct MapPosition position;
+
+ r4 = player_get_direction_upper_nybble();
+ player_get_next_pos_and_height(&position);
+ return sub_8068364(&position, MapGridGetMetatileBehaviorAt(position.x, position.y), r4);
+}
+
+int sub_8068FEC(void)
+{
+ struct MapPosition position;
+
+ player_get_direction_upper_nybble(); //unnecessary
+ player_get_pos_to_and_height(&position);
+ MapGridGetMetatileBehaviorAt(position.x, position.y); //unnecessary
+ sub_8068C30(&gMapHeader, map_warp_check_packed(&gMapHeader, &position), &position);
+ return 0;
+}
diff --git a/src/field_door.c b/src/field_door.c
index 85a5965a0..4b1390d11 100644
--- a/src/field_door.c
+++ b/src/field_door.c
@@ -1,22 +1,9 @@
#include "global.h"
#include "asm.h"
-#include "task.h"
#include "field_camera.h"
#include "metatile_behavior.h"
-
-struct DoorGraphics
-{
- u16 metatileNum;
- u8 unk2;
- void *tiles;
- void *palette;
-};
-
-struct DoorAnimFrame
-{
- u8 time;
- u16 offset;
-};
+#include "task.h"
+#include "field_door.h"
extern struct DoorAnimFrame gDoorOpenAnimFrames[];
extern struct DoorAnimFrame gDoorCloseAnimFrames[];
@@ -31,7 +18,7 @@ static void door_build_blockdef(u16 *a, u16 b, u8 *c)
{
int i;
u16 unk;
-
+
for (i = 0; i < 4; i++)
{
unk = *(c++) << 12;
@@ -47,7 +34,7 @@ static void door_build_blockdef(u16 *a, u16 b, u8 *c)
static void DrawCurrentDoorAnimFrame(u32 x, u32 y, u8 *c)
{
u16 arr[8];
-
+
door_build_blockdef(arr, 0x3F8, c);
DrawDoorMetatileAt(x, y - 1, arr);
door_build_blockdef(arr, 0x3FC, c + 4);
@@ -103,7 +90,7 @@ static void Task_AnimateDoor(u8 taskId)
u16 *taskData = gTasks[taskId].data;
struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]);
struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]);
-
+
if (sub_8058464(gfx, frames, taskData) == FALSE)
DestroyTask(taskId);
}
@@ -134,16 +121,16 @@ static s8 StartDoorAnimationTask(struct DoorGraphics *gfx, struct DoorAnimFrame
{
u8 taskId = CreateTask(Task_AnimateDoor, 0x50);
s16 *taskData = gTasks[taskId].data;
-
+
taskData[TD_X] = x;
taskData[TD_Y] = y;
-
+
taskData[TD_FRAMELIST + 1] = (u32)frames;
taskData[TD_FRAMELIST] = (u32)frames >> 16;
-
+
taskData[TD_GFX + 1] = (u32)gfx;
taskData[TD_GFX] = (u32)gfx >> 16;
-
+
return taskId;
}
}
diff --git a/src/field_effect.c b/src/field_effect.c
index fe586fcb6..b0c028c8d 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -1,7 +1,8 @@
#include "global.h"
#include "field_effect.h"
-#include "weather.h"
#include "sprite.h"
+#include "text.h"
+#include "weather.h"
typedef bool8 (*FldEffCmd)(u8 **, u32 *);
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
new file mode 100644
index 000000000..e56ea9787
--- /dev/null
+++ b/src/field_map_obj.c
@@ -0,0 +1,1549 @@
+#include "global.h"
+#include "asm.h"
+#include "berry.h"
+#include "event_data.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
+#include "palette.h"
+#include "rom4.h"
+#include "sprite.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();
+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 RemoveFieldObjectInternal(struct MapObject *);
+u16 GetFieldObjectFlagIdByFieldObjectId(u8);
+void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables);
+struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8, u8, u8);
+void GetFieldObjectMovingCameraOffset(s16 *, s16 *);
+void sub_805BDF8(u16);
+u8 sub_805BE58(const struct SpritePalette *);
+u8 FindFieldObjectPaletteIndexByTag(u16);
+
+struct PairedPalettes
+{
+ u16 tag;
+ u16 *data;
+};
+
+extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
+extern u8 gReservedSpritePaletteCount;
+extern struct Camera gUnknown_0202E844;
+extern u8 gUnknown_030005A4;
+extern u16 gUnknown_030005A6;
+extern const u8 gUnknown_0836DBBC[];
+extern const u8 gUnknown_0836DC09[];
+extern void (*const gUnknown_0836DA88[])(struct Sprite *);
+extern const u8 *const gBerryTreeGraphicsIdTablePointers[];
+extern const struct SpriteFrameImage *const gBerryTreePicTablePointers[];
+extern const u8 *const gBerryTreePaletteSlotTablePointers[];
+extern const struct MapObjectGraphicsInfo *const gMapObjectGraphicsInfoPointers[];
+extern const struct SpritePalette gUnknown_0837377C[];
+extern const struct PairedPalettes gUnknown_08373874[];
+extern const struct PairedPalettes gUnknown_083738E4[];
+extern const struct SpriteTemplate gSpriteTemplate_830FD24;
+extern const u16 *const gUnknown_0837399C[];
+
+void npc_clear_ids_and_state(struct MapObject *mapObj)
+{
+ memset(mapObj, 0, sizeof(struct MapObject));
+ mapObj->localId = 0xFF;
+ mapObj->mapNum = 0xFF;
+ mapObj->mapGroup = 0xFF;
+ mapObj->mapobj_unk_1C = 0xFF;
+}
+
+void npcs_clear_ids_and_state(void)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ npc_clear_ids_and_state(&gMapObjects[i]);
+}
+
+void sub_805AA98(void)
+{
+ strange_npc_table_clear();
+ npcs_clear_ids_and_state();
+ ClearPlayerAvatarInfo();
+ sub_805AAB0();
+}
+
+void sub_805AAB0(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F);
+
+ gSprites[spriteId].oam.affineMode = 1;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], 0);
+ gSprites[spriteId].invisible = 1;
+
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 0x1F);
+
+ gSprites[spriteId].oam.affineMode = 1;
+ InitSpriteAffineAnim(&gSprites[spriteId]);
+ StartSpriteAffineAnim(&gSprites[spriteId], 1);
+ gSprites[spriteId].invisible = 1;
+}
+
+u8 sub_805AB54(void)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (!gMapObjects[i].active)
+ break;
+ }
+ return i;
+}
+
+u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ if (localId <= 0xFE)
+ return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup);
+ else
+ return GetFieldObjectIdByLocalId(localId);
+}
+
+bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId)
+{
+ *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup);
+ if (*mapObjectId == 16)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u8 GetFieldObjectIdByXY(s16 x, s16 y)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y)
+ break;
+ }
+ return i;
+}
+
+u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup)
+ return i;
+ }
+ return 16;
+}
+
+u8 GetFieldObjectIdByLocalId(u8 localId)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].localId == localId)
+ return i;
+ }
+ return 16;
+}
+
+#ifdef NONMATCHING
+u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
+{
+ struct MapObject2 *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
+ u8 var;
+ u16 r3;
+ u16 r2;
+
+ //asm("nop"::"r"(b));
+ if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0)
+ return 16;
+ //_0805ACCE
+ mapObj = (struct MapObject2 *)&gMapObjects[var];
+ npc_clear_ids_and_state((struct MapObject *)mapObj);
+ r3 = template->x + 7;
+ r2 = template->y + 7;
+ mapObj->active = TRUE;
+ mapObj->mapobj_bit_2 = TRUE;
+ mapObj->graphicsId = template->graphicsId;
+ mapObj->animPattern = template->movementType;
+ mapObj->localId = template->localId;
+ mapObj->mapNum = b;
+ mapObj->mapGroup = c;
+ mapObj->coords1.x = r3;
+ mapObj->coords1.y = r2;
+ mapObj->coords2.x = r3;
+ mapObj->coords2.y = r2;
+ mapObj->coords3.x = r3;
+ mapObj->coords3.y = r2;
+ mapObj->mapobj_unk_0B_0 = template->elevation;
+ mapObj->elevation = template->elevation;
+ mapObj->mapobj_unk_19 = template->unkA_0;
+ mapObj->mapobj_unk_19b = template->unkA_4;
+ mapObj->trainerType = template->unkC;
+ mapObj->trainerRange_berryTreeId = template->unkE;
+ mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType];
+ FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20);
+ FieldObjectHandleDynamicGraphicsId(mapObj);
+ //asm("":::"r5","r6");
+ if (gUnknown_0836DBBC[mapObj->animPattern] != 0)
+ {
+ if (mapObj->mapobj_unk_19 == 0)
+ mapObj->mapobj_unk_19++;
+ if (mapObj->mapobj_unk_19b == 0)
+ mapObj->mapobj_unk_19b++;
+ }
+ return var;
+}
+#else
+__attribute__((naked))
+u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ sub sp, 0x4\n\
+ adds r5, r0, 0\n\
+ lsls r1, 24\n\
+ lsrs r6, r1, 24\n\
+ lsls r2, 24\n\
+ lsrs r7, r2, 24\n\
+ ldrb r0, [r5]\n\
+ adds r1, r6, 0\n\
+ adds r2, r7, 0\n\
+ mov r3, sp\n\
+ bl GetAvailableFieldObjectSlot\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _0805ACCE\n\
+ movs r0, 0x10\n\
+ b _0805ADC2\n\
+_0805ACCE:\n\
+ mov r0, sp\n\
+ ldrb r1, [r0]\n\
+ lsls r0, r1, 3\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ ldr r1, _0805ADD0 @ =gMapObjects\n\
+ adds r4, r0, r1\n\
+ adds r0, r4, 0\n\
+ bl npc_clear_ids_and_state\n\
+ ldrh r3, [r5, 0x4]\n\
+ adds r3, 0x7\n\
+ lsls r3, 16\n\
+ lsrs r3, 16\n\
+ ldrh r2, [r5, 0x6]\n\
+ adds r2, 0x7\n\
+ lsls r2, 16\n\
+ lsrs r2, 16\n\
+ ldrb r0, [r4]\n\
+ movs r1, 0x1\n\
+ orrs r0, r1\n\
+ movs r1, 0x4\n\
+ orrs r0, r1\n\
+ strb r0, [r4]\n\
+ ldrb r0, [r5, 0x1]\n\
+ strb r0, [r4, 0x5]\n\
+ ldrb r0, [r5, 0x9]\n\
+ strb r0, [r4, 0x6]\n\
+ ldrb r0, [r5]\n\
+ strb r0, [r4, 0x8]\n\
+ strb r6, [r4, 0x9]\n\
+ strb r7, [r4, 0xA]\n\
+ strh r3, [r4, 0xC]\n\
+ strh r2, [r4, 0xE]\n\
+ strh r3, [r4, 0x10]\n\
+ strh r2, [r4, 0x12]\n\
+ strh r3, [r4, 0x14]\n\
+ strh r2, [r4, 0x16]\n\
+ ldrb r0, [r5, 0x8]\n\
+ movs r7, 0xF\n\
+ adds r1, r7, 0\n\
+ ands r1, r0\n\
+ ldrb r2, [r4, 0xB]\n\
+ movs r0, 0x10\n\
+ negs r0, r0\n\
+ mov r8, r0\n\
+ ands r0, r2\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0xB]\n\
+ ldrb r1, [r5, 0x8]\n\
+ lsls r1, 4\n\
+ ands r0, r7\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0xB]\n\
+ ldrb r1, [r5, 0xA]\n\
+ lsls r1, 28\n\
+ movs r0, 0xF\n\
+ mov r9, r0\n\
+ lsrs r1, 28\n\
+ ldrb r2, [r4, 0x19]\n\
+ mov r0, r8\n\
+ ands r0, r2\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x19]\n\
+ ldrb r1, [r5, 0xA]\n\
+ lsrs r1, 4\n\
+ lsls r1, 4\n\
+ ands r0, r7\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x19]\n\
+ ldrh r0, [r5, 0xC]\n\
+ strb r0, [r4, 0x7]\n\
+ ldrh r0, [r5, 0xE]\n\
+ strb r0, [r4, 0x1D]\n\
+ ldr r1, _0805ADD4 @ =gUnknown_0836DC09\n\
+ ldrb r0, [r5, 0x9]\n\
+ adds r0, r1\n\
+ ldrb r1, [r0]\n\
+ adds r0, r4, 0\n\
+ adds r0, 0x20\n\
+ strb r1, [r0]\n\
+ ldrb r1, [r0]\n\
+ adds r0, r4, 0\n\
+ bl FieldObjectSetDirection\n\
+ adds r0, r4, 0\n\
+ bl FieldObjectHandleDynamicGraphicsId\n\
+ ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\
+ ldrb r0, [r4, 0x6]\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _0805ADBE\n\
+ ldrb r2, [r4, 0x19]\n\
+ adds r0, r7, 0\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ bne _0805ADA6\n\
+ lsls r0, r2, 28\n\
+ lsrs r0, 28\n\
+ adds r0, 0x1\n\
+ mov r1, r9\n\
+ ands r0, r1\n\
+ mov r1, r8\n\
+ ands r1, r2\n\
+ orrs r1, r0\n\
+ strb r1, [r4, 0x19]\n\
+_0805ADA6:\n\
+ ldrb r2, [r4, 0x19]\n\
+ movs r0, 0xF0\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ bne _0805ADBE\n\
+ lsrs r1, r2, 4\n\
+ adds r1, 0x1\n\
+ lsls r1, 4\n\
+ adds r0, r7, 0\n\
+ ands r0, r2\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x19]\n\
+_0805ADBE:\n\
+ mov r0, sp\n\
+ ldrb r0, [r0]\n\
+_0805ADC2:\n\
+ add sp, 0x4\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\
+_0805ADD0: .4byte gMapObjects\n\
+_0805ADD4: .4byte gUnknown_0836DC09\n\
+_0805ADD8: .4byte gUnknown_0836DBBC\n\
+ .syntax divided\n");
+}
+#endif
+
+u8 sub_805ADDC(u8 localId)
+{
+ u8 objectCount;
+ u8 i;
+
+ if (gMapHeader.events == NULL)
+ return 16;
+ objectCount = gMapHeader.events->mapObjectCount;
+ for (i = 0; i < objectCount; i++)
+ {
+ struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i];
+
+ if (template->localId == localId && !FlagGet(template->flagId))
+ return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
+ }
+ return 16;
+}
+
+u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d)
+{
+ u8 i = 0;
+
+ for (i = 0; i < 16 && gMapObjects[i].active; i++)
+ {
+ if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c)
+ return 1;
+ }
+ if (i >= 16)
+ return 1;
+ *d = i;
+ for (; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c)
+ return 1;
+ }
+ return 0;
+}
+
+void RemoveFieldObject(struct MapObject *mapObject)
+{
+ mapObject->active = FALSE;
+ RemoveFieldObjectInternal(mapObject);
+}
+
+void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 mapObjectId;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ return;
+ FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId));
+ RemoveFieldObject(&gMapObjects[mapObjectId]);
+}
+
+void RemoveFieldObjectInternal(struct MapObject *mapObject)
+{
+ struct SpriteFrameImage image;
+ const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+
+ image.size = gfxInfo->size;
+ gSprites[mapObject->spriteId].images = &image;
+ DestroySprite(&gSprites[mapObject->spriteId]);
+}
+
+void npc_hide_all_but_player(void)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (i != gPlayerAvatar.mapObjectId)
+ RemoveFieldObject(&gMapObjects[i]);
+ }
+}
+
+u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f)
+{
+ u8 mapObjectId;
+ u8 spriteId;
+ const struct MapObjectGraphicsInfo *gfxInfo;
+ struct MapObject *mapObject;
+ struct Sprite *sprite;
+
+ mapObjectId = InitFieldObjectStateFromTemplate(mapObjTemplate, c, d);
+ if (mapObjectId == 16)
+ return 16;
+
+ mapObject = &gMapObjects[mapObjectId];
+ gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+ if (gfxInfo->paletteSlot == 0)
+ npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ else if (gfxInfo->paletteSlot == 10)
+ npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ if (mapObject->animPattern == 0x4C)
+ mapObject->mapobj_bit_13 = TRUE;
+
+#ifdef NONMATCHING
+ sprTemplate->paletteTag = 0xFFFF;
+#else
+ *(u16 *)&sprTemplate->paletteTag = 0xFFFF;
+#endif
+ spriteId = CreateSprite(sprTemplate, 0, 0, 0);
+ if (spriteId == 64)
+ {
+ gMapObjects[mapObjectId].active = FALSE;
+ return 16;
+ }
+ sprite = &gSprites[spriteId];
+ sub_8060388(e + mapObject->coords2.x, f + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->centerToCornerVecX = -(gfxInfo->width >> 1);
+ sprite->centerToCornerVecY = -(gfxInfo->height >> 1);
+ sprite->pos1.x += 8;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ sprite->oam.paletteNum = gfxInfo->paletteSlot;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data0 = mapObjectId;
+ mapObject->spriteId = spriteId;
+ mapObject->mapobj_bit_12 = gfxInfo->inanimate;
+ if (!mapObject->mapobj_bit_12)
+ StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18));
+ SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1);
+ sub_80634D0(mapObject, sprite);
+ return mapObjectId;
+}
+
+u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e)
+{
+ struct SpriteTemplate spriteTemplate;
+ struct SubspriteTable *subspriteTables = NULL;
+ struct SpriteFrameImage spriteFrameImage;
+ const struct MapObjectGraphicsInfo *gfxInfo;
+ u8 mapObjectId;
+
+ gfxInfo = GetFieldObjectGraphicsInfo(mapObjTemplate->graphicsId);
+ MakeObjectTemplateFromFieldObjectTemplate(mapObjTemplate, &spriteTemplate, &subspriteTables);
+ spriteFrameImage.size = gfxInfo->size;
+ spriteTemplate.images = &spriteFrameImage;
+ mapObjectId = sub_805AFCC(mapObjTemplate, &spriteTemplate, b, c, d, e);
+ if (mapObjectId == 16)
+ return 16;
+ gSprites[gMapObjects[mapObjectId].spriteId].images = gfxInfo->images;
+ if (subspriteTables != NULL)
+ SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables);
+ return mapObjectId;
+}
+
+u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjTemplate)
+{
+ s16 x;
+ s16 y;
+
+ GetFieldObjectMovingCameraOffset(&x, &y);
+ return SpawnFieldObject(mapObjTemplate, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, x, y);
+}
+
+u8 SpawnSpecialFieldObjectParametrized(u8 a, u8 b, u8 c, s16 d, s16 e, u8 f)
+{
+ struct MapObjectTemplate mapObjTemplate;
+
+ d -= 7;
+ e -= 7;
+ mapObjTemplate.localId = c;
+ mapObjTemplate.graphicsId = a;
+ mapObjTemplate.unk2 = 0;
+ mapObjTemplate.x = d;
+ mapObjTemplate.y = e;
+ mapObjTemplate.elevation = f;
+ mapObjTemplate.movementType = b;
+ mapObjTemplate.unkA_0 = 0;
+ mapObjTemplate.unkA_4 = 0;
+ mapObjTemplate.unkC = 0;
+ mapObjTemplate.unkE = 0;
+ return SpawnSpecialFieldObject(&mapObjTemplate);
+}
+
+u8 show_sprite(u8 a, u8 b, u8 c)
+{
+ struct MapObjectTemplate *r5;
+ s16 x;
+ s16 y;
+
+ r5 = GetFieldObjectTemplateByLocalIdAndMap(a, b, c);
+ if (r5 == NULL)
+ return 16;
+ GetFieldObjectMovingCameraOffset(&x, &y);
+ return SpawnFieldObject(r5, b, c, x, y);
+}
+
+void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables)
+{
+ const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId);
+
+ sprTemplate->tileTag = gfxInfo->tileTag;
+ sprTemplate->paletteTag = gfxInfo->paletteTag1;
+ sprTemplate->oam = gfxInfo->oam;
+ sprTemplate->anims = gfxInfo->anims;
+ sprTemplate->images = gfxInfo->images;
+ sprTemplate->affineAnims = gfxInfo->affineAnims;
+ sprTemplate->callback = callback;
+ *subspriteTables = gfxInfo->subspriteTables;
+}
+
+void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables)
+{
+ MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_0836DA88[callbackIndex], sprTemplate, subspriteTables);
+}
+
+void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, struct SubspriteTable **subspriteTables)
+{
+ MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables);
+}
+
+u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority)
+{
+ struct SpriteTemplate spriteTemplate;
+ struct SubspriteTable *subspriteTables;
+ u8 spriteId;
+
+ MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables);
+ if (spriteTemplate.paletteTag != 0xFFFF)
+ sub_805BDF8(spriteTemplate.paletteTag);
+ spriteId = CreateSprite(&spriteTemplate, c, d, subpriority);
+ if (spriteId != 64 && subspriteTables != NULL)
+ {
+ SetSubspriteTables(&gSprites[spriteId], subspriteTables);
+ gSprites[spriteId].subspriteMode = 2;
+ }
+ return spriteId;
+}
+
+extern void sub_8064970(struct Sprite *);
+extern void sub_8060470();
+extern void InitObjectPriorityByZCoord();
+
+u8 sub_805B410(u8 a, u8 b, s16 c, s16 d, u8 e, u8 f)
+{
+ const struct MapObjectGraphicsInfo *gfxInfo;
+ struct SpriteTemplate spriteTemplate;
+ struct SubspriteTable *subspriteTables;
+ u8 spriteId;
+
+ gfxInfo = GetFieldObjectGraphicsInfo(a);
+ MakeObjectTemplateFromFieldObjectGraphicsInfo(a, sub_8064970, &spriteTemplate, &subspriteTables);
+#ifdef NONMATCHING
+ spriteTemplate.paletteTag = 0xFFFF;
+#else
+ *(u16 *)&spriteTemplate.paletteTag = 0xFFFF;
+#endif
+ c += 7;
+ d += 7;
+ sub_8060470(&c, &d, 8, 16);
+ spriteId = CreateSpriteAtEnd(&spriteTemplate, c, d, 0);
+ if (spriteId != 64)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sprite->centerToCornerVecX = -(gfxInfo->width >> 1);
+ sprite->centerToCornerVecY = -(gfxInfo->height >> 1);
+ sprite->pos1.y += sprite->centerToCornerVecY;
+ sprite->oam.paletteNum = gfxInfo->paletteSlot;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data0 = b;
+ sprite->data1 = e;
+ if (gfxInfo->paletteSlot == 10)
+ npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ if (subspriteTables != NULL)
+ {
+ SetSubspriteTables(sprite, subspriteTables);
+ sprite->subspriteMode = 2;
+ }
+ InitObjectPriorityByZCoord(sprite, e);
+ SetObjectSubpriorityByZCoord(e, sprite, 1);
+ StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(f));
+ }
+ return spriteId;
+}
+
+void sub_805B55C(s16 a, s16 b)
+{
+ u8 i;
+
+ if (gMapHeader.events != NULL)
+ {
+ s16 r9 = gSaveBlock1.pos.x - 2;
+ s16 sp8 = gSaveBlock1.pos.x + 17;
+ s16 r10 = gSaveBlock1.pos.y;
+ s16 spC = gSaveBlock1.pos.y + 16;
+ u8 objectCount = gMapHeader.events->mapObjectCount;
+
+ for (i = 0; i < objectCount; i++)
+ {
+ struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i];
+ s16 foo = template->x + 7;
+ s16 bar = template->y + 7;
+
+ if (r10 <= bar && spC >= bar && r9 <= foo && sp8 >= foo
+ && !FlagGet(template->flagId))
+ SpawnFieldObject(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, a, b);
+ }
+ }
+}
+
+void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject);
+
+void RemoveFieldObjectsOutsideView(void)
+{
+ u8 i;
+ u8 j;
+
+ for (i = 0; i < 16; i++)
+ {
+ bool8 isActiveLinkPlayer;
+
+ for (j = 0, isActiveLinkPlayer = 0; j < 4; j++)
+ {
+ if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId)
+ isActiveLinkPlayer = TRUE;
+ }
+ if (!isActiveLinkPlayer)
+ {
+ struct MapObject *mapObject = &gMapObjects[i];
+
+ if (mapObject->active && !mapObject->mapobj_bit_16)
+ RemoveFieldObjectIfOutsideView(mapObject);
+ }
+ }
+}
+
+void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject)
+{
+ s16 r7 = gSaveBlock1.pos.x - 2;
+ s16 r5 = gSaveBlock1.pos.x + 17;
+ s16 r4 = gSaveBlock1.pos.y;
+ s16 r6 = gSaveBlock1.pos.y + 16;
+
+ if (mapObject->coords2.x >= r7 && mapObject->coords2.x <= r5
+ && mapObject->coords2.y >= r4 && mapObject->coords2.y <= r6)
+ return;
+ if (mapObject->coords1.x >= r7 && mapObject->coords1.x <= r5
+ && mapObject->coords1.y >= r4 && mapObject->coords1.y <= r6)
+ return;
+ RemoveFieldObject(mapObject);
+}
+
+void sub_805B75C(u8, s16, s16);
+
+void sub_805B710(u16 a, u16 b)
+{
+ u8 i;
+
+ ClearPlayerAvatarInfo();
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active)
+ sub_805B75C(i, a, b);
+ }
+ sub_805AAB0();
+}
+
+extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8);
+extern void sub_805B914(struct MapObject *);
+
+void sub_805B75C(u8 a, s16 b, s16 c)
+{
+ struct SpriteTemplate sp0;
+ struct SpriteFrameImage sp18;
+ struct SubspriteTable *subspriteTables;
+ const struct MapObjectGraphicsInfo *gfxInfo;
+ struct MapObject *mapObject;
+ u8 spriteId;
+
+ #define i spriteId
+ for (i = 0; i < 4; i++)
+ {
+ if (gLinkPlayerMapObjects[i].active && a == gLinkPlayerMapObjects[i].mapObjId)
+ return;
+ }
+ #undef i
+
+ mapObject = &gMapObjects[a];
+ asm("":::"r5");
+ subspriteTables = NULL;
+ gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+ sp18.size = gfxInfo->size;
+ MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &sp0, &subspriteTables);
+ sp0.images = &sp18;
+ *(u16 *)&sp0.paletteTag = 0xFFFF;
+ if (gfxInfo->paletteSlot == 0)
+ npc_load_two_palettes__no_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ if (gfxInfo->paletteSlot > 9)
+ npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ *(u16 *)&sp0.paletteTag = 0xFFFF;
+ spriteId = CreateSprite(&sp0, 0, 0, 0);
+ if (spriteId != 64)
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+
+ sub_8060388(b + mapObject->coords2.x, c + mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->centerToCornerVecX = -(gfxInfo->width >> 1);
+ sprite->centerToCornerVecY = -(gfxInfo->height >> 1);
+ sprite->pos1.x += 8;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ sprite->images = gfxInfo->images;
+ if (mapObject->animPattern == 11)
+ {
+ SetPlayerAvatarFieldObjectIdAndObjectId(a, spriteId);
+ mapObject->mapobj_unk_1B = sub_8126B54();
+ }
+ if (subspriteTables != NULL)
+ SetSubspriteTables(sprite, subspriteTables);
+ sprite->oam.paletteNum = gfxInfo->paletteSlot;
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->data0 = a;
+ mapObject->spriteId = spriteId;
+ if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 11)
+ StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18));
+ sub_805B914(mapObject);
+ SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1);
+ }
+}
+
+void sub_805B914(struct MapObject *mapObject)
+{
+ mapObject->mapobj_bit_1 = FALSE;
+ mapObject->mapobj_bit_2 = TRUE;
+ mapObject->mapobj_bit_22 = FALSE;
+ mapObject->mapobj_bit_17 = FALSE;
+ mapObject->mapobj_bit_18 = FALSE;
+ mapObject->mapobj_bit_19 = FALSE;
+ mapObject->mapobj_bit_20 = FALSE;
+ mapObject->mapobj_bit_21 = FALSE;
+ FieldObjectClearAnim(mapObject);
+}
+
+void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId)
+{
+ gPlayerAvatar.mapObjectId = mapObjectId;
+ gPlayerAvatar.spriteId = spriteId;
+ gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId);
+ SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20);
+}
+
+void sub_805B980(struct MapObject *mapObject, u8 graphicsId)
+{
+ const struct MapObjectGraphicsInfo *gfxInfo;
+ struct Sprite *sprite;
+
+ gfxInfo = GetFieldObjectGraphicsInfo(graphicsId);
+ sprite = &gSprites[mapObject->spriteId];
+ if (gfxInfo->paletteSlot == 0)
+ pal_patch_for_npc(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ if (gfxInfo->paletteSlot == 10)
+ npc_load_two_palettes__and_record(gfxInfo->paletteTag1, gfxInfo->paletteSlot);
+ sprite->oam.shape = gfxInfo->oam->shape;
+ sprite->oam.size = gfxInfo->oam->size;
+ sprite->images = gfxInfo->images;
+ sprite->anims = gfxInfo->anims;
+ sprite->subspriteTables = gfxInfo->subspriteTables;
+ sprite->oam.paletteNum = gfxInfo->paletteSlot;
+ mapObject->mapobj_bit_12 = gfxInfo->inanimate;
+ mapObject->graphicsId = graphicsId;
+ sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->centerToCornerVecX = -(gfxInfo->width >> 1);
+ sprite->centerToCornerVecY = -(gfxInfo->height >> 1);
+ sprite->pos1.x += 8;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ if (mapObject->mapobj_bit_15)
+ CameraObjectReset1();
+}
+
+void unref_sub_805BA80(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId)
+{
+ u8 mapObjectId;
+
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ sub_805B980(&gMapObjects[mapObjectId], graphicsId);
+}
+
+void FieldObjectTurn(struct MapObject *mapObject, u8 direction)
+{
+ FieldObjectSetDirection(mapObject, direction);
+ if (!mapObject->mapobj_bit_12)
+ {
+ StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18));
+ SeekSpriteAnim(&gSprites[mapObject->spriteId], 0);
+ }
+}
+
+void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction)
+{
+ u8 mapObjectId;
+
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ FieldObjectTurn(&gMapObjects[mapObjectId], direction);
+}
+
+void unref_TurnPlayer(struct PlayerAvatar *player, u8 direction)
+{
+ FieldObjectTurn(&gMapObjects[player->mapObjectId], direction);
+}
+
+void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 treeStage;
+ u8 treeId;
+
+ mapObject->mapobj_bit_13 = TRUE;
+ sprite->invisible = TRUE;
+ treeStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId);
+ if (treeStage != 0)
+ {
+ mapObject->mapobj_bit_13 = FALSE;
+ sprite->invisible = FALSE;
+ treeId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1;
+ treeStage--;
+ if (treeId > 0x2B)
+ treeId = 0;
+ sub_805B980(mapObject, gBerryTreeGraphicsIdTablePointers[treeId][treeStage]);
+ sprite->images = gBerryTreePicTablePointers[treeId];
+ sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[treeId][treeStage];
+ StartSpriteAnim(sprite, treeStage);
+ }
+}
+
+const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId)
+{
+ if (graphicsId > 0xEF)
+ graphicsId = VarGetFieldObjectGraphicsId(graphicsId + 16);
+ if (graphicsId > 0xD9)
+ graphicsId = 5;
+ return gMapObjectGraphicsInfoPointers[graphicsId];
+}
+
+void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject)
+{
+ if (mapObject->graphicsId > 0xEF)
+ mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId + 16);
+}
+
+void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 d)
+{
+ u8 mapObjectId;
+
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ gMapObjects[mapObjectId].mapobj_bit_13 = d;
+}
+
+void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, u8 *localId, u8 *mapNum, u8 *mapGroup)
+{
+ *localId = mapObject->localId;
+ *mapNum = mapObject->mapNum;
+ *mapGroup = mapObject->mapGroup;
+}
+
+void sub_805BCC0(s16 x, s16 y)
+{
+ u8 mapObjectId;
+ struct MapObject *mapObject;
+
+ mapObjectId = GetFieldObjectIdByXY(x, y);
+ if (mapObjectId != 16)
+ {
+ mapObject = &gMapObjects[mapObjectId];
+ mapObject->mapobj_bit_2 = TRUE;
+ }
+}
+
+void sub_805BCF0(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority)
+{
+ u8 mapObjectId;
+ struct MapObject *mapObject;
+ struct Sprite *sprite;
+
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ {
+ mapObject = &gMapObjects[mapObjectId];
+ sprite = &gSprites[mapObject->spriteId];
+ mapObject->mapobj_bit_26 = TRUE;
+ sprite->subpriority = subpriority;
+ }
+}
+
+void sub_805BD48(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 mapObjectId;
+ struct MapObject *mapObject;
+
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ {
+ mapObject = &gMapObjects[mapObjectId];
+ mapObject->mapobj_bit_26 = FALSE;
+ mapObject->mapobj_bit_2 = TRUE;
+ }
+}
+
+void sub_805BD90(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
+{
+ u8 mapObjectId;
+ struct Sprite *sprite;
+
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ {
+ sprite = &gSprites[gMapObjects[mapObjectId].spriteId];
+ sprite->pos2.x = x;
+ sprite->pos2.y = y;
+ }
+}
+
+void gpu_pal_allocator_reset__manage_upper_four(void)
+{
+ FreeAllSpritePalettes();
+ gReservedSpritePaletteCount = 12;
+}
+
+void sub_805BDF8(u16 tag)
+{
+ u16 paletteIndex = FindFieldObjectPaletteIndexByTag(tag);
+
+ if (paletteIndex != 0x11FF) //always happens. FindFieldObjectPaletteIndexByTag returns u8
+ sub_805BE58(&gUnknown_0837377C[paletteIndex]);
+}
+
+void unref_sub_805BE24(u16 *arr)
+{
+ u8 i;
+
+ for (i = 0; arr[i] != 0x11FF; i++)
+ sub_805BDF8(arr[i]);
+}
+
+u8 sub_805BE58(const struct SpritePalette *palette)
+{
+ if (IndexOfSpritePaletteTag(palette->tag) != 0xFF)
+ return 0xFF;
+ else
+ return LoadSpritePalette(palette);
+}
+
+void pal_patch_for_npc(u16 a, u16 b)
+{
+ u8 var = b;
+ u8 paletteIndex = FindFieldObjectPaletteIndexByTag(a);
+
+ LoadPalette(gUnknown_0837377C[paletteIndex].data, var * 16 + 0x100, 0x20);
+}
+
+void pal_patch_for_npc_range(const u16 *arr, u8 b, u8 c)
+{
+ for (; b < c; arr++, b++)
+ pal_patch_for_npc(*arr, b);
+}
+
+u8 FindFieldObjectPaletteIndexByTag(u16 tag)
+{
+ u8 i;
+
+ for (i = 0; gUnknown_0837377C[i].tag != 0x11FF; i++)
+ {
+ if (gUnknown_0837377C[i].tag == tag)
+ return i;
+ }
+ return 0xFF;
+}
+
+const u8 gUnknown_0830FD14[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0};
+
+void npc_load_two_palettes__no_record(u16 a, u8 b)
+{
+ u8 i;
+
+ pal_patch_for_npc(a, b);
+ for (i = 0; gUnknown_08373874[i].tag != 0x11FF; i++)
+ {
+ if (gUnknown_08373874[i].tag == a)
+ {
+ pal_patch_for_npc(gUnknown_08373874[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]);
+ break;
+ }
+ }
+}
+
+void npc_load_two_palettes__and_record(u16 a, u8 b)
+{
+ u8 i;
+
+ gUnknown_030005A6 = a;
+ pal_patch_for_npc(a, b);
+ for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++)
+ {
+ if (gUnknown_083738E4[i].tag == a)
+ {
+ pal_patch_for_npc(gUnknown_083738E4[i].data[gUnknown_030005A4], gUnknown_0830FD14[b]);
+ break;
+ }
+ }
+}
+
+void unref_sub_805C014(struct MapObject *mapObject, s16 x, s16 y)
+{
+ mapObject->coords3.x = mapObject->coords2.x;
+ mapObject->coords3.y = mapObject->coords2.y;
+ mapObject->coords2.x += x;
+ mapObject->coords2.y += y;
+}
+
+void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y)
+{
+ mapObject->coords3.x = mapObject->coords2.x;
+ mapObject->coords3.y = mapObject->coords2.y;
+ mapObject->coords2.x = x;
+ mapObject->coords2.y = y;
+}
+
+void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y)
+{
+ mapObject->coords3.x = x;
+ mapObject->coords3.y = y;
+ mapObject->coords2.x = x;
+ mapObject->coords2.y = y;
+}
+
+void sub_805C058(struct MapObject *mapObject, s16 x, s16 y)
+{
+ struct Sprite *sprite = &gSprites[mapObject->spriteId];
+ const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+
+ npc_coords_set(mapObject, x, y);
+ sub_80603CC(mapObject->coords2.x, mapObject->coords2.y, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->centerToCornerVecX = -(gfxInfo->width >> 1);
+ sprite->centerToCornerVecY = -(gfxInfo->height >> 1);
+ sprite->pos1.x += 8;
+ sprite->pos1.y += 16 + sprite->centerToCornerVecY;
+ sub_805B914(mapObject);
+ if (mapObject->mapobj_bit_15)
+ CameraObjectReset1();
+}
+
+void sub_805C0F8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y)
+{
+ u8 mapObjectId;
+
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ {
+ x += 7;
+ y += 7;
+ sub_805C058(&gMapObjects[mapObjectId], x, y);
+ }
+}
+
+void npc_coords_shift_still(struct MapObject *mapObject)
+{
+ npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y);
+}
+
+void UpdateFieldObjectCoordsForCameraUpdate(void)
+{
+ u8 i;
+ s16 deltaX;
+ s16 deltaY;
+
+#ifndef NONMATCHING
+ asm(""::"r"(i)); //makes the compiler store i in r3
+#endif
+
+ if (gUnknown_0202E844.field_0)
+ {
+ for (i = 0, deltaX = gUnknown_0202E844.x, deltaY = gUnknown_0202E844.y; i < 16; i++)
+ {
+ struct MapObject *mapObject = &gMapObjects[i];
+
+ if (mapObject->active)
+ {
+ mapObject->coords1.x -= deltaX;
+ mapObject->coords1.y -= deltaY;
+ mapObject->coords2.x -= deltaX;
+ mapObject->coords2.y -= deltaY;
+ mapObject->coords3.x -= deltaX;
+ mapObject->coords3.y -= deltaY;
+ }
+ }
+ }
+}
+
+bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8);
+
+u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y
+ && FieldObjectDoesZCoordMatch(&gMapObjects[i], z))
+ return i;
+ }
+ return 16;
+}
+
+bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z)
+{
+ if (mapObject->mapobj_unk_0B_0 != 0 && z != 0
+ && mapObject->mapobj_unk_0B_0 != z)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y)
+{
+ UpdateFieldObjectCoordsForCameraUpdate();
+ sub_805B55C(x, y);
+ RemoveFieldObjectsOutsideView();
+}
+
+void ObjectCB_CameraObject(struct Sprite *sprite);
+const struct SpriteTemplate gSpriteTemplate_830FD24 =
+{
+ .tileTag = 0,
+ .paletteTag = 0xFFFF,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = ObjectCB_CameraObject,
+};
+
+u8 AddCameraObject(u8 a)
+{
+ u8 spriteId = CreateSprite(&gSpriteTemplate_830FD24, 0, 0, 4);
+
+ gSprites[spriteId].invisible = TRUE;
+ gSprites[spriteId].data0 = a;
+ return spriteId;
+}
+
+void CameraObject_0(struct Sprite *);
+void CameraObject_1(struct Sprite *);
+void CameraObject_2(struct Sprite *);
+
+void ObjectCB_CameraObject(struct Sprite *sprite)
+{
+ void (*const cameraObjectFuncs[])(struct Sprite *) =
+ {
+ CameraObject_0,
+ CameraObject_1,
+ CameraObject_2,
+ };
+
+ cameraObjectFuncs[sprite->data1](sprite);
+}
+
+void CameraObject_0(struct Sprite *sprite)
+{
+ sprite->pos1.x = gSprites[sprite->data0].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data0].pos1.y;
+ sprite->invisible = TRUE;
+ sprite->data1 = 1;
+ CameraObject_1(sprite);
+}
+
+void CameraObject_1(struct Sprite *sprite)
+{
+ s16 x = gSprites[sprite->data0].pos1.x;
+ s16 y = gSprites[sprite->data0].pos1.y;
+
+ sprite->data2 = x - sprite->pos1.x;
+ sprite->data3 = y - sprite->pos1.y;
+ sprite->pos1.x = x;
+ sprite->pos1.y = y;
+}
+
+void CameraObject_2(struct Sprite *sprite)
+{
+ sprite->pos1.x = gSprites[sprite->data0].pos1.x;
+ sprite->pos1.y = gSprites[sprite->data0].pos1.y;
+ sprite->data2 = 0;
+ sprite->data3 = 0;
+}
+
+struct Sprite *FindCameraObject(void)
+{
+ u8 i;
+
+ for (i = 0; i < 64; i++)
+ {
+ if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject)
+ return &gSprites[i];
+ }
+ return NULL;
+}
+
+void CameraObjectReset1(void)
+{
+ struct Sprite *cameraSprite = FindCameraObject();
+
+ if (cameraSprite != NULL)
+ {
+ cameraSprite->data1 = 0;
+ cameraSprite->callback(cameraSprite);
+ }
+}
+
+void CameraObjectSetFollowedObjectId(u8 state)
+{
+ struct Sprite *cameraSprite = FindCameraObject();
+
+ if (cameraSprite != NULL)
+ {
+ cameraSprite->data0 = state;
+ CameraObjectReset1();
+ }
+}
+
+u8 CameraObjectGetFollowedObjectId(void)
+{
+ struct Sprite *cameraSprite = FindCameraObject();
+
+ if (cameraSprite == NULL)
+ return 64;
+ else
+ return cameraSprite->data0;
+}
+
+void CameraObjectReset2(void)
+{
+ struct Sprite *cameraSprite = FindCameraObject();
+
+ cameraSprite->data1 = 2;
+}
+
+u8 unref_sub_805C43C(struct Sprite *src, s16 x, s16 y, u8 subpriority)
+{
+ u8 i;
+
+ for (i = 0; i < 64; i++)
+ {
+ if (!gSprites[i].inUse)
+ {
+ gSprites[i] = *src;
+ gSprites[i].pos1.x = x;
+ gSprites[i].pos1.y = y;
+ gSprites[i].subpriority = subpriority;
+ break;
+ }
+ }
+ return i;
+}
+
+u8 obj_unfreeze(struct Sprite *src, s16 x, s16 y, u8 subpriority)
+{
+ s16 i;
+
+ for (i = 63; i > -1; i--)
+ {
+ if (!gSprites[i].inUse)
+ {
+ gSprites[i] = *src;
+ gSprites[i].pos1.x = x;
+ gSprites[i].pos1.y = y;
+ gSprites[i].subpriority = subpriority;
+ return i;
+ }
+ }
+ return 64;
+}
+
+void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction)
+{
+ mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18;
+ if (!mapObject->mapobj_bit_9)
+ {
+ s8 _direction = direction; //needed for the asm to match
+ mapObject->mapobj_unk_18 = _direction;
+ }
+ mapObject->placeholder18 = direction;
+}
+
+u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup);
+
+ return template->script;
+}
+
+u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId)
+{
+ return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup);
+}
+
+u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ struct MapObjectTemplate *template = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup);
+
+ return template->flagId;
+}
+
+u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId)
+{
+ return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup);
+}
+
+u8 unref_sub_805C5D0(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 mapObjectId;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ return 0xFF;
+ else
+ return gMapObjects[mapObjectId].trainerType;
+}
+
+u8 unref_sub_805C60C(u8 mapObjectId)
+{
+ return gMapObjects[mapObjectId].trainerType;
+}
+
+u8 unref_sub_805C624(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 mapObjectId;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ return 0xFF;
+ else
+ return gMapObjects[mapObjectId].trainerRange_berryTreeId;
+}
+
+u8 FieldObjectGetBerryTreeId(u8 mapObjectId)
+{
+ return gMapObjects[mapObjectId].trainerRange_berryTreeId;
+}
+
+struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8, struct MapObjectTemplate *, u8);
+
+struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ if (gSaveBlock1.location.mapNum == mapNum && gSaveBlock1.location.mapGroup == mapGroup)
+ return FindFieldObjectTemplateInArrayByLocalId(localId, gSaveBlock1.mapObjectTemplates, gMapHeader.events->mapObjectCount);
+ else
+ {
+ struct MapHeader *mapHeader = get_mapheader_by_bank_and_number(mapGroup, mapNum);
+
+ return FindFieldObjectTemplateInArrayByLocalId(localId, mapHeader->events->mapObjects, mapHeader->events->mapObjectCount);
+ }
+}
+
+struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count)
+{
+ u8 i;
+
+ for (i = 0; i < count; i++)
+ {
+ if (templates[i].localId == localId)
+ return &templates[i];
+ }
+ return NULL;
+}
+
+struct MapObjectTemplate *sub_805C700(struct MapObject *mapObject)
+{
+ s32 i;
+
+ if (mapObject->mapNum != gSaveBlock1.location.mapNum
+ || mapObject->mapGroup != gSaveBlock1.location.mapGroup)
+ return NULL;
+
+ for (i = 0; i < 64; i++)
+ {
+ if (mapObject->localId == gSaveBlock1.mapObjectTemplates[i].localId)
+ return &gSaveBlock1.mapObjectTemplates[i];
+ }
+ return NULL;
+}
+
+void sub_805C754(struct MapObject *mapObject)
+{
+ struct MapObjectTemplate *template = sub_805C700(mapObject);
+
+ if (template != NULL)
+ {
+ template->x = mapObject->coords2.x - 7;
+ template->y = mapObject->coords2.y - 7;
+ }
+}
+
+void sub_805C774(struct MapObject *mapObject, u8 movementType)
+{
+ struct MapObjectTemplate *template = sub_805C700(mapObject);
+
+ if (template != NULL)
+ template->movementType = movementType;
+}
+
+void sub_805C78C(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 mapObjectId;
+
+ if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ sub_805C754(&gMapObjects[mapObjectId]);
+}
+
+void sub_805C7C4(u8 a)
+{
+ gpu_pal_allocator_reset__manage_upper_four();
+ gUnknown_030005A6 = 0x11FF;
+ gUnknown_030005A4 = a;
+ pal_patch_for_npc_range(gUnknown_0837399C[gUnknown_030005A4], 0, 10);
+}
+
+u16 npc_paltag_by_palslot(u8 a)
+{
+ u8 i;
+
+ if (a < 10)
+ return gUnknown_0837399C[gUnknown_030005A4][a];
+
+ for (i = 0; gUnknown_083738E4[i].tag != 0x11FF; i++)
+ {
+ if (gUnknown_083738E4[i].tag == gUnknown_030005A6)
+ {
+ return gUnknown_083738E4[i].data[gUnknown_030005A4];
+ }
+ }
+ return 0x11FF;
+}
+
+u32 sub_805C8A8(void);
+
+void sub_805C884(struct Sprite *sprite)
+{
+ meta_step(&gMapObjects[sprite->data0], sprite, sub_805C8A8);
+}
+
+u32 sub_805C8A8(void)
+{
+ return 0;
+}
+
+u32 sub_805C8D0(struct MapObject *, struct Sprite *);
+
+void sub_805C8AC(struct Sprite *sprite)
+{
+ meta_step(&gMapObjects[sprite->data0], sprite, sub_805C8D0);
+}
+
+extern u8 (*const gUnknown_08375224[])();
+
+u32 sub_805C8D0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return gUnknown_08375224[sprite->data1](mapObject, sprite);
+}
+
+void npc_reset();
+
+u8 sub_805C8F0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject);
+ sprite->data1 = 1;
+ return 1;
+}
+
+extern void FieldObjectSetRegularAnim();
+
+u8 sub_805C904(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18));
+ sprite->data1 = 2;
+ return 1;
+}
+
diff --git a/src/field_map_obj_helpers.c b/src/field_map_obj_helpers.c
index 6e835d744..afc3c680c 100644
--- a/src/field_map_obj_helpers.c
+++ b/src/field_map_obj_helpers.c
@@ -1,8 +1,8 @@
#include "global.h"
#include "asm.h"
-#include "sprite.h"
#include "asm_fieldmap.h"
#include "field_effect.h"
+#include "sprite.h"
typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
@@ -311,7 +311,7 @@ void DoShadowFieldEffect(struct MapObject *mapObject)
void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite)
{
- struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+ const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
gUnknown_0202FF84[0] = sprite->pos1.x;
gUnknown_0202FF84[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
gUnknown_0202FF84[2] = 151;
diff --git a/src/field_message_box.c b/src/field_message_box.c
index a7d1a2fd8..2a5f90d15 100644
--- a/src/field_message_box.c
+++ b/src/field_message_box.c
@@ -1,9 +1,9 @@
#include "global.h"
+#include "field_message_box.h"
+#include "string_util.h"
+#include "task.h"
#include "text.h"
#include "text_window.h"
-#include "task.h"
-#include "string_util.h"
-#include "field_message_box.h"
extern struct Window gFieldMessageBoxWindow;
extern u16 gMenuTextWindowContentTileOffset;
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index fdd5ae5c5..53bbf013b 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -1,56 +1,30 @@
#include "global.h"
#include "field_player_avatar.h"
#include "asm.h"
-#include "field_map_obj.h"
-#include "rom4.h"
+#include "asm_fieldmap.h"
#include "event_data.h"
+#include "field_effect.h"
+#include "field_map_obj.h"
#include "main.h"
#include "menu.h"
+#include "metatile_behavior.h"
#include "rng.h"
+#include "rom4.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
#include "task.h"
-#include "field_effect.h"
#include "wild_encounter.h"
-#include "asm_fieldmap.h"
-#include "metatile_behavior.h"
+#include "map_object_constants.h"
+#include "bike.h"
+#include "field_map_obj_helpers.h"
extern u8 gOtherText_OhABite[];
extern u8 gOtherText_PokeOnHook[];
extern u8 gOtherText_NotEvenANibble[];
extern u8 gOtherText_ItGotAway[];
-extern struct
-{
- s32 x;
- s32 y;
- u32 unk8;
- u32 unkC;
-} gUnknown_0202FF84;
-
-extern bool8 (*gUnknown_0830FB58[])(u8);
-extern u8 (*gUnknown_0830FBA0[])(void);
-extern void (*gUnknown_0830FBEC[])(u8, u16);
-extern bool8 (*gUnknown_0830FBF8[])(u8);
-extern u8 gUnknown_0830FC0C[];
-extern void (*gUnknown_0830FC14[])(struct MapObject *);
-extern bool8 (*gUnknown_0830FC34[])(u8);
-extern u8 gUnknown_0830FC44[][2];
-extern u8 gUnknown_0830FC54[][2];
-extern u8 gUnknown_0830FC64[2][5][2];
-extern bool8 (*gUnknown_0830FC78[])(u8); //Duplicate of gUnknown_0830FC34
-extern u8 (*gUnknown_0830FC88[])(struct Task *, struct MapObject *, struct MapObject *);
-extern u8 (*gUnknown_0830FC94[])(struct Task *, struct MapObject *);
-extern u8 (*gUnknown_0830FC98[])(struct Task *, struct MapObject *);
-extern u8 gUnknown_0830FCA8[];
-extern u8 gUnknown_0830FCAC[];
-extern u8 (*gUnknown_0830FCB4[])(struct Task *);
-extern s16 gUnknown_0830FCF4[];
-extern s16 gUnknown_0830FCFA[];
-extern u8 gUnknown_0830FD00[];
-extern s16 gUnknown_0830FD02[];
-extern s16 gUnknown_0830FD08[];
+extern u32 gUnknown_0202FF84[];
//Functions
static u32 sub_80587D8(void);
@@ -60,14 +34,41 @@ static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c);
static void PlayerAllowForcedMovementIfMovingSameDirection(void);
static u8 TryDoMetatileBehaviorForcedMovement(void);
static u8 GetForcedMovementByMetatileBehavior(void);
+u8 ForcedMovement_None(void);
+u8 ForcedMovement_Slip(void);
+u8 sub_8058AAC(void);
+u8 sub_8058AC4(void);
+u8 sub_8058ADC(void);
+u8 sub_8058AF4(void);
+u8 sub_8058B0C(void);
+u8 sub_8058B24(void);
+u8 sub_8058B3C(void);
+u8 sub_8058B54(void);
+u8 ForcedMovement_SlideSouth(void);
+u8 ForcedMovement_SlideNorth(void);
+u8 ForcedMovement_SlideWest(void);
+u8 ForcedMovement_SlideEast(void);
+u8 sub_8058C04(void);
+u8 sub_8058C10(void);
+u8 ForcedMovement_MuddySlope(void);
static void MovePlayerNotOnBike(u8 a, u16 b);
static u8 CheckMovementInputNotOnBike(u8 a);
+void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys);
+void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys);
+void sub_8058D0C(u8 direction, u16 heldKeys);
static u8 CheckForPlayerAvatarCollision(u8 a);
static u8 sub_8058EF0(s16 a, s16 b, u8 c);
static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c);
static u8 sub_8058F6C(s16 a, s16 b, u8 c);
static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d);
static void DoPlayerAvatarTransition(void);
+void nullsub_49(struct MapObject *a);
+void PlayerAvatarTransition_Normal(struct MapObject *a);
+void PlayerAvatarTransition_MachBike(struct MapObject *a);
+void PlayerAvatarTransition_AcroBike(struct MapObject *a);
+void PlayerAvatarTransition_Surfing(struct MapObject *a);
+void PlayerAvatarTransition_Underwater(struct MapObject *a);
+void sub_80591F4(struct MapObject *a);
static bool8 player_is_anim_in_certain_ranges(void);
static bool8 sub_80592A4(void);
static bool8 PlayerIsAnimActive(void);
@@ -76,8 +77,175 @@ static void PlayerNotOnBikeCollide(u8 a);
static void PlayCollisionSoundIfNotFacingWarp(u8 a);
static void sub_8059D60(struct MapObject *a);
static void StartStrengthAnim(u8 a, u8 b);
+u8 sub_8059E84(struct Task *task, struct MapObject *b, struct MapObject *c);
+u8 sub_8059EA4(struct Task *task, struct MapObject *b, struct MapObject *c);
+u8 sub_8059F40(struct Task *task, struct MapObject *b, struct MapObject *c);
static void sub_8059F94(void);
+u8 sub_805A000(struct Task *task, struct MapObject *mapObject);
static void sub_805A06C(void);
+u8 sub_805A0D8(struct Task *task, struct MapObject *mapObject);
+u8 sub_805A100(struct Task *task, struct MapObject *mapObject);
+u8 sub_805A178(struct Task *task, struct MapObject *mapObject);
+u8 sub_805A1B8(struct Task *task, struct MapObject *mapObject);
+u8 Fishing1(struct Task *task);
+u8 Fishing2(struct Task *task);
+u8 Fishing3(struct Task *task);
+u8 Fishing4(struct Task *task);
+u8 Fishing5(struct Task *task);
+u8 Fishing6(struct Task *task);
+u8 Fishing7(struct Task *task);
+u8 Fishing8(struct Task *task);
+u8 Fishing9(struct Task *task);
+u8 Fishing10(struct Task *task);
+u8 Fishing11(struct Task *task);
+u8 Fishing12(struct Task *task);
+u8 Fishing13(struct Task *task);
+u8 Fishing14(struct Task *task);
+u8 Fishing15(struct Task *task);
+u8 Fishing16(struct Task *task);
+
+static bool8 (*const gUnknown_0830FB58[])(u8) =
+{
+ MetatileBehavior_IsTrickHouseSlipperyFloor,
+ MetatileBehavior_IsIce_2,
+ MetatileBehavior_IsWalkSouth,
+ MetatileBehavior_IsWalkNorth,
+ MetatileBehavior_IsWalkWest,
+ MetatileBehavior_IsWalkEast,
+ MetatileBehavior_IsSouthwardCurrent,
+ MetatileBehavior_IsNorthwardCurrent,
+ MetatileBehavior_IsWestwardCurrent,
+ MetatileBehavior_IsEastwardCurrent,
+ MetatileBehavior_IsSlideSouth,
+ MetatileBehavior_IsSlideNorth,
+ MetatileBehavior_IsSlideWest,
+ MetatileBehavior_IsSlideEast,
+ MetatileBehavior_IsWaterfall,
+ MetatileBehavior_0xBB,
+ MetatileBehavior_0xBC,
+ MetatileBehavior_IsMuddySlope,
+};
+static u8 (*const gUnknown_0830FBA0[])(void) =
+{
+ ForcedMovement_None,
+ ForcedMovement_Slip,
+ ForcedMovement_Slip,
+ sub_8058AAC,
+ sub_8058AC4,
+ sub_8058ADC,
+ sub_8058AF4,
+ sub_8058B0C,
+ sub_8058B24,
+ sub_8058B3C,
+ sub_8058B54,
+ ForcedMovement_SlideSouth,
+ ForcedMovement_SlideNorth,
+ ForcedMovement_SlideWest,
+ ForcedMovement_SlideEast,
+ sub_8058B0C,
+ sub_8058C04,
+ sub_8058C10,
+ ForcedMovement_MuddySlope,
+};
+static void (*const gUnknown_0830FBEC[])(u8, u16) =
+{
+ PlayerNotOnBikeNotMoving,
+ PlayerNotOnBikeTurningInPlace,
+ sub_8058D0C,
+};
+static bool8 (*const gUnknown_0830FBF8[])(u8) =
+{
+ MetatileBehavior_IsBumpySlope,
+ MetatileBehavior_IsIsolatedVerticalRail,
+ MetatileBehavior_IsIsolatedHorizontalRail,
+ MetatileBehavior_IsVerticalRail,
+ MetatileBehavior_IsHorizontalRail,
+};
+static const u8 gUnknown_0830FC0C[] = {9, 10, 11, 12, 13};
+static void (*const gUnknown_0830FC14[])(struct MapObject *) =
+{
+ PlayerAvatarTransition_Normal,
+ PlayerAvatarTransition_MachBike,
+ PlayerAvatarTransition_AcroBike,
+ PlayerAvatarTransition_Surfing,
+ PlayerAvatarTransition_Underwater,
+ sub_80591F4,
+ nullsub_49,
+ nullsub_49,
+};
+static bool8 (*const gUnknown_0830FC34[])(u8) =
+{
+ MetatileBehavior_IsSouthArrowWarp,
+ MetatileBehavior_IsNorthArrowWarp,
+ MetatileBehavior_IsWestArrowWarp,
+ MetatileBehavior_IsEastArrowWarp,
+};
+static const u8 sRivalAvatarGfxIds[][2] =
+{
+ {MAP_OBJ_GFX_RIVAL_BRENDAN_NORMAL, MAP_OBJ_GFX_RIVAL_MAY_NORMAL},
+ {MAP_OBJ_GFX_RIVAL_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE},
+ {MAP_OBJ_GFX_RIVAL_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE},
+ {MAP_OBJ_GFX_RIVAL_BRENDAN_SURFING, MAP_OBJ_GFX_RIVAL_MAY_SURFING},
+ {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER},
+ {MAP_OBJ_GFX_RIVAL_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE},
+ {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING},
+ {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING},
+};
+static const u8 sPlayerAvatarGfxIds[][2] =
+{
+ {MAP_OBJ_GFX_BRENDAN_NORMAL, MAP_OBJ_GFX_MAY_NORMAL},
+ {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, MAP_OBJ_GFX_MAY_MACH_BIKE},
+ {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, MAP_OBJ_GFX_MAY_ACRO_BIKE},
+ {MAP_OBJ_GFX_BRENDAN_SURFING, MAP_OBJ_GFX_MAY_SURFING},
+ {MAP_OBJ_GFX_BRENDAN_UNDERWATER, MAP_OBJ_GFX_MAY_UNDERWATER},
+ {MAP_OBJ_GFX_BRENDAN_FIELD_MOVE, MAP_OBJ_GFX_MAY_FIELD_MOVE},
+ {MAP_OBJ_GFX_BRENDAN_FISHING, MAP_OBJ_GFX_MAY_FISHING},
+ {MAP_OBJ_GFX_BRENDAN_WATERING, MAP_OBJ_GFX_MAY_WATERING},
+};
+static const u8 gUnknown_0830FC64[2][5][2] =
+{
+ //male
+ {
+ {MAP_OBJ_GFX_BRENDAN_NORMAL, 1},
+ {MAP_OBJ_GFX_BRENDAN_MACH_BIKE, 2},
+ {MAP_OBJ_GFX_BRENDAN_ACRO_BIKE, 4},
+ {MAP_OBJ_GFX_BRENDAN_SURFING, 8},
+ {MAP_OBJ_GFX_BRENDAN_UNDERWATER, 16},
+ },
+ //female
+ {
+ {MAP_OBJ_GFX_MAY_NORMAL, 1},
+ {MAP_OBJ_GFX_MAY_MACH_BIKE, 2},
+ {MAP_OBJ_GFX_MAY_ACRO_BIKE, 4},
+ {MAP_OBJ_GFX_MAY_SURFING, 8},
+ {MAP_OBJ_GFX_MAY_UNDERWATER, 16},
+ }
+};
+static bool8 (*const gUnknown_0830FC78[])(u8) = //Duplicate of gUnknown_0830FC34
+{
+ MetatileBehavior_IsSouthArrowWarp,
+ MetatileBehavior_IsNorthArrowWarp,
+ MetatileBehavior_IsWestArrowWarp,
+ MetatileBehavior_IsEastArrowWarp,
+};
+static u8 (*const gUnknown_0830FC88[])(struct Task *, struct MapObject *, struct MapObject *) =
+{
+ sub_8059E84,
+ sub_8059EA4,
+ sub_8059F40,
+};
+static u8 (*const gUnknown_0830FC94[])(struct Task *, struct MapObject *) =
+{
+ sub_805A000,
+};
+static u8 (*const gUnknown_0830FC98[])(struct Task *, struct MapObject *) =
+{
+ sub_805A0D8,
+ sub_805A100,
+ sub_805A178,
+ sub_805A1B8,
+};
+
void sub_80587B4(struct Sprite *sprite)
{
@@ -89,37 +257,37 @@ static u32 sub_80587D8(void)
return 0;
}
-void player_step(u8 a, u16 b, u16 c)
+void player_step(u8 direction, u16 newKeys, u16 heldKeys)
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
sub_8059D60(playerMapObj);
if (gPlayerAvatar.unk6 == 0)
{
- sub_80E5B38(b, c);
- if (sub_8058854(playerMapObj, a) == 0)
+ sub_80E5B38(newKeys, heldKeys);
+ if (!sub_8058854(playerMapObj, direction))
{
npc_clear_strange_bits(playerMapObj);
DoPlayerAvatarTransition();
if (TryDoMetatileBehaviorForcedMovement() == 0)
{
- MovePlayerAvatarUsingKeypadInput(a, b, c);
+ MovePlayerAvatarUsingKeypadInput(direction, newKeys, heldKeys);
PlayerAllowForcedMovementIfMovingSameDirection();
}
}
}
}
-static bool8 sub_8058854(struct MapObject *a, u8 b)
+static bool8 sub_8058854(struct MapObject *playerMapObj, u8 direction)
{
- if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(a)
- && !FieldObjectClearAnimIfSpecialAnimFinished(a))
+ if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj)
+ && !FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj))
{
- u8 specialAnim = FieldObjectGetSpecialAnim(a);
-
- if (specialAnim > 24 && specialAnim < 29 && b != 0 && a->placeholder18 != b)
+ u8 specialAnim = FieldObjectGetSpecialAnim(playerMapObj);
+
+ if (specialAnim > 24 && specialAnim < 29 && direction != DIR_NONE && playerMapObj->placeholder18 != direction)
{
- FieldObjectClearAnim(a);
+ FieldObjectClearAnim(playerMapObj);
return FALSE;
}
else
@@ -138,13 +306,13 @@ static void npc_clear_strange_bits(struct MapObject *a)
gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_DASH;
}
-static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c)
+static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys)
{
if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE)
|| (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE))
- MovePlayerOnBike(a, b, c);
+ MovePlayerOnBike(direction, newKeys, heldKeys);
else
- MovePlayerNotOnBike(a, c);
+ MovePlayerNotOnBike(direction, heldKeys);
}
static void PlayerAllowForcedMovementIfMovingSameDirection(void)
@@ -161,11 +329,11 @@ static u8 TryDoMetatileBehaviorForcedMovement(void)
static u8 GetForcedMovementByMetatileBehavior(void)
{
u8 i;
-
+
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_5))
{
u8 r5 = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E;
-
+
for (i = 0; i < 18; i++)
{
if (gUnknown_0830FB58[i](r5))
@@ -180,7 +348,7 @@ u8 ForcedMovement_None(void)
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_6)
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
playerMapObj->mapobj_bit_9 = 0;
playerMapObj->mapobj_bit_11 = 1;
FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18);
@@ -189,23 +357,23 @@ u8 ForcedMovement_None(void)
return 0;
}
-static u8 DoForcedMovement(u8 a, void (*b)(u8))
+static u8 DoForcedMovement(u8 direction, void (*b)(u8))
{
struct PlayerAvatar *playerAvatar = &gPlayerAvatar;
- u8 r7 = CheckForPlayerAvatarCollision(a);
-
+ u8 collisionType = CheckForPlayerAvatarCollision(direction);
+
playerAvatar->flags |= PLAYER_AVATAR_FLAG_6;
- if (r7 != 0)
+ if (collisionType != 0)
{
ForcedMovement_None();
- if (r7 <= 4)
+ if (collisionType <= 4)
{
return 0;
}
else
{
- if (r7 == 6)
- PlayerJumpLedge(a);
+ if (collisionType == COLLISION_LEDGE_JUMP)
+ PlayerJumpLedge(direction);
playerAvatar->flags |= PLAYER_AVATAR_FLAG_6;
playerAvatar->running2 = 2;
return 1;
@@ -214,7 +382,7 @@ static u8 DoForcedMovement(u8 a, void (*b)(u8))
else
{
playerAvatar->running2 = 2;
- b(a);
+ b(direction);
return 1;
}
}
@@ -222,7 +390,7 @@ static u8 DoForcedMovement(u8 a, void (*b)(u8))
static u8 DoForcedMovementInCurrentDirection(void (*a)(u8))
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
playerMapObj->mapobj_bit_10 = 1;
return DoForcedMovement(playerMapObj->placeholder18, a);
}
@@ -272,13 +440,13 @@ u8 sub_8058B54(void)
return DoForcedMovement(4, npc_use_some_d2s);
}
-static u8 ForcedMovement_Slide(u8 a, void (*b)(u8))
+static u8 ForcedMovement_Slide(u8 direction, void (*b)(u8))
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
playerMapObj->mapobj_bit_10 = 1;
playerMapObj->mapobj_bit_9 = 1;
- return DoForcedMovement(a, b);
+ return DoForcedMovement(direction, b);
}
u8 ForcedMovement_SlideSouth(void)
@@ -316,8 +484,8 @@ u8 sub_8058C10(void)
u8 ForcedMovement_MuddySlope(void)
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
- if (playerMapObj->placeholder18 != 2 || sub_80E6034() <= 3)
+
+ if (playerMapObj->placeholder18 != 2 || GetPlayerSpeed() <= 3)
{
sub_80E6010(0);
playerMapObj->mapobj_bit_9 = 1;
@@ -329,19 +497,19 @@ u8 ForcedMovement_MuddySlope(void)
}
}
-static void MovePlayerNotOnBike(u8 a, u16 b)
+static void MovePlayerNotOnBike(u8 direction, u16 heldKeys)
{
- gUnknown_0830FBEC[CheckMovementInputNotOnBike(a)](a, b);
+ gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys);
}
-static u8 CheckMovementInputNotOnBike(u8 a)
+static u8 CheckMovementInputNotOnBike(u8 direction)
{
- if (a == 0)
+ if (direction == DIR_NONE)
{
gPlayerAvatar.running2 = 0;
return 0;
}
- else if (a != player_get_direction_upper_nybble() && gPlayerAvatar.running2 != 2)
+ else if (direction != player_get_direction_upper_nybble() && gPlayerAvatar.running2 != 2)
{
gPlayerAvatar.running2 = 1;
return 1;
@@ -353,81 +521,81 @@ static u8 CheckMovementInputNotOnBike(u8 a)
}
}
-void PlayerNotOnBikeNotMoving(u8 a, u16 b)
+void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys)
{
PlayerFaceDirection(player_get_direction_lower_nybble());
}
-void PlayerNotOnBikeTurningInPlace(u8 a, u16 b)
+void PlayerNotOnBikeTurningInPlace(u8 direction, u16 heldKeys)
{
- PlayerTurnInPlace(a);
+ PlayerTurnInPlace(direction);
}
-void sub_8058D0C(u8 a, u16 b)
+void sub_8058D0C(u8 direction, u16 heldKeys)
{
- u8 r1 = CheckForPlayerAvatarCollision(a);
-
+ u8 r1 = CheckForPlayerAvatarCollision(direction);
+
switch (r1)
{
case 6:
- PlayerJumpLedge(a);
+ PlayerJumpLedge(direction);
return;
default:
if (r1 > 8 || r1 < 5)
- PlayerNotOnBikeCollide(a);
+ PlayerNotOnBikeCollide(direction);
return;
case 0:
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
{
- sub_80593C4(a);
+ sub_80593C4(direction);
return;
}
- if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (b & 2) && FlagGet(SYS_B_DASH)
- && sub_80E5DEC(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) == 0)
+ if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (heldKeys & B_BUTTON) && FlagGet(SYS_B_DASH)
+ && IsRunningDisallowed(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) == 0)
{
- sub_805940C(a);
+ sub_805940C(direction);
gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH;
}
else
{
- PlayerGoSpeed0(a);
+ PlayerGoSpeed0(direction);
}
}
}
-static u8 CheckForPlayerAvatarCollision(u8 a)
+static u8 CheckForPlayerAvatarCollision(u8 direction)
{
s16 x, y;
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
x = playerMapObj->coords2.x;
y = playerMapObj->coords2.y;
- MoveCoords(a, &x, &y);
- return CheckForFieldObjectCollision(playerMapObj, x, y, a, MapGridGetMetatileBehaviorAt(x, y));
+ MoveCoords(direction, &x, &y);
+ return CheckForFieldObjectCollision(playerMapObj, x, y, direction, MapGridGetMetatileBehaviorAt(x, y));
}
-u8 CheckForFieldObjectCollision(struct MapObject *a, s16 b, s16 c, u8 d, u8 e)
+u8 CheckForFieldObjectCollision(struct MapObject *a, s16 x, s16 y, u8 direction, u8 e)
{
- u8 sp0;
-
- sp0 = npc_block_way(a, b, c, d);
- if (sp0 == 3 && sub_8058EF0(b, c, d))
+ u8 collision;
+
+ collision = npc_block_way(a, x, y, direction);
+ if (collision == 3 && sub_8058EF0(x, y, direction))
return 5;
- if (ShouldJumpLedge(b, c, d))
+ if (ShouldJumpLedge(x, y, direction))
{
IncrementGameStat(0x2B);
- return 6;
+ return COLLISION_LEDGE_JUMP;
}
- if (sp0 == 4 && sub_8058F6C(b, c, d))
+ if (collision == 4 && sub_8058F6C(x, y, direction))
return 7;
-
- if (sp0 == 0)
+
+ if (collision == 0)
{
- if (CheckForRotatingGatePuzzleCollision(d, b, c))
+ if (CheckForRotatingGatePuzzleCollision(direction, x, y))
return 8;
- check_acro_bike_metatile(b, c, e, &sp0);
+ check_acro_bike_metatile(x, y, e, &collision);
}
- return sp0;
+ return collision;
}
static u8 sub_8058EF0(s16 a, s16 b, u8 c)
@@ -458,7 +626,7 @@ static u8 sub_8058F6C(s16 a, s16 b, u8 c)
if (FlagGet(SYS_USE_STRENGTH))
{
u8 mapObjectId = GetFieldObjectIdByXY(a, b);
-
+
if (mapObjectId != 16)
{
if (gMapObjects[mapObjectId].graphicsId == 0x57)
@@ -481,7 +649,7 @@ static u8 sub_8058F6C(s16 a, s16 b, u8 c)
static void check_acro_bike_metatile(int unused1, int unused2, u8 c, u8 *d)
{
u8 i;
-
+
for (i = 0; i < 5; i++)
{
if (gUnknown_0830FBF8[i](c))
@@ -502,7 +670,7 @@ static void DoPlayerAvatarTransition(void)
{
u8 i;
u32 flags = gPlayerAvatar.bike;
-
+
if (flags != 0)
{
for (i = 0; i < 8; i++, flags >>= 1)
@@ -515,7 +683,7 @@ static void DoPlayerAvatarTransition(void)
#else
if (flags & 1)
{
- register void (**funcs)(struct MapObject *) asm("r0") = gUnknown_0830FC14;
+ register void (*const *funcs)(struct MapObject *) asm("r0") = gUnknown_0830FC14;
funcs[i](&gMapObjects[gPlayerAvatar.mapObjectId]);
}
#endif
@@ -540,7 +708,7 @@ void PlayerAvatarTransition_MachBike(struct MapObject *a)
sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(1));
FieldObjectTurn(a, a->placeholder18);
SetPlayerAvatarStateMask(2);
- sub_80E5FCC(0, 0);
+ BikeClearState(0, 0);
}
void PlayerAvatarTransition_AcroBike(struct MapObject *a)
@@ -548,20 +716,20 @@ void PlayerAvatarTransition_AcroBike(struct MapObject *a)
sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(2));
FieldObjectTurn(a, a->placeholder18);
SetPlayerAvatarStateMask(4);
- sub_80E5FCC(0, 0);
+ BikeClearState(0, 0);
sub_80E6084();
}
void PlayerAvatarTransition_Surfing(struct MapObject *a)
{
u8 unk;
-
+
sub_805B980(a, GetPlayerAvatarGraphicsIdByStateId(3));
FieldObjectTurn(a, a->placeholder18);
SetPlayerAvatarStateMask(8);
- gUnknown_0202FF84.x = a->coords2.x;
- gUnknown_0202FF84.y = a->coords2.y;
- gUnknown_0202FF84.unk8 = gPlayerAvatar.mapObjectId;
+ gUnknown_0202FF84[0] = a->coords2.x;
+ gUnknown_0202FF84[1] = a->coords2.y;
+ gUnknown_0202FF84[2] = gPlayerAvatar.mapObjectId;
unk = FieldEffectStart(8);
a->mapobj_unk_1A = unk;
sub_8127ED0(unk, 1);
@@ -601,7 +769,7 @@ void sub_8059204(void)
static bool8 player_is_anim_in_certain_ranges(void)
{
u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C;
-
+
if (unk < 4
|| (unk >= 16 && unk < 0x15)
|| (unk >= 25 && unk < 41)
@@ -632,12 +800,12 @@ static bool8 PlayerCheckIfAnimFinishedOrInactive(void)
static void player_set_x22(u8 a)
{
- gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_22 = a;
+ gMapObjects[gPlayerAvatar.mapObjectId].animId = a;
}
u8 player_get_x22(void)
{
- return gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_22;
+ return gMapObjects[gPlayerAvatar.mapObjectId].animId;
}
static void sub_8059348(u8 a)
@@ -645,66 +813,66 @@ static void sub_8059348(u8 a)
FieldObjectForceSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], a);
}
-void player_npc_set_state_and_x22_etc(u8 a, u8 b)
+void PlayerSetAnimId(u8 animId, u8 b)
{
if (!PlayerIsAnimActive())
{
player_set_x22(b);
- FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], a);
+ FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], animId);
}
}
void PlayerGoSpeed0(u8 a)
{
- player_npc_set_state_and_x22_etc(GetGoSpeed0AnimId(a), 2);
+ PlayerSetAnimId(GetGoSpeed0AnimId(a), 2);
}
void sub_80593C4(u8 a)
{
- player_npc_set_state_and_x22_etc(sub_8060744(a), 2);
+ PlayerSetAnimId(sub_8060744(a), 2);
}
void npc_use_some_d2s(u8 a)
{
- player_npc_set_state_and_x22_etc(d2s_08064034(a), 2);
+ PlayerSetAnimId(d2s_08064034(a), 2);
}
void sub_80593F4(u8 a)
{
- player_npc_set_state_and_x22_etc(sub_806079C(a), 2);
+ PlayerSetAnimId(sub_806079C(a), 2);
}
void sub_805940C(u8 a)
{
- player_npc_set_state_and_x22_etc(sub_80607F4(a), 2);
+ PlayerSetAnimId(sub_80607F4(a), 2);
}
void PlayerOnBikeCollide(u8 a)
{
PlayCollisionSoundIfNotFacingWarp(a);
- player_npc_set_state_and_x22_etc(GetStepInPlaceDelay16AnimId(a), 2);
+ PlayerSetAnimId(GetStepInPlaceDelay16AnimId(a), 2);
}
static void PlayerNotOnBikeCollide(u8 a)
{
PlayCollisionSoundIfNotFacingWarp(a);
- player_npc_set_state_and_x22_etc(GetStepInPlaceDelay32AnimId(a), 2);
+ PlayerSetAnimId(GetStepInPlaceDelay32AnimId(a), 2);
}
-void PlayerFaceDirection(u8 a)
+void PlayerFaceDirection(u8 direction)
{
- player_npc_set_state_and_x22_etc(GetFaceDirectionAnimId(a), 1);
+ PlayerSetAnimId(GetFaceDirectionAnimId(direction), 1);
}
-void PlayerTurnInPlace(u8 a)
+void PlayerTurnInPlace(u8 direction)
{
- player_npc_set_state_and_x22_etc(GetStepInPlaceDelay8AnimId(a), 1);
+ PlayerSetAnimId(GetStepInPlaceDelay8AnimId(direction), 1);
}
-void PlayerJumpLedge(u8 a)
+void PlayerJumpLedge(u8 direction)
{
PlaySE(SE_DANSA);
- player_npc_set_state_and_x22_etc(GetJumpLedgeAnimId(a), 8);
+ PlayerSetAnimId(GetJumpLedgeAnimId(direction), 8);
}
void sub_80594C0(void)
@@ -718,69 +886,70 @@ void sub_80594C0(void)
void sub_8059504(u8 a)
{
- player_npc_set_state_and_x22_etc(sub_80609D8(a), 1);
+ PlayerSetAnimId(sub_80609D8(a), 1);
}
-void sub_805951C(u8 a)
+//normal to wheelie
+void PlayerStartWheelie(u8 a)
{
- player_npc_set_state_and_x22_etc(sub_8060A04(a), 1);
+ PlayerSetAnimId(sub_8060A04(a), 1);
}
void sub_8059534(u8 a)
{
- player_npc_set_state_and_x22_etc(sub_8060A30(a), 1);
+ PlayerSetAnimId(sub_8060A30(a), 1);
}
void sub_805954C(u8 a)
{
PlaySE(SE_JITE_PYOKO);
- player_npc_set_state_and_x22_etc(sub_8060A5C(a), 1);
+ PlayerSetAnimId(sub_8060A5C(a), 1);
}
void sub_8059570(u8 a)
{
PlaySE(SE_JITE_PYOKO);
- player_npc_set_state_and_x22_etc(sub_8060A88(a), 2);
+ PlayerSetAnimId(sub_8060A88(a), 2);
}
void sub_8059594(u8 a)
{
PlaySE(SE_JITE_PYOKO);
- player_npc_set_state_and_x22_etc(sub_8060AB4(a), 8);
+ PlayerSetAnimId(sub_8060AB4(a), 8);
}
-void sub_80595B8(u8 a)
+void sub_80595B8(u8 direction)
{
PlaySE(SE_JITE_PYOKO);
- player_npc_set_state_and_x22_etc(sub_8060878(a), 1);
+ PlayerSetAnimId(sub_8060878(direction), 1);
}
-void sub_80595DC(u8 a)
+void sub_80595DC(u8 direction)
{
PlaySE(SE_WALL_HIT);
- player_npc_set_state_and_x22_etc(sub_8060AE0(a), 2);
+ PlayerSetAnimId(sub_8060AE0(direction), 2);
}
void sub_8059600(u8 a)
{
- player_npc_set_state_and_x22_etc(sub_8060B0C(a), 2);
+ PlayerSetAnimId(sub_8060B0C(a), 2);
}
void sub_8059618(u8 a)
{
- player_npc_set_state_and_x22_etc(sub_8060B38(a), 2);
+ PlayerSetAnimId(sub_8060B38(a), 2);
}
void sub_8059630(u8 a)
{
- player_npc_set_state_and_x22_etc(sub_8060B64(a), 2);
+ PlayerSetAnimId(sub_8060B64(a), 2);
}
static void PlayCollisionSoundIfNotFacingWarp(u8 a)
{
s16 x, y;
u8 unk = gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E;
-
+
if (!gUnknown_0830FC34[a - 1](unk))
{
if (a == 2)
@@ -850,7 +1019,7 @@ void sub_80597E8(void)
void sub_80597F4(void)
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
npc_clear_strange_bits(playerMapObj);
FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18);
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
@@ -860,51 +1029,51 @@ void sub_80597F4(void)
}
}
-u8 sub_805983C(u8 a, u8 b)
+u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)
{
- return gUnknown_0830FC44[a][b];
+ return sRivalAvatarGfxIds[state][gender];
}
-static u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 a, u8 b)
+static u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)
{
- return gUnknown_0830FC54[a][b];
+ return sPlayerAvatarGfxIds[state][gender];
}
-u8 GetPlayerAvatarGraphicsIdByStateId(u8 a)
+u8 GetPlayerAvatarGraphicsIdByStateId(u8 state)
{
- return GetPlayerAvatarGraphicsIdByStateIdAndGender(a, gPlayerAvatar.gender);
+ return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender);
}
-u8 unref_sub_8059888(u8 a)
+u8 unref_GetRivalAvatarGenderByGraphcsId(u8 gfxId)
{
- switch (a)
+ switch (gfxId)
{
- case 0x69:
- case 0x6A:
- case 0x6B:
- case 0x6C:
- case 0x6D:
- case 0x70:
- case 0x8A:
- case 0xC0:
+ case MAP_OBJ_GFX_RIVAL_MAY_NORMAL:
+ case MAP_OBJ_GFX_RIVAL_MAY_MACH_BIKE:
+ case MAP_OBJ_GFX_RIVAL_MAY_ACRO_BIKE:
+ case MAP_OBJ_GFX_RIVAL_MAY_SURFING:
+ case MAP_OBJ_GFX_RIVAL_MAY_FIELD_MOVE:
+ case MAP_OBJ_GFX_MAY_UNDERWATER:
+ case MAP_OBJ_GFX_MAY_FISHING:
+ case MAP_OBJ_GFX_MAY_WATERING:
return FEMALE;
default:
return MALE;
}
}
-u8 GetPlayerAvatarGenderByGraphicsId(u8 a)
+u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId)
{
- switch (a)
+ switch (gfxId)
{
- case 0x59:
- case 0x5A:
- case 0x5B:
- case 0x5C:
- case 0x5D:
- case 0x70:
- case 0x8A:
- case 0xC0:
+ case MAP_OBJ_GFX_MAY_NORMAL:
+ case MAP_OBJ_GFX_MAY_MACH_BIKE:
+ case MAP_OBJ_GFX_MAY_ACRO_BIKE:
+ case MAP_OBJ_GFX_MAY_SURFING:
+ case MAP_OBJ_GFX_MAY_FIELD_MOVE:
+ case MAP_OBJ_GFX_MAY_UNDERWATER:
+ case MAP_OBJ_GFX_MAY_FISHING:
+ case MAP_OBJ_GFX_MAY_WATERING:
return FEMALE;
default:
return MALE;
@@ -914,7 +1083,7 @@ u8 GetPlayerAvatarGenderByGraphicsId(u8 a)
bool8 PartyHasMonWithSurf(void)
{
u8 i;
-
+
if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
{
for (i = 0; i < 6; i++)
@@ -930,7 +1099,7 @@ bool8 PartyHasMonWithSurf(void)
bool8 IsPlayerSurfingNorth(void)
{
- if (player_get_direction_upper_nybble() == 2 && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ if (player_get_direction_upper_nybble() == DIR_NORTH && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
return TRUE;
else
return FALSE;
@@ -941,7 +1110,7 @@ bool8 IsPlayerFacingSurfableFishableWater(void)
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
s16 x = playerMapObj->coords2.x;
s16 y = playerMapObj->coords2.y;
-
+
MoveCoords(playerMapObj->mapobj_unk_18, &x, &y);
if (npc_block_way(playerMapObj, x, y, playerMapObj->mapobj_unk_18) == 3 && PlayerGetZCoord() == 3
&& MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(x, y)))
@@ -953,7 +1122,7 @@ bool8 IsPlayerFacingSurfableFishableWater(void)
void ClearPlayerAvatarInfo(void)
{
//TODO: 0x24 should be the size of gPlayerAvatar
- memset(&gPlayerAvatar, 0, 0x24);
+ memset(&gPlayerAvatar, 0, sizeof(struct PlayerAvatar));
}
void SetPlayerAvatarStateMask(u8 a)
@@ -965,7 +1134,7 @@ void SetPlayerAvatarStateMask(u8 a)
static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 a, u8 gender)
{
u8 i;
-
+
for (i = 0; i < 5; i++)
{
if (gUnknown_0830FC64[gender][i][0] == a)
@@ -978,7 +1147,7 @@ u8 GetPlayerAvatarGraphicsIdByCurrentState(void)
{
u8 i;
u8 r5 = gPlayerAvatar.flags;
-
+
for (i = 0; i < 5; i++)
{
if (gUnknown_0830FC64[gPlayerAvatar.gender][i][1] & r5)
@@ -990,40 +1159,40 @@ u8 GetPlayerAvatarGraphicsIdByCurrentState(void)
void SetPlayerAvatarExtraStateTransition(u8 a, u8 b)
{
u8 unk = GetPlayerAvatarStateTransitionByGraphicsId(a, gPlayerAvatar.gender);
-
+
gPlayerAvatar.bike |= unk | b;
DoPlayerAvatarTransition();
}
-void InitPlayerAvatar(s16 a, s16 b, u8 c, u8 d)
+void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender)
{
- struct UnknownStruct_FPA s;
+ struct MapObjectTemplate playerMapObjTemplate;
u8 mapObjectId;
struct MapObject *mapObject;
-
- s.unk0 = 0xFF;
- s.unk1 = GetPlayerAvatarGraphicsIdByStateIdAndGender(0, d);
- s.unk4 = a - 7;
- s.unk6 = b - 7;
- s.unk8 = 0;
- s.unk9 = 11;
- s.unkA_0 = 0;
- s.unkA_4 = 0;
- s.unkC = 0;
- s.unkE = 0;
- s.unk10 = 0;
- s.unk14 = 0;
- mapObjectId = SpawnSpecialFieldObject(&s);
+
+ playerMapObjTemplate.localId = 0xFF;
+ playerMapObjTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(0, gender);
+ playerMapObjTemplate.x = x - 7;
+ playerMapObjTemplate.y = y - 7;
+ playerMapObjTemplate.elevation = 0;
+ playerMapObjTemplate.movementType = 11;
+ playerMapObjTemplate.unkA_0 = 0;
+ playerMapObjTemplate.unkA_4 = 0;
+ playerMapObjTemplate.unkC = 0;
+ playerMapObjTemplate.unkE = 0;
+ playerMapObjTemplate.script = NULL;
+ playerMapObjTemplate.flagId = 0;
+ mapObjectId = SpawnSpecialFieldObject(&playerMapObjTemplate);
mapObject = &gMapObjects[mapObjectId];
mapObject->mapobj_bit_16 = 1;
mapObject->mapobj_unk_1B = sub_8126B54();
- FieldObjectTurn(mapObject, c);
+ FieldObjectTurn(mapObject, direction);
ClearPlayerAvatarInfo();
gPlayerAvatar.running2 = 0;
gPlayerAvatar.running1 = 0;
gPlayerAvatar.mapObjectId = mapObjectId;
gPlayerAvatar.spriteId = mapObject->spriteId;
- gPlayerAvatar.gender = d;
+ gPlayerAvatar.gender = gender;
SetPlayerAvatarStateMask(0x21);
}
@@ -1065,7 +1234,7 @@ static void sub_8059D60(struct MapObject *a)
s16 y;
u8 r6;
u8 r8 = a->mapobj_unk_1E;
-
+
for (x = 0, r6 = 1; x < 4; x++, r6++)
{
if (gUnknown_0830FC78[x](r8) && r6 == a->placeholder18)
@@ -1087,7 +1256,7 @@ static void sub_8059E2C(u8 taskId);
static void StartStrengthAnim(u8 a, u8 b)
{
u8 taskId = CreateTask(sub_8059E2C, 0xFF);
-
+
gTasks[taskId].data[1] = a;
gTasks[taskId].data[2] = b;
sub_8059E2C(taskId);
@@ -1118,10 +1287,10 @@ u8 sub_8059EA4(struct Task *task, struct MapObject *b, struct MapObject *c)
FieldObjectClearAnimIfSpecialAnimFinished(c);
FieldObjectSetSpecialAnim(b, GetStepInPlaceDelay16AnimId(task->data[2]));
FieldObjectSetSpecialAnim(c, GetSimpleGoAnimId(task->data[2]));
- gUnknown_0202FF84.x = c->coords2.x;
- gUnknown_0202FF84.y = c->coords2.y;
- gUnknown_0202FF84.unk8 = c->elevation;
- gUnknown_0202FF84.unkC = gSprites[c->spriteId].oam.priority;
+ gUnknown_0202FF84[0] = c->coords2.x;
+ gUnknown_0202FF84[1] = c->coords2.y;
+ gUnknown_0202FF84[2] = c->elevation;
+ gUnknown_0202FF84[3] = gSprites[c->spriteId].oam.priority;
FieldEffectStart(10);
PlaySE(SE_W070);
task->data[0]++;
@@ -1150,7 +1319,7 @@ static void sub_8059FB4(u8 taskId);
static void sub_8059F94(void)
{
u8 taskId = CreateTask(sub_8059FB4, 0xFF);
-
+
sub_8059FB4(taskId);
}
@@ -1185,7 +1354,7 @@ static void sub_805A08C(u8 taskId);
static void sub_805A06C(void)
{
u8 taskId = CreateTask(sub_805A08C, 0xFF);
-
+
sub_805A08C(taskId);
}
@@ -1207,13 +1376,12 @@ u8 sub_805A0D8(struct Task *task, struct MapObject *mapObject)
u8 sub_805A100(struct Task *task, struct MapObject *mapObject)
{
- u8 directions[4];
-
- memcpy(directions, gUnknown_0830FCA8, sizeof(directions));
+ u8 directions[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH};
+
if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject))
{
u8 direction;
-
+
FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(direction = directions[mapObject->placeholder18 - 1]));
if (direction == (u8)task->data[1])
task->data[2]++;
@@ -1226,9 +1394,8 @@ u8 sub_805A100(struct Task *task, struct MapObject *mapObject)
u8 sub_805A178(struct Task *task, struct MapObject *mapObject)
{
- u8 arr[5];
-
- memcpy(arr, gUnknown_0830FCAC, sizeof(arr));
+ const u8 arr[] = {16, 16, 17, 18, 19};
+
if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject))
{
FieldObjectSetSpecialAnim(mapObject, arr[task->data[2]]);
@@ -1257,7 +1424,7 @@ static void sub_805A2D0(u8 taskId);
void sub_805A20C(u8 a)
{
u8 taskId;
-
+
ScriptContext2_Enable();
sav1_reset_battle_music_maybe();
sub_8053F84();
@@ -1272,7 +1439,7 @@ void sub_805A20C(u8 a)
static void taskFF_0805D1D4(u8 taskId)
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerMapObj))
{
if (!FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj))
@@ -1286,7 +1453,7 @@ static void taskFF_0805D1D4(u8 taskId)
static void sub_805A2D0(u8 taskId)
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
if (FieldObjectClearAnimIfSpecialAnimFinished(playerMapObj))
{
sub_805B980(playerMapObj, GetPlayerAvatarGraphicsIdByStateId(0));
@@ -1300,13 +1467,33 @@ static void sub_805A2D0(u8 taskId)
/* Fishing */
+static u8 (*const gUnknown_0830FCB4[])(struct Task *) =
+{
+ Fishing1,
+ Fishing2,
+ Fishing3,
+ Fishing4,
+ Fishing5,
+ Fishing6,
+ Fishing7,
+ Fishing8,
+ Fishing9,
+ Fishing10,
+ Fishing11,
+ Fishing12,
+ Fishing13,
+ Fishing14,
+ Fishing15,
+ Fishing16,
+};
+
static void Task_Fishing(u8 taskId);
static void sub_805A954(void);
void StartFishing(u8 a)
{
u8 taskId = CreateTask(Task_Fishing, 0xFF);
-
+
gTasks[taskId].data[15] = a;
Task_Fishing(taskId);
}
@@ -1327,12 +1514,10 @@ u8 Fishing1(struct Task *task)
u8 Fishing2(struct Task *task)
{
- s16 arr1[3];
- s16 arr2[3];
struct MapObject *playerMapObj;
-
- memcpy(arr1, gUnknown_0830FCF4, sizeof(arr1));
- memcpy(arr2, gUnknown_0830FCFA, sizeof(arr2));
+ const s16 arr1[] = {1, 1, 1};
+ const s16 arr2[] = {1, 3, 6};
+
task->data[12] = 0;
task->data[13] = arr1[task->data[15]] + (Random() % arr2[task->data[15]]);
task->data[14] = gMapObjects[gPlayerAvatar.mapObjectId].graphicsId;
@@ -1356,7 +1541,7 @@ u8 Fishing3(struct Task *task)
u8 Fishing4(struct Task *task)
{
u32 randVal;
-
+
MenuDisplayMessageBox();
task->data[0]++;
task->data[1] = 0;
@@ -1373,9 +1558,8 @@ u8 Fishing4(struct Task *task)
u8 Fishing5(struct Task *task)
{
- u8 dot[2];
-
- memcpy(dot, gUnknown_0830FD00, sizeof(dot));
+ const u8 dot[] = _("·");
+
sub_805A954();
task->data[1]++;
if (gMain.newKeys & A_BUTTON)
@@ -1429,9 +1613,8 @@ u8 Fishing7(struct Task *task)
u8 Fishing8(struct Task *task)
{
- s16 arr[3];
-
- memcpy(arr, gUnknown_0830FD02, sizeof(arr));
+ const s16 arr[3] = {36, 33, 30};
+
sub_805A954();
task->data[1]++;
if (task->data[1] >= arr[task->data[15]])
@@ -1443,9 +1626,13 @@ u8 Fishing8(struct Task *task)
u8 Fishing9(struct Task *task)
{
- s16 arr[3][2];
-
- memcpy(arr, gUnknown_0830FD08, sizeof(arr));
+ const s16 arr[][2] =
+ {
+ {0, 0},
+ {40, 10},
+ {70, 30}
+ };
+
sub_805A954();
task->data[0]++;
if (task->data[12] < task->data[13])
@@ -1455,7 +1642,7 @@ u8 Fishing9(struct Task *task)
else if (task->data[12] < 2)
{
s16 randVal = Random() % 100;
-
+
if (arr[task->data[15]][task->data[12]] > randVal)
task->data[0] = 3;
}
@@ -1482,7 +1669,7 @@ u8 Fishing11(struct Task *task)
if (MenuUpdateWindowText())
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
sub_805B980(playerMapObj, task->data[14]);
FieldObjectTurn(playerMapObj, playerMapObj->placeholder18);
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
@@ -1540,7 +1727,7 @@ u8 Fishing15(struct Task *task)
if (gSprites[gPlayerAvatar.spriteId].animEnded)
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
-
+
sub_805B980(playerMapObj, task->data[14]);
FieldObjectTurn(playerMapObj, playerMapObj->placeholder18);
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
@@ -1571,7 +1758,7 @@ static void sub_805A954(void)
struct Sprite *playerSprite = &gSprites[gPlayerAvatar.spriteId];
u8 animCmdIndex;
u8 animType;
-
+
AnimateSprite(playerSprite);
playerSprite->pos2.x = 0;
playerSprite->pos2.y = 0;
diff --git a/src/field_poison.c b/src/field_poison.c
index 9b21ac5f3..8e49080b0 100644
--- a/src/field_poison.c
+++ b/src/field_poison.c
@@ -5,6 +5,7 @@
#include "script.h"
#include "string_util.h"
#include "task.h"
+#include "text.h"
extern struct Pokemon gPlayerParty[6];
extern u16 gScriptResult;
@@ -14,7 +15,7 @@ bool32 CheckMonIsValid(struct Pokemon *pkmn)
{
// UB: Too few arguments for function 'GetMonData'
u16 species2 = GetMonData(pkmn, MON_DATA_SPECIES2);
-
+
if (species2 == 0 || species2 == 0x19C)
return FALSE;
else
@@ -25,7 +26,7 @@ bool32 AllMonsFainted(void)
{
struct Pokemon *pkmn = &gPlayerParty[0];
int i;
-
+
for (i = 0; i < 6; i++, pkmn++)
{
// UB: Too few arguments for function 'GetMonData'
@@ -39,7 +40,7 @@ void MonFaintFromPoisonOnField(u8 partyMember)
{
struct Pokemon *pkmn = &gPlayerParty[partyMember];
u32 val = 0;
-
+
AdjustFriendship(pkmn, 7);
SetMonData(pkmn, MON_DATA_STATUS, (u8*)&val);
GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1);
@@ -49,7 +50,7 @@ void MonFaintFromPoisonOnField(u8 partyMember)
bool32 CheckMonFaintedFromPoison(u8 partyMember)
{
struct Pokemon *pkmn = &gPlayerParty[partyMember];
-
+
// UB: Too few arguments for function 'GetMonData'
if (CheckMonIsValid(pkmn) && GetMonData(pkmn, MON_DATA_HP) == 0
&& pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1)
@@ -68,7 +69,7 @@ enum
void Task_WhiteOut(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
-
+
switch (taskData[TD_STATE])
{
case 0: //Check if Pokemon have fainted due to poison
@@ -106,36 +107,36 @@ void ExecuteWhiteOut(void)
ScriptContext1_Stop();
}
-u8 overworld_poison(void)
+s32 overworld_poison(void)
{
struct Pokemon *pkmn = &gPlayerParty[0];
u32 numPoisoned = 0;
u32 numFainting = 0;
int i;
-
- for(i = 0; i < 6; i++)
+
+ for (i = 0; i < 6; i++)
{
u32 hp;
-
+
// UB: Too few arguments for function 'GetMonData'
if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0
&& pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1)
{
hp = GetMonData(pkmn, MON_DATA_HP);
- if(hp != 0)
+ if (hp != 0)
hp--;
- if(hp == 0)
+ if (hp == 0)
numFainting++; //Pokemon will now faint due to poison
SetMonData(pkmn, MON_DATA_HP, (u8 *)&hp);
numPoisoned++;
}
pkmn++;
}
- if(numFainting != 0 || numPoisoned != 0)
+ if (numFainting != 0 || numPoisoned != 0)
DoFieldPoisonEffect();
- if(numFainting != 0)
+ if (numFainting != 0)
return 2;
- if(numPoisoned != 0)
+ if (numPoisoned != 0)
return 1;
return 0;
}
diff --git a/src/field_region_map.c b/src/field_region_map.c
new file mode 100644
index 000000000..db12eb6a5
--- /dev/null
+++ b/src/field_region_map.c
@@ -0,0 +1,134 @@
+#include "global.h"
+#include "asm.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "sprite.h"
+#include "text.h"
+
+extern void sub_80FA8EC(u32, u8);
+extern void sub_80FAB10(void);
+extern u8 sub_80FAB60(void);
+extern void sub_80FBCF0(u32, u8);
+extern void sub_80FBB3C(u16, u16);
+
+struct RegionMapStruct
+{
+ u8 str[0x16];
+ u8 unk16;
+ u8 filler[0x869];
+};
+
+struct UnkStruct
+{
+ MainCallback callback;
+ u8 filler[4];
+ struct RegionMapStruct unk8;
+ u16 unk888;
+};
+
+extern struct UnkStruct unk_2000000;
+
+extern u8 gOtherText_Hoenn[];
+
+void CB2_FieldInitRegionMap(void);
+void CB2_FieldRegionMap(void);
+void VBlankCB_FieldRegionMap(void);
+void sub_813EFDC(void);
+void sub_813F0C8(void);
+
+void FieldInitRegionMap(MainCallback callback)
+{
+ SetVBlankCallback(NULL);
+ unk_2000000.unk888 = 0;
+ unk_2000000.callback = callback;
+ SetMainCallback2(CB2_FieldInitRegionMap);
+}
+
+void CB2_FieldInitRegionMap(void)
+{
+ REG_DISPCNT = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ sub_80FA8EC((u32)&unk_2000000.unk8, 0);
+ sub_80FBCF0(0, 0);
+ sub_80FBB3C(1, 1);
+ SetUpWindowConfig(&gWindowConfig_81E709C);
+ InitMenuWindow(&gWindowConfig_81E709C);
+ MenuZeroFillScreen();
+ REG_BG0CNT = 7936;
+ MenuDrawTextWindow(21, 0, 29, 3);
+ sub_8072BD8(gOtherText_Hoenn, 0x16, 1, 0x38);
+ MenuDrawTextWindow(16, 16, 29, 19);
+ sub_813F0C8();
+ SetMainCallback2(CB2_FieldRegionMap);
+ SetVBlankCallback(VBlankCB_FieldRegionMap);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
+}
+
+void VBlankCB_FieldRegionMap(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void CB2_FieldRegionMap(void)
+{
+ sub_813EFDC();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_813EFDC(void)
+{
+ switch (unk_2000000.unk888)
+ {
+ case 0:
+ REG_DISPCNT = 5441;
+ unk_2000000.unk888++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ unk_2000000.unk888++;
+ break;
+ case 2:
+ switch (sub_80FAB60())
+ {
+ case 3:
+ sub_813F0C8();
+ break;
+ case 4:
+ case 5:
+ unk_2000000.unk888++;
+ }
+ break;
+ case 3:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ unk_2000000.unk888++;
+ break;
+ case 4:
+ if (!gPaletteFade.active)
+ {
+ sub_80FAB10();
+ SetMainCallback2(unk_2000000.callback);
+ }
+ break;
+ }
+}
+
+void sub_813F0C8(void)
+{
+ MenuFillWindowRectWithBlankTile(17, 17, 28, 18);
+ if (unk_2000000.unk8.unk16)
+ MenuPrint(unk_2000000.unk8.str, 17, 17);
+}
diff --git a/src/field_special_scene.c b/src/field_special_scene.c
index 80a1727d8..fe7daea0a 100644
--- a/src/field_special_scene.c
+++ b/src/field_special_scene.c
@@ -1,15 +1,26 @@
#include "global.h"
#include "field_special_scene.h"
#include "asm.h"
+#include "event_data.h"
+#include "field_camera.h"
#include "palette.h"
-#include "task.h"
+#include "rom4.h"
#include "script.h"
#include "songs.h"
#include "sound.h"
-#include "field_camera.h"
-#include "rom4.h"
-#include "event_data.h"
#include "sprite.h"
+#include "task.h"
+
+#define SECONDS(value) ((signed) (60.0 * value + 0.5))
+
+// porthole states
+enum
+{
+ INIT_PORTHOLE,
+ IDLE_CHECK,
+ EXECUTE_MOVEMENT,
+ EXIT_PORTHOLE,
+};
extern s8 gTruckCamera_HorizontalTable[];
@@ -44,20 +55,18 @@ void Task_Truck1(u8 taskId)
u8 mapNum, mapGroup;
register s16 zero asm("r4");
- box1 = GetTruckBoxMovement(data[0] + 30) * 4; // box 1 happens 30 frames earlier than the other 2.
+ box1 = GetTruckBoxMovement(data[0] + 30) * 4; // top box.
sub_805BD90(1, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 3, box1 + 3);
- box2 = GetTruckBoxMovement(data[0]) * 2;
+ box2 = GetTruckBoxMovement(data[0]) * 2; // bottom left box.
sub_805BD90(2, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, 0, box2 - 3);
- box3 = GetTruckBoxMovement(data[0]) * 4;
+ box3 = GetTruckBoxMovement(data[0]) * 4; // bottom right box.
mapNum = gSaveBlock1.location.mapNum;
mapGroup = gSaveBlock1.location.mapGroup;
zero = 0;
sub_805BD90(3, mapNum, mapGroup, -3, box3);
- data[0]++;
-
- if (data[0] == 0x7530) // timer?
- data[0] = zero;
+ if (++data[0] == SECONDS(500)) // this will never run
+ data[0] = zero; // reset the timer if it gets stuck.
cameraYpan = GetTruckCameraBobbingY(data[0]);
SetCameraPanning(0, cameraYpan);
@@ -142,7 +151,7 @@ void Task_HandleTruckSequence(u8 taskId)
*/
case 0:
data[1]++;
- if (data[1] == 90)
+ if (data[1] == SECONDS(1.5))
{
SetCameraPanningCallback(0);
data[1] = 0; // reset the timer.
@@ -153,7 +162,7 @@ void Task_HandleTruckSequence(u8 taskId)
break;
case 1:
data[1]++;
- if (data[1] == 150)
+ if (data[1] == SECONDS(2.5))
{
pal_fill_black();
data[1] = 0;
@@ -162,7 +171,7 @@ void Task_HandleTruckSequence(u8 taskId)
break;
case 2:
data[1]++;
- if(!gPaletteFade.active && data[1] > 300)
+ if (!gPaletteFade.active && data[1] > SECONDS(5))
{
data[1] = 0;
DestroyTask(data[2]);
@@ -241,22 +250,22 @@ bool8 sub_80C7754(void)
}
}
-void sub_80C77A0(u8 taskId)
+void Task_HandlePorthole(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- u16 *var = GetVarPointer(0x40B4);
+ u16 *var = GetVarPointer(VAR_PORTHOLE);
struct WarpData *location = &gSaveBlock1.location;
switch (data[0])
{
- case 0:
+ case INIT_PORTHOLE: // finish fading before making porthole finish.
if (!gPaletteFade.active)
{
data[1] = 0;
- data[0] = 2;
+ data[0] = EXECUTE_MOVEMENT; // execute movement before checking if should be exited. strange?
}
break;
- case 1:
+ case IDLE_CHECK: // idle and move.
if (gMain.newKeys & A_BUTTON)
data[1] = 1;
if (!sub_80A212C(0xFF, location->mapNum, location->mapGroup))
@@ -271,25 +280,25 @@ void sub_80C77A0(u8 taskId)
return;
}
data[0] = 2;
- case 2:
+ case EXECUTE_MOVEMENT: // execute movement.
if (data[1])
{
- data[0] = 3;
+ data[0] = EXIT_PORTHOLE; // exit porthole.
return;
}
-
- if (*var == 2)
+ // run this once.
+ if (*var == 2) // which direction?
{
exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_083D295F);
- data[0] = 1;
+ data[0] = IDLE_CHECK; // run case 1.
}
else
{
exec_movement(0xFF, location->mapNum, location->mapGroup, gUnknown_083D2961);
- data[0] = 1;
+ data[0] = IDLE_CHECK; // run case 1.
}
break;
- case 3:
+ case EXIT_PORTHOLE: // exit porthole.
FlagReset(0x4001);
FlagReset(0x4000);
copy_saved_warp2_bank_and_enter_x_to_warp1(0);
@@ -320,7 +329,7 @@ void sub_80C791C(void)
sub_80C78A0();
gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = TRUE;
pal_fill_black();
- CreateTask(sub_80C77A0, 80);
+ CreateTask(Task_HandlePorthole, 80);
ScriptContext2_Enable();
}
diff --git a/src/fieldmap.c b/src/fieldmap.c
index 4dcfbe30b..b34a51bdc 100644
--- a/src/fieldmap.c
+++ b/src/fieldmap.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "palette.h"
+#include "fieldmap.h"
struct BackupMapData
{
@@ -16,22 +17,18 @@ extern void sub_8056670();
extern void UpdateTVScreensOnMap();
extern void sub_80538F0(u8 mapGroup, u8 mapNum);
-struct Camera {
- bool8 field_0:1;
- s32 x;
- s32 y;
-};
-
-struct ConnectionFlags {
- u8 south:1;
- u8 north:1;
- u8 west:1;
- u8 east:1;
+struct ConnectionFlags
+{
+ u8 south:1;
+ u8 north:1;
+ u8 west:1;
+ u8 east:1;
};
-struct Coords32 {
- s32 x;
- s32 y;
+struct Coords32
+{
+ s32 x;
+ s32 y;
};
extern const struct Coords32 gUnknown_0821664C[];
@@ -56,754 +53,927 @@ struct MapConnection *sub_8056A64(u8 direction, int x, int y);
bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection);
bool8 sub_8056B20(int x, int src_width, int dest_width, int offset);
-struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection) {
- return get_mapheader_by_bank_and_number(connection->mapGroup, connection->mapNum);
-}
-
-void not_trainer_hill_battle_pyramid(void) {
- mapheader_copy_mapdata_with_padding(&gMapHeader);
- sub_80BB970(gMapHeader.events);
- mapheader_run_script_with_tag_x1();
-}
-
-void sub_8055FC0(void) {
- mapheader_copy_mapdata_with_padding(&gMapHeader);
- sub_80BBCCC(0);
- sub_80BB970(gMapHeader.events);
- sub_8056670();
- mapheader_run_script_with_tag_x1();
- UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height);
-}
-
-void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader) {
- struct MapData *mapData;
- int width;
- int height;
- mapData = mapHeader->mapData;
- CpuFastFill16(0x03ff, gUnknown_02029828, sizeof(gUnknown_02029828));
- gUnknown_03004870.map = gUnknown_02029828;
- width = mapData->width + 15;
- gUnknown_03004870.width = width;
- height = mapData->height + 14;
- gUnknown_03004870.height = height;
- if (width * height <= 0x2800) {
- map_copy_with_padding(mapData->map, mapData->width, mapData->height);
- sub_80560AC(mapHeader);
- }
-}
-
-void map_copy_with_padding(u16 *map, u16 width, u16 height) {
- u16 *dest;
- int y;
- dest = gUnknown_03004870.map;
- dest += gUnknown_03004870.width * 7 + 7;
- for (y = 0; y < height; y++) {
- CpuCopy16(map, dest, width * 2);
- dest += width + 0xf;
- map += width;
- }
-}
-
-void sub_80560AC(struct MapHeader *mapHeader) {
- int i;
- struct MapConnection *connection;
- struct MapHeader *cMap;
- u32 offset;
- int count;
- count = mapHeader->connections->count;
- connection = mapHeader->connections->connections;
- gUnknown_0202E850 = sDummyConnectionFlags;
- for (i = 0; i < count; i++, connection++) {
- cMap = mapconnection_get_mapheader(connection);
- offset = connection->offset;
- switch (connection->direction) {
- case CONNECTION_SOUTH:
- fillSouthConnection(mapHeader, cMap, offset);
- gUnknown_0202E850.south = 1;
- break;
- case CONNECTION_NORTH:
- fillNorthConnection(mapHeader, cMap, offset);
- gUnknown_0202E850.north = 1;
- break;
- case CONNECTION_WEST:
- fillWestConnection(mapHeader, cMap, offset);
- gUnknown_0202E850.west = 1;
- break;
- case CONNECTION_EAST:
- fillEastConnection(mapHeader, cMap, offset);
- gUnknown_0202E850.east = 1;
- break;
- }
- }
-}
-
-void sub_8056134(int x, int y, struct MapHeader *mapHeader, int x2, int y2, int width, int height) {
- int i;
- u16 *src;
- u16 *dest;
- int mapWidth;
-
- mapWidth = mapHeader->mapData->width;
- src = &mapHeader->mapData->map[mapWidth * y2 + x2];
- dest = &gUnknown_03004870.map[gUnknown_03004870.width * y + x];
-
- for (i = 0; i < height; i++) {
- CpuCopy16(src, dest, width * 2);
- dest += gUnknown_03004870.width;
- src += mapWidth;
- }
-}
-
-void fillSouthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) {
- int x, y;
- int x2;
- int width;
- int cWidth;
-
- if (connectedMapHeader) {
- cWidth = connectedMapHeader->mapData->width;
- x = offset + 7;
- y = mapHeader->mapData->height + 7;
- if (x < 0) {
- x2 = -x;
- x += cWidth;
- if (x < gUnknown_03004870.width) {
- width = x;
- } else {
- width = gUnknown_03004870.width;
- }
- x = 0;
- } else {
- x2 = 0;
- if (x + cWidth < gUnknown_03004870.width) {
- width = cWidth;
- } else {
- width = gUnknown_03004870.width - x;
- }
- }
- sub_8056134(
- x, y,
- connectedMapHeader,
- x2, /*y2*/ 0,
- width, /*height*/ 7);
- }
-}
-
-void fillNorthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) {
- int x;
- int x2, y2;
- int width;
- int cWidth, cHeight;
-
- if (connectedMapHeader) {
- cWidth = connectedMapHeader->mapData->width;
- cHeight = connectedMapHeader->mapData->height;
- x = offset + 7;
- y2 = cHeight - 7;
- if (x < 0) {
- x2 = -x;
- x += cWidth;
- if (x < gUnknown_03004870.width) {
- width = x;
- } else {
- width = gUnknown_03004870.width;
- }
- x = 0;
- } else {
- x2 = 0;
- if (x + cWidth < gUnknown_03004870.width) {
- width = cWidth;
- } else {
- width = gUnknown_03004870.width - x;
- }
- }
-
- sub_8056134(
- x, /*y*/ 0,
- connectedMapHeader,
- x2, y2,
- width, /*height*/ 7);
-
- }
-}
-
-
-void fillWestConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) {
- int y;
- int x2, y2;
- int height;
- int cWidth, cHeight;
- if (connectedMapHeader) {
- cWidth = connectedMapHeader->mapData->width;
- cHeight = connectedMapHeader->mapData->height;
- y = offset + 7;
- x2 = cWidth - 7;
- if (y < 0) {
- y2 = -y;
- if (y + cHeight < gUnknown_03004870.height) {
- height = y + cHeight;
- } else {
- height = gUnknown_03004870.height;
- }
- y = 0;
- } else {
- y2 = 0;
- if (y + cHeight < gUnknown_03004870.height) {
- height = cHeight;
- } else {
- height = gUnknown_03004870.height - y;
- }
- }
-
- sub_8056134(
- /*x*/ 0, y,
- connectedMapHeader,
- x2, y2,
- /*width*/ 7, height);
- }
-}
-
-void fillEastConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset) {
- int x, y;
- int y2;
- int height;
- int cHeight;
- if (connectedMapHeader) {
- cHeight = connectedMapHeader->mapData->height;
- x = mapHeader->mapData->width + 7;
- y = offset + 7;
- if (y < 0) {
- y2 = -y;
- if (y + cHeight < gUnknown_03004870.height) {
- height = y + cHeight;
- } else {
- height = gUnknown_03004870.height;
- }
- y = 0;
- } else {
- y2 = 0;
- if (y + cHeight < gUnknown_03004870.height) {
- height = cHeight;
- } else {
- height = gUnknown_03004870.height - y;
- }
- }
-
- sub_8056134(
- x, y,
- connectedMapHeader,
- /*x2*/ 0, y2,
- /*width*/ 8, height);
- }
-}
-
-union Block {
- struct {
- u16 block:10;
- u16 collision:2;
- u16 elevation:4;
- } block;
- u16 value;
+struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection)
+{
+ return get_mapheader_by_bank_and_number(connection->mapGroup, connection->mapNum);
+}
+
+void not_trainer_hill_battle_pyramid(void)
+{
+ mapheader_copy_mapdata_with_padding(&gMapHeader);
+ sub_80BB970(gMapHeader.events);
+ mapheader_run_script_with_tag_x1();
+}
+
+void sub_8055FC0(void)
+{
+ mapheader_copy_mapdata_with_padding(&gMapHeader);
+ sub_80BBCCC(0);
+ sub_80BB970(gMapHeader.events);
+ sub_8056670();
+ mapheader_run_script_with_tag_x1();
+ UpdateTVScreensOnMap(gUnknown_03004870.width, gUnknown_03004870.height);
+}
+
+void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader)
+{
+ struct MapData *mapData;
+ int width;
+ int height;
+ mapData = mapHeader->mapData;
+ CpuFastFill16(0x03ff, gUnknown_02029828, sizeof(gUnknown_02029828));
+ gUnknown_03004870.map = gUnknown_02029828;
+ width = mapData->width + 15;
+ gUnknown_03004870.width = width;
+ height = mapData->height + 14;
+ gUnknown_03004870.height = height;
+ if (width * height <= 0x2800)
+ {
+ map_copy_with_padding(mapData->map, mapData->width, mapData->height);
+ sub_80560AC(mapHeader);
+ }
+}
+
+void map_copy_with_padding(u16 *map, u16 width, u16 height)
+{
+ u16 *dest;
+ int y;
+ dest = gUnknown_03004870.map;
+ dest += gUnknown_03004870.width * 7 + 7;
+ for (y = 0; y < height; y++)
+ {
+ CpuCopy16(map, dest, width * 2);
+ dest += width + 0xf;
+ map += width;
+ }
+}
+
+void sub_80560AC(struct MapHeader *mapHeader)
+{
+ int i;
+ struct MapConnection *connection;
+ struct MapHeader *cMap;
+ u32 offset;
+ int count;
+ count = mapHeader->connections->count;
+ connection = mapHeader->connections->connections;
+ gUnknown_0202E850 = sDummyConnectionFlags;
+ for (i = 0; i < count; i++, connection++)
+ {
+ cMap = mapconnection_get_mapheader(connection);
+ offset = connection->offset;
+ switch (connection->direction)
+ {
+ case CONNECTION_SOUTH:
+ fillSouthConnection(mapHeader, cMap, offset);
+ gUnknown_0202E850.south = 1;
+ break;
+ case CONNECTION_NORTH:
+ fillNorthConnection(mapHeader, cMap, offset);
+ gUnknown_0202E850.north = 1;
+ break;
+ case CONNECTION_WEST:
+ fillWestConnection(mapHeader, cMap, offset);
+ gUnknown_0202E850.west = 1;
+ break;
+ case CONNECTION_EAST:
+ fillEastConnection(mapHeader, cMap, offset);
+ gUnknown_0202E850.east = 1;
+ break;
+ }
+ }
+}
+
+void sub_8056134(int x, int y, struct MapHeader *mapHeader, int x2, int y2, int width, int height)
+{
+ int i;
+ u16 *src;
+ u16 *dest;
+ int mapWidth;
+
+ mapWidth = mapHeader->mapData->width;
+ src = &mapHeader->mapData->map[mapWidth * y2 + x2];
+ dest = &gUnknown_03004870.map[gUnknown_03004870.width * y + x];
+
+ for (i = 0; i < height; i++)
+ {
+ CpuCopy16(src, dest, width * 2);
+ dest += gUnknown_03004870.width;
+ src += mapWidth;
+ }
+}
+
+void fillSouthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset)
+{
+ int x, y;
+ int x2;
+ int width;
+ int cWidth;
+
+ if (connectedMapHeader)
+ {
+ cWidth = connectedMapHeader->mapData->width;
+ x = offset + 7;
+ y = mapHeader->mapData->height + 7;
+ if (x < 0)
+ {
+ x2 = -x;
+ x += cWidth;
+ if (x < gUnknown_03004870.width)
+ {
+ width = x;
+ }
+ else
+ {
+ width = gUnknown_03004870.width;
+ }
+ x = 0;
+ }
+ else
+ {
+ x2 = 0;
+ if (x + cWidth < gUnknown_03004870.width)
+ {
+ width = cWidth;
+ }
+ else
+ {
+ width = gUnknown_03004870.width - x;
+ }
+ }
+ sub_8056134(
+ x, y,
+ connectedMapHeader,
+ x2, /*y2*/ 0,
+ width, /*height*/ 7);
+ }
+}
+
+void fillNorthConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset)
+{
+ int x;
+ int x2, y2;
+ int width;
+ int cWidth, cHeight;
+
+ if (connectedMapHeader)
+ {
+ cWidth = connectedMapHeader->mapData->width;
+ cHeight = connectedMapHeader->mapData->height;
+ x = offset + 7;
+ y2 = cHeight - 7;
+ if (x < 0)
+ {
+ x2 = -x;
+ x += cWidth;
+ if (x < gUnknown_03004870.width)
+ {
+ width = x;
+ }
+ else
+ {
+ width = gUnknown_03004870.width;
+ }
+ x = 0;
+ }
+ else
+ {
+ x2 = 0;
+ if (x + cWidth < gUnknown_03004870.width)
+ {
+ width = cWidth;
+ }
+ else
+ {
+ width = gUnknown_03004870.width - x;
+ }
+ }
+
+ sub_8056134(
+ x, /*y*/ 0,
+ connectedMapHeader,
+ x2, y2,
+ width, /*height*/ 7);
+
+ }
+}
+
+
+void fillWestConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset)
+{
+ int y;
+ int x2, y2;
+ int height;
+ int cWidth, cHeight;
+ if (connectedMapHeader)
+ {
+ cWidth = connectedMapHeader->mapData->width;
+ cHeight = connectedMapHeader->mapData->height;
+ y = offset + 7;
+ x2 = cWidth - 7;
+ if (y < 0)
+ {
+ y2 = -y;
+ if (y + cHeight < gUnknown_03004870.height)
+ {
+ height = y + cHeight;
+ }
+ else
+ {
+ height = gUnknown_03004870.height;
+ }
+ y = 0;
+ }
+ else
+ {
+ y2 = 0;
+ if (y + cHeight < gUnknown_03004870.height)
+ {
+ height = cHeight;
+ }
+ else
+ {
+ height = gUnknown_03004870.height - y;
+ }
+ }
+
+ sub_8056134(
+ /*x*/ 0, y,
+ connectedMapHeader,
+ x2, y2,
+ /*width*/ 7, height);
+ }
+}
+
+void fillEastConnection(struct MapHeader *mapHeader, struct MapHeader *connectedMapHeader, s32 offset)
+{
+ int x, y;
+ int y2;
+ int height;
+ int cHeight;
+ if (connectedMapHeader)
+ {
+ cHeight = connectedMapHeader->mapData->height;
+ x = mapHeader->mapData->width + 7;
+ y = offset + 7;
+ if (y < 0)
+ {
+ y2 = -y;
+ if (y + cHeight < gUnknown_03004870.height)
+ {
+ height = y + cHeight;
+ }
+ else
+ {
+ height = gUnknown_03004870.height;
+ }
+ y = 0;
+ }
+ else
+ {
+ y2 = 0;
+ if (y + cHeight < gUnknown_03004870.height)
+ {
+ height = cHeight;
+ }
+ else
+ {
+ height = gUnknown_03004870.height - y;
+ }
+ }
+
+ sub_8056134(
+ x, y,
+ connectedMapHeader,
+ /*x2*/ 0, y2,
+ /*width*/ 8, height);
+ }
+}
+
+union Block
+{
+ struct
+ {
+ u16 block:10;
+ u16 collision:2;
+ u16 elevation:4;
+ } block;
+ u16 value;
};
-u16 MapGridGetZCoordAt(int x, int y) {
- u16 block;
- int i;
- u16 *border;
-
- if (x >= 0 && x < gUnknown_03004870.width
- && y >= 0 && y < gUnknown_03004870.height) {
- block = gUnknown_03004870.map[x + gUnknown_03004870.width * y];
- } else {
- border = gMapHeader.mapData->border;
- i = (x + 1) & 1;
- i += ((y + 1) & 1) * 2;
- block = gMapHeader.mapData->border[i];
- block |= 0xc00;
- }
- if (block == 0x3ff) {
- return 0;
- }
- return block >> 12;
-}
-
-u16 MapGridIsImpassableAt(int x, int y) {
- u16 block;
- int i;
- u16 *border;
-
- if (x >= 0 && x < gUnknown_03004870.width
- && y >= 0 && y < gUnknown_03004870.height) {
- block = gUnknown_03004870.map[x + gUnknown_03004870.width * y];
- } else {
- border = gMapHeader.mapData->border;
- i = (x + 1) & 1;
- i += ((y + 1) & 1) * 2;
- block = gMapHeader.mapData->border[i];
- block |= 0xc00;
- }
- if (block == 0x3ff) {
- return 1;
- }
- return (block & 0xc00) >> 10;
-}
-
-u16 MapGridGetMetatileIdAt(int x, int y) {
- u16 block;
- int i;
- int j;
- struct MapData *mapData;
- u16 *border;
- u16 block2;
-
- if (x >= 0 && x < gUnknown_03004870.width
- && y >= 0 && y < gUnknown_03004870.height) {
- block = gUnknown_03004870.map[x + gUnknown_03004870.width * y];
- } else {
- mapData = gMapHeader.mapData;
- i = (x + 1) & 1;
- i += ((y + 1) & 1) * 2;
- block = mapData->border[i] | 0xc00;
- }
- if (block == 0x3ff) {
- border = gMapHeader.mapData->border;
- j = (x + 1) & 1;
- j += ((y + 1) & 1) * 2;
- block2 = gMapHeader.mapData->border[j];
- block2 |= 0xc00;
- return block2 & block;
- }
- return block & 0x3ff;
-}
-
-u32 MapGridGetMetatileBehaviorAt(int x, int y) {
- u16 metatile;
- metatile = MapGridGetMetatileIdAt(x, y);
- return GetBehaviorByMetatileId(metatile) & 0xff;
-}
-
-u16 MapGridGetMetatileLayerTypeAt(int x, int y) {
- u16 metatile;
- metatile = MapGridGetMetatileIdAt(x, y);
- return (GetBehaviorByMetatileId(metatile) & 0xf000) >> 12;
-}
-
-void MapGridSetMetatileIdAt(int x, int y, u16 metatile) {
- int i;
- if (x >= 0 && x < gUnknown_03004870.width
- && y >= 0 && y < gUnknown_03004870.height) {
- i = x + y * gUnknown_03004870.width;
- gUnknown_03004870.map[i] = (gUnknown_03004870.map[i] & 0xf000) | (metatile & 0xfff);
- }
-}
-
-void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) {
- int i;
- if (x >= 0 && x < gUnknown_03004870.width
- && y >= 0 && y < gUnknown_03004870.height) {
- i = x + gUnknown_03004870.width * y;
- gUnknown_03004870.map[i] = metatile;
- }
-}
-
-u32 GetBehaviorByMetatileId(u16 metatile) {
- u16 *attributes;
- if (metatile <= 0x1ff) {
- attributes = gMapHeader.mapData->primaryTileset->metatileAttributes;
- return attributes[metatile];
- } else if (metatile <= 0x3ff) {
- attributes = gMapHeader.mapData->secondaryTileset->metatileAttributes;
- return attributes[metatile - 0x200];
- } else {
- return 0xff;
- }
-}
-
-void save_serialize_map(void) {
- int i, j;
- int x, y;
- u16 *mapView;
- int width;
- mapView = gSaveBlock1.mapView;
- width = gUnknown_03004870.width;
- x = gSaveBlock1.pos.x;
- y = gSaveBlock1.pos.y;
- for (i = y; i < y + 14; i++)
- for (j = x; j < x + 15; j++) {
- *mapView++ = gUnknown_02029828[width * i + j];
- }
-}
-
-int sub_8056618(void) {
- u16 i;
- u32 r2;
- r2 = 0;
- for (i = 0; i < 0x200; i++) {
- r2 |= gSaveBlock1.mapView[i];
- }
- if (r2 == 0) {
- return 1;
- }
- return 0;
-}
-
-void sav2_mapdata_clear(void) {
- CpuFill16(0, gSaveBlock1.mapView, sizeof(gSaveBlock1.mapView));
-}
-
-void sub_8056670(void) {
- int i, j;
- int x, y;
- u16 *mapView;
- int width;
- mapView = gSaveBlock1.mapView;
- if (!sub_8056618()) {
- width = gUnknown_03004870.width;
- x = gSaveBlock1.pos.x;
- y = gSaveBlock1.pos.y;
- for (i = y; i < y + 14; i++)
- for (j = x; j < x + 15; j++) {
- gUnknown_02029828[width * i + j] = *mapView++;
- }
- sav2_mapdata_clear();
- }
-}
-
-void sub_80566F0(u8 a1) {
- u16 *mapView;
- int width;
- int x0, y0;
- int x2, y2;
- u16 *src, *dest;
- int srci, desti;
- int r9, r8;
- int x, y;
- int i, j;
- mapView = gSaveBlock1.mapView;
- width = gUnknown_03004870.width;
- r9 = 0;
- r8 = 0;
- x0 = gSaveBlock1.pos.x;
- y0 = gSaveBlock1.pos.y;
- x2 = 15;
- y2 = 14;
- switch (a1) {
- case CONNECTION_NORTH:
- y0 += 1;
- y2 = 13;
- break;
- case CONNECTION_SOUTH:
- r8 = 1;
- y2 = 13;
- break;
- case CONNECTION_WEST:
- x0 += 1;
- x2 = 14;
- break;
- case CONNECTION_EAST:
- r9 = 1;
- x2 = 14;
- break;
- }
- for (y = 0; y < y2; y++) {
- i = 0;
- j = 0;
- for (x = 0; x < x2; x++) {
- desti = width * (y + y0);
- srci = (y + r8) * 15 + r9;
- src = &mapView[srci + i];
- dest = &gUnknown_02029828[x0 + desti + j];
- *dest = *src;
- i++;
- j++;
- }
- }
- sav2_mapdata_clear();
-}
-
-int GetMapBorderIdAt(int x, int y) {
- struct MapData *mapData;
- u16 block, block2;
- int i, j;
- if (x >= 0 && x < gUnknown_03004870.width
- && y >= 0 && y < gUnknown_03004870.height) {
- i = gUnknown_03004870.width;
- i *= y;
- block = gUnknown_03004870.map[x + i];
- if (block == 0x3ff) {
- goto fail;
- }
- } else {
- mapData = gMapHeader.mapData;
- j = (x + 1) & 1;
- j += ((y + 1) & 1) * 2;
- block2 = 0xc00 | mapData->border[j];
- if (block2 == 0x3ff) {
- goto fail;
- }
- }
- goto success;
+u16 MapGridGetZCoordAt(int x, int y)
+{
+ u16 block;
+ int i;
+ u16 *border;
+
+ if (x >= 0 && x < gUnknown_03004870.width
+ && y >= 0 && y < gUnknown_03004870.height)
+ {
+ block = gUnknown_03004870.map[x + gUnknown_03004870.width * y];
+ }
+ else
+ {
+ border = gMapHeader.mapData->border;
+ i = (x + 1) & 1;
+ i += ((y + 1) & 1) * 2;
+ block = gMapHeader.mapData->border[i];
+ block |= 0xc00;
+ }
+ if (block == 0x3ff)
+ {
+ return 0;
+ }
+ return block >> 12;
+}
+
+u16 MapGridIsImpassableAt(int x, int y)
+{
+ u16 block;
+ int i;
+ u16 *border;
+
+ if (x >= 0 && x < gUnknown_03004870.width
+ && y >= 0 && y < gUnknown_03004870.height)
+ {
+ block = gUnknown_03004870.map[x + gUnknown_03004870.width * y];
+ }
+ else
+ {
+ border = gMapHeader.mapData->border;
+ i = (x + 1) & 1;
+ i += ((y + 1) & 1) * 2;
+ block = gMapHeader.mapData->border[i];
+ block |= 0xc00;
+ }
+ if (block == 0x3ff)
+ {
+ return 1;
+ }
+ return (block & 0xc00) >> 10;
+}
+
+u16 MapGridGetMetatileIdAt(int x, int y)
+{
+ u16 block;
+ int i;
+ int j;
+ struct MapData *mapData;
+ u16 *border;
+ u16 block2;
+
+ if (x >= 0 && x < gUnknown_03004870.width
+ && y >= 0 && y < gUnknown_03004870.height)
+ {
+ block = gUnknown_03004870.map[x + gUnknown_03004870.width * y];
+ }
+ else
+ {
+ mapData = gMapHeader.mapData;
+ i = (x + 1) & 1;
+ i += ((y + 1) & 1) * 2;
+ block = mapData->border[i] | 0xc00;
+ }
+ if (block == 0x3ff)
+ {
+ border = gMapHeader.mapData->border;
+ j = (x + 1) & 1;
+ j += ((y + 1) & 1) * 2;
+ block2 = gMapHeader.mapData->border[j];
+ block2 |= 0xc00;
+ return block2 & block;
+ }
+ return block & 0x3ff;
+}
+
+u32 MapGridGetMetatileBehaviorAt(int x, int y)
+{
+ u16 metatile;
+ metatile = MapGridGetMetatileIdAt(x, y);
+ return GetBehaviorByMetatileId(metatile) & 0xff;
+}
+
+u16 MapGridGetMetatileLayerTypeAt(int x, int y)
+{
+ u16 metatile;
+ metatile = MapGridGetMetatileIdAt(x, y);
+ return (GetBehaviorByMetatileId(metatile) & 0xf000) >> 12;
+}
+
+void MapGridSetMetatileIdAt(int x, int y, u16 metatile)
+{
+ int i;
+ if (x >= 0 && x < gUnknown_03004870.width
+ && y >= 0 && y < gUnknown_03004870.height)
+ {
+ i = x + y * gUnknown_03004870.width;
+ gUnknown_03004870.map[i] = (gUnknown_03004870.map[i] & 0xf000) | (metatile & 0xfff);
+ }
+}
+
+void MapGridSetMetatileEntryAt(int x, int y, u16 metatile)
+{
+ int i;
+ if (x >= 0 && x < gUnknown_03004870.width
+ && y >= 0 && y < gUnknown_03004870.height)
+ {
+ i = x + gUnknown_03004870.width * y;
+ gUnknown_03004870.map[i] = metatile;
+ }
+}
+
+u32 GetBehaviorByMetatileId(u16 metatile)
+{
+ u16 *attributes;
+ if (metatile <= 0x1ff)
+ {
+ attributes = gMapHeader.mapData->primaryTileset->metatileAttributes;
+ return attributes[metatile];
+ }
+ else if (metatile <= 0x3ff)
+ {
+ attributes = gMapHeader.mapData->secondaryTileset->metatileAttributes;
+ return attributes[metatile - 0x200];
+ }
+ else
+ {
+ return 0xff;
+ }
+}
+
+void save_serialize_map(void)
+{
+ int i, j;
+ int x, y;
+ u16 *mapView;
+ int width;
+ mapView = gSaveBlock1.mapView;
+ width = gUnknown_03004870.width;
+ x = gSaveBlock1.pos.x;
+ y = gSaveBlock1.pos.y;
+ for (i = y; i < y + 14; i++)
+ {
+ for (j = x; j < x + 15; j++)
+ {
+ *mapView++ = gUnknown_02029828[width * i + j];
+ }
+ }
+}
+
+int sub_8056618(void)
+{
+ u16 i;
+ u32 r2;
+ r2 = 0;
+ for (i = 0; i < 0x200; i++)
+ {
+ r2 |= gSaveBlock1.mapView[i];
+ }
+ if (r2 == 0)
+ {
+ return 1;
+ }
+ return 0;
+}
+
+void sav2_mapdata_clear(void)
+{
+ CpuFill16(0, gSaveBlock1.mapView, sizeof(gSaveBlock1.mapView));
+}
+
+void sub_8056670(void)
+{
+ int i, j;
+ int x, y;
+ u16 *mapView;
+ int width;
+ mapView = gSaveBlock1.mapView;
+ if (!sub_8056618())
+ {
+ width = gUnknown_03004870.width;
+ x = gSaveBlock1.pos.x;
+ y = gSaveBlock1.pos.y;
+ for (i = y; i < y + 14; i++)
+ {
+ for (j = x; j < x + 15; j++)
+ {
+ gUnknown_02029828[width * i + j] = *mapView++;
+ }
+ }
+ sav2_mapdata_clear();
+ }
+}
+
+void sub_80566F0(u8 a1)
+{
+ u16 *mapView;
+ int width;
+ int x0, y0;
+ int x2, y2;
+ u16 *src, *dest;
+ int srci, desti;
+ int r9, r8;
+ int x, y;
+ int i, j;
+ mapView = gSaveBlock1.mapView;
+ width = gUnknown_03004870.width;
+ r9 = 0;
+ r8 = 0;
+ x0 = gSaveBlock1.pos.x;
+ y0 = gSaveBlock1.pos.y;
+ x2 = 15;
+ y2 = 14;
+ switch (a1)
+ {
+ case CONNECTION_NORTH:
+ y0 += 1;
+ y2 = 13;
+ break;
+ case CONNECTION_SOUTH:
+ r8 = 1;
+ y2 = 13;
+ break;
+ case CONNECTION_WEST:
+ x0 += 1;
+ x2 = 14;
+ break;
+ case CONNECTION_EAST:
+ r9 = 1;
+ x2 = 14;
+ break;
+ }
+ for (y = 0; y < y2; y++)
+ {
+ i = 0;
+ j = 0;
+ for (x = 0; x < x2; x++)
+ {
+ desti = width * (y + y0);
+ srci = (y + r8) * 15 + r9;
+ src = &mapView[srci + i];
+ dest = &gUnknown_02029828[x0 + desti + j];
+ *dest = *src;
+ i++;
+ j++;
+ }
+ }
+ sav2_mapdata_clear();
+}
+
+int GetMapBorderIdAt(int x, int y)
+{
+ struct MapData *mapData;
+ u16 block, block2;
+ int i, j;
+ if (x >= 0 && x < gUnknown_03004870.width
+ && y >= 0 && y < gUnknown_03004870.height)
+ {
+ i = gUnknown_03004870.width;
+ i *= y;
+ block = gUnknown_03004870.map[x + i];
+ if (block == 0x3ff)
+ {
+ goto fail;
+ }
+ }
+ else
+ {
+ mapData = gMapHeader.mapData;
+ j = (x + 1) & 1;
+ j += ((y + 1) & 1) * 2;
+ block2 = 0xc00 | mapData->border[j];
+ if (block2 == 0x3ff)
+ {
+ goto fail;
+ }
+ }
+ goto success;
fail:
- return -1;
+ return -1;
success:
- if (x >= (gUnknown_03004870.width - 8)) {
- if (!gUnknown_0202E850.east) {
- return -1;
- }
- return CONNECTION_EAST;
- } else if (x < 7) {
- if (!gUnknown_0202E850.west) {
- return -1;
- }
- return CONNECTION_WEST;
- } else if (y >= (gUnknown_03004870.height - 7)) {
- if (!gUnknown_0202E850.south) {
- return -1;
- }
- return CONNECTION_SOUTH;
- } else if (y < 7) {
- if (!gUnknown_0202E850.north) {
- return -1;
- }
- return CONNECTION_NORTH;
- } else {
- return 0;
- }
-}
-
-int GetPostCameraMoveMapBorderId(int x, int y) {
- return GetMapBorderIdAt(gSaveBlock1.pos.x + 7 + x, gSaveBlock1.pos.y + 7 + y);
-}
-
-int CanCameraMoveInDirection(int direction) {
- int x, y;
- x = gSaveBlock1.pos.x + 7 + gUnknown_0821664C[direction].x;
- y = gSaveBlock1.pos.y + 7 + gUnknown_0821664C[direction].y;
- if (GetMapBorderIdAt(x, y) == -1) {
- return 0;
- }
- return 1;
-}
-
-void sub_8056918(struct MapConnection *connection, int direction, int x, int y) {
- struct MapHeader *mapHeader;
- mapHeader = mapconnection_get_mapheader(connection);
- switch (direction) {
- case CONNECTION_EAST:
- gSaveBlock1.pos.x = -x;
- gSaveBlock1.pos.y -= connection->offset;
- break;
- case CONNECTION_WEST:
- gSaveBlock1.pos.x = mapHeader->mapData->width;
- gSaveBlock1.pos.y -= connection->offset;
- break;
- case CONNECTION_SOUTH:
- gSaveBlock1.pos.x -= connection->offset;
- gSaveBlock1.pos.y = -y;
- break;
- case CONNECTION_NORTH:
- gSaveBlock1.pos.x -= connection->offset;
- gSaveBlock1.pos.y = mapHeader->mapData->height;
- break;
- }
-}
-
-bool8 CameraMove(int x, int y) {
- unsigned int direction;
- struct MapConnection *connection;
- int old_x, old_y;
- gUnknown_0202E844.field_0 = FALSE;
- direction = GetPostCameraMoveMapBorderId(x, y);
- if (direction + 1 <= 1) {
- gSaveBlock1.pos.x += x;
- gSaveBlock1.pos.y += y;
- } else {
- save_serialize_map();
- old_x = gSaveBlock1.pos.x;
- old_y = gSaveBlock1.pos.y;
- connection = sub_8056A64(direction, gSaveBlock1.pos.x, gSaveBlock1.pos.y);
- sub_8056918(connection, direction, x, y);
- sub_80538F0(connection->mapGroup, connection->mapNum);
- gUnknown_0202E844.field_0 = TRUE;
- gUnknown_0202E844.x = old_x - gSaveBlock1.pos.x;
- gUnknown_0202E844.y = old_y - gSaveBlock1.pos.y;
- gSaveBlock1.pos.x += x;
- gSaveBlock1.pos.y += y;
- sub_80566F0(direction);
- }
- return gUnknown_0202E844.field_0;
-}
-
-struct MapConnection *sub_8056A64(u8 direction, int x, int y) {
- int count;
- struct MapConnection *connection;
- int i;
- count = gMapHeader.connections->count;
- connection = gMapHeader.connections->connections;
- for (i = 0; i < count; i++, connection++) {
- if (connection->direction == direction) {
- if (sub_8056ABC(direction, x, y, connection) == TRUE) {
- return connection;
- }
- }
- }
- return NULL;
-}
-
-bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection) {
- struct MapHeader *mapHeader;
- mapHeader = mapconnection_get_mapheader(connection);
- switch (direction) {
- case CONNECTION_SOUTH:
- case CONNECTION_NORTH:
- return sub_8056B20(x, gMapHeader.mapData->width, mapHeader->mapData->width, connection->offset);
- case CONNECTION_WEST:
- case CONNECTION_EAST:
- return sub_8056B20(y, gMapHeader.mapData->height, mapHeader->mapData->height, connection->offset);
- }
- return FALSE;
-}
-
-bool8 sub_8056B20(int x, int src_width, int dest_width, int offset) {
- int offset2;
- offset2 = offset;
- if (offset2 < 0) {
- offset2 = 0;
- }
- if (dest_width + offset < src_width) {
- src_width = dest_width + offset;
- }
- if (offset2 <= x && x <= src_width) {
- return TRUE;
- }
- return FALSE;
-}
-
-int sub_8056B4C(int x, int width) {
- if (x >= 0 && x < width) {
- return TRUE;
- }
- return FALSE;
-}
-
-int sub_8056B60(struct MapConnection *connection, int x, int y) {
- struct MapHeader *mapHeader;
- mapHeader = mapconnection_get_mapheader(connection);
- switch (connection->direction) {
- case CONNECTION_SOUTH:
- case CONNECTION_NORTH:
- return sub_8056B4C(x - connection->offset, mapHeader->mapData->width);
- case CONNECTION_WEST:
- case CONNECTION_EAST:
- return sub_8056B4C(y - connection->offset, mapHeader->mapData->height);
- }
- return FALSE;
-}
-
-struct MapConnection *sub_8056BA0(s16 x, s16 y) {
- int count;
- struct MapConnection *connection;
- int i;
- u8 direction;
- if (!gMapHeader.connections) {
- return NULL;
- } else {
- count = gMapHeader.connections->count;
- connection = gMapHeader.connections->connections;
- for (i = 0; i < count; i++, connection++) {
- direction = connection->direction;
- if (
- (direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE)
- || (direction == CONNECTION_NORTH && y > 6)
- || (direction == CONNECTION_SOUTH && y < gMapHeader.mapData->height + 7)
- || (direction == CONNECTION_WEST && x > 6)
- || (direction == CONNECTION_EAST && x < gMapHeader.mapData->width + 7)
- ) {
- continue;
- }
- if (sub_8056B60(connection, x - 7, y - 7) == TRUE) {
- return connection;
- }
- }
- }
- return NULL;
-}
-
-void sub_8056C50(u16 x, u16 y) {
- gSaveBlock1.pos.x = x - 7;
- gSaveBlock1.pos.y = y - 7;
-}
-
-void sav1_camera_get_focus_coords(u16 *x, u16 *y) {
- *x = gSaveBlock1.pos.x + 7;
- *y = gSaveBlock1.pos.y + 7;
-}
-
-void unref_sub_8056C7C(u16 x, u16 y) {
- gSaveBlock1.pos.x = x;
- gSaveBlock1.pos.y = y;
-}
-
-void GetCameraCoords(u16 *x, u16 *y) {
- *x = gSaveBlock1.pos.x;
- *y = gSaveBlock1.pos.y;
-}
-
-void sub_8056C98(struct Tileset *tileset, void *src) {
- if (tileset) {
- if (!tileset->isCompressed) {
- CpuFastSet(tileset->tiles, src, 0x1000);
- } else {
- LZ77UnCompVram(tileset->tiles, src);
- }
- }
-}
-
-void sub_8056CBC(struct Tileset *tileset, int offset, int size) {
- u16 black;
- if (tileset) {
- if (tileset->isSecondary == FALSE) {
- black = 0;
- LoadPalette(&black, offset, 2);
- LoadPalette(tileset->palettes + 2, offset + 1, size - 2);
- } else if (tileset->isSecondary == TRUE) {
- LoadPalette(tileset->palettes + 0xc0, offset, size);
- } else {
- LZ77UnCompVram(tileset->palettes, (void*)0x2000000);
- LoadPalette((void*)0x2000000, offset, size);
- }
- }
-}
-
-void sub_8056D28(struct MapData *mapData) {
- void *src = (void*)(BG_VRAM);
- sub_8056C98(mapData->primaryTileset, src);
-}
-
-void sub_8056D38(struct MapData *mapData) {
- void *src = (void*)(BG_VRAM + 0x4000);
- sub_8056C98(mapData->secondaryTileset, src);
-}
-
-void apply_map_tileset1_palette(struct MapData *mapData) {
- sub_8056CBC(mapData->primaryTileset, 0, 0xc0);
-}
-
-void apply_map_tileset2_palette(struct MapData *mapData) {
- sub_8056CBC(mapData->secondaryTileset, 0x60, 0xc0);
-}
-
-void copy_map_tileset1_tileset2_to_vram(struct MapData *mapData) {
- if (mapData) {
- sub_8056D28(mapData);
- sub_8056D38(mapData);
- }
+ if (x >= (gUnknown_03004870.width - 8))
+ {
+ if (!gUnknown_0202E850.east)
+ {
+ return -1;
+ }
+ return CONNECTION_EAST;
+ }
+ else if (x < 7)
+ {
+ if (!gUnknown_0202E850.west)
+ {
+ return -1;
+ }
+ return CONNECTION_WEST;
+ }
+ else if (y >= (gUnknown_03004870.height - 7))
+ {
+ if (!gUnknown_0202E850.south)
+ {
+ return -1;
+ }
+ return CONNECTION_SOUTH;
+ }
+ else if (y < 7)
+ {
+ if (!gUnknown_0202E850.north)
+ {
+ return -1;
+ }
+ return CONNECTION_NORTH;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+int GetPostCameraMoveMapBorderId(int x, int y)
+{
+ return GetMapBorderIdAt(gSaveBlock1.pos.x + 7 + x, gSaveBlock1.pos.y + 7 + y);
+}
+
+int CanCameraMoveInDirection(int direction)
+{
+ int x, y;
+ x = gSaveBlock1.pos.x + 7 + gUnknown_0821664C[direction].x;
+ y = gSaveBlock1.pos.y + 7 + gUnknown_0821664C[direction].y;
+ if (GetMapBorderIdAt(x, y) == -1)
+ {
+ return 0;
+ }
+ return 1;
+}
+
+void sub_8056918(struct MapConnection *connection, int direction, int x, int y)
+{
+ struct MapHeader *mapHeader;
+ mapHeader = mapconnection_get_mapheader(connection);
+ switch (direction)
+ {
+ case CONNECTION_EAST:
+ gSaveBlock1.pos.x = -x;
+ gSaveBlock1.pos.y -= connection->offset;
+ break;
+ case CONNECTION_WEST:
+ gSaveBlock1.pos.x = mapHeader->mapData->width;
+ gSaveBlock1.pos.y -= connection->offset;
+ break;
+ case CONNECTION_SOUTH:
+ gSaveBlock1.pos.x -= connection->offset;
+ gSaveBlock1.pos.y = -y;
+ break;
+ case CONNECTION_NORTH:
+ gSaveBlock1.pos.x -= connection->offset;
+ gSaveBlock1.pos.y = mapHeader->mapData->height;
+ break;
+ }
+}
+
+bool8 CameraMove(int x, int y)
+{
+ unsigned int direction;
+ struct MapConnection *connection;
+ int old_x, old_y;
+ gUnknown_0202E844.field_0 = FALSE;
+ direction = GetPostCameraMoveMapBorderId(x, y);
+ if (direction + 1 <= 1)
+ {
+ gSaveBlock1.pos.x += x;
+ gSaveBlock1.pos.y += y;
+ }
+ else
+ {
+ save_serialize_map();
+ old_x = gSaveBlock1.pos.x;
+ old_y = gSaveBlock1.pos.y;
+ connection = sub_8056A64(direction, gSaveBlock1.pos.x, gSaveBlock1.pos.y);
+ sub_8056918(connection, direction, x, y);
+ sub_80538F0(connection->mapGroup, connection->mapNum);
+ gUnknown_0202E844.field_0 = TRUE;
+ gUnknown_0202E844.x = old_x - gSaveBlock1.pos.x;
+ gUnknown_0202E844.y = old_y - gSaveBlock1.pos.y;
+ gSaveBlock1.pos.x += x;
+ gSaveBlock1.pos.y += y;
+ sub_80566F0(direction);
+ }
+ return gUnknown_0202E844.field_0;
+}
+
+struct MapConnection *sub_8056A64(u8 direction, int x, int y)
+{
+ int count;
+ struct MapConnection *connection;
+ int i;
+ count = gMapHeader.connections->count;
+ connection = gMapHeader.connections->connections;
+ for (i = 0; i < count; i++, connection++)
+ {
+ if (connection->direction == direction)
+ {
+ if (sub_8056ABC(direction, x, y, connection) == TRUE)
+ {
+ return connection;
+ }
+ }
+ }
+ return NULL;
+}
+
+bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection)
+{
+ struct MapHeader *mapHeader;
+ mapHeader = mapconnection_get_mapheader(connection);
+ switch (direction)
+ {
+ case CONNECTION_SOUTH:
+ case CONNECTION_NORTH:
+ return sub_8056B20(x, gMapHeader.mapData->width, mapHeader->mapData->width, connection->offset);
+ case CONNECTION_WEST:
+ case CONNECTION_EAST:
+ return sub_8056B20(y, gMapHeader.mapData->height, mapHeader->mapData->height, connection->offset);
+ }
+ return FALSE;
+}
+
+bool8 sub_8056B20(int x, int src_width, int dest_width, int offset)
+{
+ int offset2;
+ offset2 = offset;
+ if (offset2 < 0)
+ {
+ offset2 = 0;
+ }
+ if (dest_width + offset < src_width)
+ {
+ src_width = dest_width + offset;
+ }
+ if (offset2 <= x && x <= src_width)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+int sub_8056B4C(int x, int width)
+{
+ if (x >= 0 && x < width)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+int sub_8056B60(struct MapConnection *connection, int x, int y)
+{
+ struct MapHeader *mapHeader;
+ mapHeader = mapconnection_get_mapheader(connection);
+ switch (connection->direction)
+ {
+ case CONNECTION_SOUTH:
+ case CONNECTION_NORTH:
+ return sub_8056B4C(x - connection->offset, mapHeader->mapData->width);
+ case CONNECTION_WEST:
+ case CONNECTION_EAST:
+ return sub_8056B4C(y - connection->offset, mapHeader->mapData->height);
+ }
+ return FALSE;
+}
+
+struct MapConnection *sub_8056BA0(s16 x, s16 y)
+{
+ int count;
+ struct MapConnection *connection;
+ int i;
+ u8 direction;
+ if (!gMapHeader.connections)
+ {
+ return NULL;
+ }
+ else
+ {
+ count = gMapHeader.connections->count;
+ connection = gMapHeader.connections->connections;
+ for (i = 0; i < count; i++, connection++)
+ {
+ direction = connection->direction;
+ if ((direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE)
+ || (direction == CONNECTION_NORTH && y > 6)
+ || (direction == CONNECTION_SOUTH && y < gMapHeader.mapData->height + 7)
+ || (direction == CONNECTION_WEST && x > 6)
+ || (direction == CONNECTION_EAST && x < gMapHeader.mapData->width + 7))
+ {
+ continue;
+ }
+ if (sub_8056B60(connection, x - 7, y - 7) == TRUE)
+ {
+ return connection;
+ }
+ }
+ }
+ return NULL;
+}
+
+void sub_8056C50(u16 x, u16 y)
+{
+ gSaveBlock1.pos.x = x - 7;
+ gSaveBlock1.pos.y = y - 7;
+}
+
+void sav1_camera_get_focus_coords(u16 *x, u16 *y)
+{
+ *x = gSaveBlock1.pos.x + 7;
+ *y = gSaveBlock1.pos.y + 7;
}
-
-void apply_map_tileset1_tileset2_palette(struct MapData *mapData) {
- if (mapData) {
- apply_map_tileset1_palette(mapData);
- apply_map_tileset2_palette(mapData);
- }
+
+void unref_sub_8056C7C(u16 x, u16 y)
+{
+ gSaveBlock1.pos.x = x;
+ gSaveBlock1.pos.y = y;
+}
+
+void GetCameraCoords(u16 *x, u16 *y)
+{
+ *x = gSaveBlock1.pos.x;
+ *y = gSaveBlock1.pos.y;
+}
+
+void sub_8056C98(struct Tileset *tileset, void *src)
+{
+ if (tileset)
+ {
+ if (!tileset->isCompressed)
+ {
+ CpuFastSet(tileset->tiles, src, 0x1000);
+ }
+ else
+ {
+ LZ77UnCompVram(tileset->tiles, src);
+ }
+ }
+}
+
+void sub_8056CBC(struct Tileset *tileset, int offset, int size)
+{
+ u16 black;
+ if (tileset)
+ {
+ if (tileset->isSecondary == FALSE)
+ {
+ black = 0;
+ LoadPalette(&black, offset, 2);
+ LoadPalette(tileset->palettes + 2, offset + 1, size - 2);
+ }
+ else if (tileset->isSecondary == TRUE)
+ {
+ LoadPalette(tileset->palettes + 0xc0, offset, size);
+ }
+ else
+ {
+ LZ77UnCompVram(tileset->palettes, (void*)0x2000000);
+ LoadPalette((void*)0x2000000, offset, size);
+ }
+ }
+}
+
+void sub_8056D28(struct MapData *mapData)
+{
+ void *src = (void*)(BG_VRAM);
+ sub_8056C98(mapData->primaryTileset, src);
+}
+
+void sub_8056D38(struct MapData *mapData)
+{
+ void *src = (void*)(BG_VRAM + 0x4000);
+ sub_8056C98(mapData->secondaryTileset, src);
+}
+
+void apply_map_tileset1_palette(struct MapData *mapData)
+{
+ sub_8056CBC(mapData->primaryTileset, 0, 0xc0);
+}
+
+void apply_map_tileset2_palette(struct MapData *mapData)
+{
+ sub_8056CBC(mapData->secondaryTileset, 0x60, 0xc0);
+}
+
+void copy_map_tileset1_tileset2_to_vram(struct MapData *mapData)
+{
+ if (mapData)
+ {
+ sub_8056D28(mapData);
+ sub_8056D38(mapData);
+ }
+}
+
+void apply_map_tileset1_tileset2_palette(struct MapData *mapData)
+{
+ if (mapData)
+ {
+ apply_map_tileset1_palette(mapData);
+ apply_map_tileset2_palette(mapData);
+ }
}
diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c
new file mode 100644
index 000000000..f432027ab
--- /dev/null
+++ b/src/fldeff_cut.c
@@ -0,0 +1,300 @@
+#include "global.h"
+#include "asm.h"
+#include "metatile_behavior.h"
+#include "metatile_behaviors.h"
+#include "field_player_avatar.h"
+#include "field_effect.h"
+#include "rom4.h"
+#include "script.h"
+#include "rom6.h"
+#include "sound.h"
+#include "field_camera.h"
+#include "sprite.h"
+#include "songs.h"
+#include "trig.h"
+#include "map_obj_lock.h"
+
+extern u8 gCutGrassSpriteArray[8]; // seems to be an array of 8 sprite IDs
+
+extern void (*gUnknown_0300485C)(void);
+extern void (*gUnknown_03005CE4)(void);
+
+extern struct SpriteTemplate gSpriteTemplate_CutGrass;
+
+extern struct MapPosition gUnknown_0203923C;
+
+extern u8 gLastFieldPokeMenuOpened;
+extern u32 gUnknown_0202FF84[];
+
+extern u8 UseCutScript;
+
+extern void sub_808AB90(void); // unknown args
+extern void sub_805BCC0(s16 x, s16 y);
+
+void sub_80A2634(void);
+void sub_80A25E8(void);
+void sub_80A2684(void);
+void sub_80A27A8(s16, s16);
+void sub_80A28F4(s16, s16);
+void objc_8097BBC(struct Sprite *sprite);
+void sub_80A2AB8(void);
+void sub_80A2B00(void); // unknown args
+
+bool8 SetUpFieldMove_Cut(void)
+{
+ s16 x, y;
+ u8 i, j;
+ u8 tileBehavior;
+
+ if(npc_before_player_of_type(0x52) == TRUE) // is in front of tree?
+ {
+ gUnknown_0300485C = sub_808AB90;
+ gUnknown_03005CE4 = sub_80A2634;
+ return TRUE;
+ }
+ else // is in ash or grass to cut?
+ {
+ PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ for(i = 0; i < 3; i++)
+ {
+ y = i - 1 + gUnknown_0203923C.y;
+ for(j = 0; j < 3; j++)
+ {
+ x = j - 1 + gUnknown_0203923C.x;
+ if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height)
+ {
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ if(MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE
+ || MetatileBehavior_IsAshGrass(tileBehavior) == TRUE)
+ {
+ gUnknown_0300485C = sub_808AB90;
+ gUnknown_03005CE4 = sub_80A25E8;
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE; // do not use cut
+ }
+}
+
+void sub_80A25E8(void)
+{
+ FieldEffectStart(1);
+ gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+}
+
+bool8 FldEff_UseCutOnGrass(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)sub_80A2684 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_80A2684;
+ IncrementGameStat(0x12);
+ return FALSE;
+}
+
+void sub_80A2634(void)
+{
+ gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(&UseCutScript);
+}
+
+bool8 FldEff_UseCutOnTree(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)sub_80A2B00 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_80A2B00;
+ IncrementGameStat(0x12);
+ return FALSE;
+}
+
+void sub_80A2684(void)
+{
+ FieldEffectActiveListRemove(1);
+ FieldEffectStart(0x3A);
+}
+
+bool8 FldEff_CutGrass(void)
+{
+ s16 x, y;
+ u8 tileBehavior;
+ u8 i, j; // not in for loop?
+
+ for(i = 0, PlaySE(SE_W015), PlayerGetDestCoords(&gUnknown_0203923C.x, &gUnknown_0203923C.y); i < 3; i++)
+ {
+ y = i - 1 + gUnknown_0203923C.y;
+ for(j = 0; j < 3; j++)
+ {
+ x = j - 1 + gUnknown_0203923C.x;
+ if(MapGridGetZCoordAt(x, y) == (s8)gUnknown_0203923C.height)
+ {
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+ if(MetatileBehavior_IsCuttableGrass(tileBehavior) == TRUE)
+ {
+ sub_80A27A8(x, y);
+ sub_805BCC0(x, y);
+ }
+ }
+ }
+ }
+ sub_80A28F4(gUnknown_0203923C.x - 1, gUnknown_0203923C.y - 2);
+ DrawWholeMapView();
+
+ // populate sprite ID array
+ for(i = 0; i < 8; i++)
+ {
+ gCutGrassSpriteArray[i] = CreateSprite((struct SpriteTemplate *)&gSpriteTemplate_CutGrass,
+ gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0);
+ gSprites[gCutGrassSpriteArray[i]].data2 = 32 * i;
+ }
+ return 0;
+}
+
+// set map grid metatile depending on x, y
+// TODO: enum for metatile IDs
+void sub_80A27A8(s16 x, s16 y)
+{
+ int metatileId = MapGridGetMetatileIdAt(x, 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;
+ }
+}
+
+s32 sub_80A28A0(s16 x, s16 y)
+{
+ u16 metatileId = MapGridGetMetatileIdAt(x, y);
+
+ if(metatileId == 1)
+ return 1;
+ else if(metatileId == 633)
+ return 2;
+ else if(metatileId == 634)
+ return 3;
+ else if(metatileId == 635)
+ return 4;
+ else
+ return 0;
+}
+
+void sub_80A28F4(s16 x, s16 y)
+{
+ s16 i;
+ u16 lowerY = y + 3;
+
+ for(i = 0; i < 3; i++)
+ {
+ u16 currentX = x + i;
+ s16 currentXsigned = x + i;
+ if(MapGridGetMetatileIdAt(currentXsigned, y) == 21)
+ {
+ 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;
+ }
+ }
+ if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY) == 1)
+ {
+ if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x208)
+ MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x1);
+ if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x281)
+ MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x279);
+ if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x282)
+ MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27A);
+ if(MapGridGetMetatileIdAt((s16)currentX, (s16)lowerY + 1) == 0x283)
+ MapGridSetMetatileIdAt((s16)currentX, (s16)lowerY + 1, 0x27B);
+ }
+ }
+}
+
+void sub_80A2A48(struct Sprite *sprite)
+{
+ sprite->data0 = 8;
+ sprite->data1 = 0;
+ sprite->data3 = 0;
+ sprite->callback = (void *)objc_8097BBC;
+}
+
+void objc_8097BBC(struct Sprite *sprite)
+{
+ u16 tempdata;
+ u16 tempdata2;
+
+ sprite->pos2.x = Sin(sprite->data2, sprite->data0);
+ sprite->pos2.y = Cos(sprite->data2, sprite->data0);
+
+ sprite->data2 = (sprite->data2 + 8) & 0xFF;
+ sprite->data0 += ((tempdata2 = sprite->data3) << 16 >> 18) + 1; // what?
+ sprite->data3 = tempdata2 + 1;
+
+ tempdata = sprite->data1;
+ if((s16)tempdata != 28) // done rotating the grass, execute clean up function
+ sprite->data1++;
+ else
+ sprite->callback = (void *)sub_80A2AB8;
+}
+
+void sub_80A2AB8(void)
+{
+ u8 i;
+
+ for(i = 1; i < 8; i++)
+ {
+ DestroySprite(&gSprites[gCutGrassSpriteArray[i]]);
+ }
+
+ FieldEffectStop(&gSprites[gCutGrassSpriteArray[0]], 0x3A);
+ sub_8064E2C();
+ ScriptContext2_Disable();
+}
+
+void sub_80A2B00(void)
+{
+ PlaySE(0x80);
+ FieldEffectActiveListRemove(2);
+ EnableBothScriptContexts();
+}
diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c
index 4da04326a..e7e7473d0 100644
--- a/src/fldeff_strength.c
+++ b/src/fldeff_strength.c
@@ -1,17 +1,20 @@
#include "global.h"
-#include "field_effect.h"
#include "asm.h"
+#include "field_effect.h"
#include "pokemon.h"
#include "script.h"
#include "task.h"
+#include "text.h"
+#include "braille_puzzles.h"
+#include "rom6.h"
static void sub_811AA18(void);
static void sub_811AA38(void);
static void sub_811AA9C(void);
-extern u32 gUnknown_0202FF84;
+extern u32 gUnknown_0202FF84[];
-extern u8 gUnknown_03005CE0;
+extern u8 gLastFieldPokeMenuOpened;
extern u16 gScriptResult;
extern void (*gUnknown_0300485C)(void);
extern void (*gUnknown_03005CE4)(void);
@@ -22,7 +25,7 @@ bool8 SetUpFieldMove_Strength(void)
{
if (ShouldDoBrailleStrengthEffect())
{
- gScriptResult = gUnknown_03005CE0;
+ gScriptResult = gLastFieldPokeMenuOpened;
gUnknown_0300485C = sub_808AB90;
gUnknown_03005CE4 = sub_811AA38;
}
@@ -30,7 +33,7 @@ bool8 SetUpFieldMove_Strength(void)
{
if (npc_before_player_of_type(87) != TRUE)
return 0;
- gScriptResult = gUnknown_03005CE0;
+ gScriptResult = gLastFieldPokeMenuOpened;
gUnknown_0300485C = sub_808AB90;
gUnknown_03005CE4 = sub_811AA18;
}
@@ -40,13 +43,13 @@ bool8 SetUpFieldMove_Strength(void)
static void sub_811AA18(void)
{
- gUnknown_0202FF84 = gUnknown_03005CE0;
+ gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
ScriptContext1_SetupScript(UseStrengthScript);
}
static void sub_811AA38(void)
{
- gUnknown_0202FF84 = gUnknown_03005CE0;
+ gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
FieldEffectStart(40);
}
@@ -56,7 +59,7 @@ bool8 FldEff_UseStrength(void)
gTasks[taskId].data[8] = (u32)sub_811AA9C >> 16;
gTasks[taskId].data[9] = (u32)sub_811AA9C;
- GetMonNickname(&gPlayerParty[gUnknown_0202FF84], gStringVar1);
+ GetMonNickname(&gPlayerParty[gUnknown_0202FF84[0]], gStringVar1);
return FALSE;
}
diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c
new file mode 100644
index 000000000..0e6933649
--- /dev/null
+++ b/src/fldeff_teleport.c
@@ -0,0 +1,51 @@
+#include "global.h"
+#include "asm.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "rom4.h"
+#include "rom6.h"
+
+extern void sub_8087BA8(void);
+
+extern u32 gUnknown_0202FF84[];
+
+extern void (*gUnknown_0300485C)(void);
+extern u8 gLastFieldPokeMenuOpened;
+extern void (*gUnknown_03005CE4)(void);
+
+void hm_teleport_run_dp02scr(void);
+void sub_814A404(void);
+
+bool8 SetUpFieldMove_Teleport(void)
+{
+ if (is_light_level_1_2_3_or_6(gMapHeader.mapType) == TRUE)
+ {
+ gUnknown_0300485C = sub_808AB90;
+ gUnknown_03005CE4 = hm_teleport_run_dp02scr;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void hm_teleport_run_dp02scr(void)
+{
+ new_game();
+ FieldEffectStart(63);
+ gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+}
+
+bool8 FldEff_UseTeleport(void)
+{
+ u8 taskId = oei_task_add();
+ gTasks[taskId].data[8] = (u32)sub_814A404 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_814A404;
+ SetPlayerAvatarTransitionFlags(1);
+ return 0;
+}
+
+void sub_814A404(void)
+{
+ FieldEffectActiveListRemove(63);
+ sub_8087BA8();
+}
diff --git a/src/heal_location.c b/src/heal_location.c
index 13bb125b6..42bc18567 100644
--- a/src/heal_location.c
+++ b/src/heal_location.c
@@ -1,17 +1,42 @@
#include "global.h"
#include "heal_location.h"
+#include "map_constants.h"
#define NUM_HEAL_LOCATIONS 22
-extern const struct HealLocation gHealLocations[];
+static const struct HealLocation sHealLocations[] =
+{
+ {MAP_GROUP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, MAP_ID_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, 4, 2},
+ {MAP_GROUP_LITTLEROOT_TOWN_MAYS_HOUSE_2F, MAP_ID_LITTLEROOT_TOWN_MAYS_HOUSE_2F, 4, 2},
+ {MAP_GROUP_PETALBURG_CITY, MAP_ID_PETALBURG_CITY, 20, 17},
+ {MAP_GROUP_SLATEPORT_CITY, MAP_ID_SLATEPORT_CITY, 19, 20},
+ {MAP_GROUP_MAUVILLE_CITY, MAP_ID_MAUVILLE_CITY, 22, 6},
+ {MAP_GROUP_RUSTBORO_CITY, MAP_ID_RUSTBORO_CITY, 16, 39},
+ {MAP_GROUP_FORTREE_CITY, MAP_ID_FORTREE_CITY, 5, 7},
+ {MAP_GROUP_LILYCOVE_CITY, MAP_ID_LILYCOVE_CITY, 24, 15},
+ {MAP_GROUP_MOSSDEEP_CITY, MAP_ID_MOSSDEEP_CITY, 28, 17},
+ {MAP_GROUP_SOOTOPOLIS_CITY, MAP_ID_SOOTOPOLIS_CITY, 43, 32},
+ {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 27, 49},
+ {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 5, 9},
+ {MAP_GROUP_LITTLEROOT_TOWN, MAP_ID_LITTLEROOT_TOWN, 14, 9},
+ {MAP_GROUP_OLDALE_TOWN, MAP_ID_OLDALE_TOWN, 6, 17},
+ {MAP_GROUP_DEWFORD_TOWN, MAP_ID_DEWFORD_TOWN, 2, 11},
+ {MAP_GROUP_LAVARIDGE_TOWN, MAP_ID_LAVARIDGE_TOWN, 9, 7},
+ {MAP_GROUP_FALLARBOR_TOWN, MAP_ID_FALLARBOR_TOWN, 14, 8},
+ {MAP_GROUP_VERDANTURF_TOWN, MAP_ID_VERDANTURF_TOWN, 16, 4},
+ {MAP_GROUP_PACIFIDLOG_TOWN, MAP_ID_PACIFIDLOG_TOWN, 8, 16},
+ {MAP_GROUP_EVER_GRANDE_CITY, MAP_ID_EVER_GRANDE_CITY, 18, 6},
+ {MAP_GROUP_BATTLE_TOWER_OUTSIDE, MAP_ID_BATTLE_TOWER_OUTSIDE, 14, 9},
+ {MAP_GROUP_SOUTHERN_ISLAND_EXTERIOR, MAP_ID_SOUTHERN_ISLAND_EXTERIOR, 15, 20},
+};
u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum)
{
u32 i;
-
+
for (i = 0; i < NUM_HEAL_LOCATIONS; i++)
{
- if(gHealLocations[i].group == mapGroup && gHealLocations[i].map == mapNum)
+ if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum)
return i + 1;
}
return 0;
@@ -20,11 +45,11 @@ u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum)
const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum)
{
u32 index = GetHealLocationIndexByMap(mapGroup, mapNum);
-
+
if (index == 0)
return NULL;
else
- return &gHealLocations[index - 1];
+ return &sHealLocations[index - 1];
}
const struct HealLocation *GetHealLocation(u32 index)
@@ -34,5 +59,5 @@ const struct HealLocation *GetHealLocation(u32 index)
else if (index > NUM_HEAL_LOCATIONS)
return NULL;
else
- return &gHealLocations[index - 1];
+ return &sHealLocations[index - 1];
}
diff --git a/src/intro.c b/src/intro.c
index 544d8b64f..fd0a3316e 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -1,21 +1,21 @@
#include "global.h"
#include "intro.h"
#include "asm.h"
+#include "decompress.h"
#include "gba/m4a_internal.h"
-#include "m4a.h"
#include "libgncmultiboot.h"
-#include "save.h"
-#include "decompress.h"
-#include "title_screen.h"
-#include "new_game.h"
#include "link.h"
+#include "m4a.h"
#include "main.h"
+#include "new_game.h"
#include "palette.h"
#include "rng.h"
+#include "save.h"
#include "songs.h"
#include "sound.h"
#include "species.h"
#include "task.h"
+#include "title_screen.h"
#include "trig.h"
extern void *species_and_otid_get_pal(/*TODO: arg types*/);
@@ -33,9 +33,8 @@ extern u16 gUnknown_02039318;
extern u16 gUnknown_0203931A;
extern u16 gUnknown_02039358;
extern u16 gUnknown_0203935A;
-
extern u32 gIntroFrameCounter;
-extern struct GcmbStruct gUnknown_03005EE0;
+extern struct GcmbStruct gMultibootProgramStruct;
extern u16 gSaveFileStatus;
extern u8 gReservedSpritePaletteCount;
extern struct SpriteSheet gMonFrontPicTable[];
@@ -45,64 +44,735 @@ extern struct MonCoords gMonBackPicCoords[];
extern struct SpriteSheet gTrainerBackPicTable[];
extern struct MonCoords gTrainerBackPicCoords[];
extern struct SpritePalette gTrainerBackPicPaletteTable[];
-
-extern const u16 gIntro1BGPals[];
-extern const u8 gIntro1BG0_Tilemap[];
-extern const u8 gIntro1BG1_Tilemap[];
-extern const u8 gIntro1BG2_Tilemap[];
-extern const u8 gIntro1BG3_Tilemap[];
-extern const u8 gIntro1BGLeavesGfx[];
-extern const u8 gIntro3PokeballPal[];
-extern const u8 gIntro3Pokeball_Tilemap[];
-extern const u8 gIntro3Pokeball_Gfx[];
-extern const u16 gIntro3Streaks_Pal[];
-extern const u8 gIntro3Streaks_Gfx[];
-extern const u8 gIntro3Streaks_Tilemap[];
-extern union AnimCmd *gUnknown_0840AE80[];
-extern const struct SpriteTemplate gSpriteTemplate_840AFF0;
-extern const struct SpriteSheet gUnknown_0840B008;
-extern const struct SpriteSheet gUnknown_0840B018;
-extern const struct SpritePalette gUnknown_0840B028[];
-extern const struct SpriteTemplate gSpriteTemplate_840B1F4;
-extern const struct SpriteSheet gIntro3PokeballGfx_Table;
-extern const struct SpriteSheet gIntro3MiscGfx_Table;
-extern const struct SpritePalette gInterfacePokeballPal_Table;
-extern const struct SpritePalette gIntro3MiscPal_Table[];
+extern const u8 gInterfaceGfx_PokeBall[];
+extern const u16 gInterfacePal_PokeBall[];
extern const struct SpriteSheet gIntro2BrendanSpriteSheet;
extern const struct SpriteSheet gIntro2MaySpriteSheet;
extern const struct SpriteSheet gIntro2BicycleSpriteSheet;
extern const struct SpriteSheet gIntro2LatiosSpriteSheet;
extern const struct SpriteSheet gIntro2LatiasSpriteSheet;
extern const struct SpritePalette gIntro2SpritePalettes[];
-
-extern const struct SpriteTemplate gSpriteTemplate_840AE20;
-
extern const u8 gIntroCopyright_Gfx[];
extern const u16 gIntroCopyright_Pal[];
extern const u16 gIntroCopyright_Tilemap[];
-
extern const u16 gUnknown_08393E64[];
-extern const s16 gUnknown_0840AF50[][2];
-extern const s16 gUnknown_0840AF74[][2];
-extern const struct SpriteTemplate gSpriteTemplate_840AF94;
-extern const struct SpriteTemplate gSpriteTemplate_840AFAC;
-extern const struct SpriteTemplate gSpriteTemplate_840AFC4;
-extern union AnimCmd *gUnknown_0840B064[];
-extern const struct SpriteTemplate gSpriteTemplate_840B084;
-extern const struct SpriteTemplate gSpriteTemplate_840B0B0;
-extern const struct SpriteTemplate gSpriteTemplate_840B0DC;
-extern const struct SpriteTemplate gSpriteTemplate_840B0F4;
-extern const struct SpriteTemplate gSpriteTemplate_840B124;
-extern const struct SpriteTemplate gSpriteTemplate_840B150;
-extern const u8 gUnknown_0840B168[];
-extern const struct SpriteTemplate gSpriteTemplate_840B170;
-extern const u16 gUnknown_0840B188[];
-extern const struct SpriteTemplate gSpriteTemplate_840B1B0;
-extern const struct SpriteTemplate gSpriteTemplate_840B1C8;
-extern void *gUnknown_0840B5A0[];
-
+extern void *const gUnknown_0840B5A0[];
extern const s16 gSineTable[];
+//--------------------------------------------------
+// Graphics Data
+//--------------------------------------------------
+
+static const u16 Palette_406340[] = INCBIN_U16("graphics/intro/unknown1.gbapal");
+static const u16 Palette_406360[] = INCBIN_U16("graphics/intro/unknown2.gbapal");
+static const u8 gIntroTiles[] = INCBIN_U8("graphics/intro/intro.4bpp.lz");
+static const u16 gIntro1BGPals[][16] =
+{
+ INCBIN_U16("graphics/intro/intro1_bgpal1.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal2.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal3.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal4.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal5.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal6.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal7.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal8.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal9.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal10.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal11.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal12.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal13.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal14.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal15.gbapal"),
+ INCBIN_U16("graphics/intro/intro1_bgpal16.gbapal"),
+};
+static const u8 gIntro1BG0_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg0_map.bin.lz");
+static const u8 gIntro1BG1_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg1_map.bin.lz");
+static const u8 gIntro1BG2_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg2_map.bin.lz");
+static const u8 gIntro1BG3_Tilemap[] = INCBIN_U8("graphics/intro/intro1_bg3_map.bin.lz");
+static const u8 gIntro1BGLeavesGfx[] = INCBIN_U8("graphics/intro/introgfx.4bpp.lz");
+static const u16 gIntro3PokeballPal[] = INCBIN_U16("graphics/intro/intro3_pokeball.gbapal");
+static const u8 gIntro3Pokeball_Tilemap[] = INCBIN_U8("graphics/intro/intro3_pokeball_map.bin.lz");
+static const u8 gIntro3Pokeball_Gfx[] = INCBIN_U8("graphics/intro/intro3_pokeball.8bpp.lz");
+static const u16 gIntro3Streaks_Pal[] = INCBIN_U16("graphics/intro/intro3_streaks.gbapal");
+static const u8 gIntro3Streaks_Gfx[] = INCBIN_U8("graphics/intro/intro3_streaks.4bpp.lz");
+static const u8 gIntro3Streaks_Tilemap[] = INCBIN_U8("graphics/intro/intro3_streaks_map.bin.lz");
+static const u16 gIntro3Misc1Palette[] = INCBIN_U16("graphics/intro/intro3_misc1.gbapal");
+static const u16 gIntro3Misc2Palette[] = INCBIN_U16("graphics/intro/intro3_misc2.gbapal");
+static const u8 gIntro3MiscTiles[] = INCBIN_U8("graphics/intro/intro3_misc.4bpp.lz");
+static const u16 gIntro1EonPalette[] = INCBIN_U16("graphics/intro/intro1_eon.gbapal");
+static const u8 gIntro1EonTiles[] = INCBIN_U8("graphics/intro/intro1_eon.4bpp.lz");
+static const struct OamData gOamData_840ADE8 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840ADF0[] =
+{
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840ADF8[] =
+{
+ ANIMCMD_FRAME(24, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AE00[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AE08[] =
+{
+ ANIMCMD_FRAME(48, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_840AE10[] =
+{
+ gSpriteAnim_840ADF0,
+ gSpriteAnim_840ADF8,
+ gSpriteAnim_840AE00,
+ gSpriteAnim_840AE08,
+};
+static void sub_813D208(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840AE20 =
+{
+ .tileTag = 2000,
+ .paletteTag = 2000,
+ .oam = &gOamData_840ADE8,
+ .anims = gSpriteAnimTable_840AE10,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813D208,
+};
+static const union AnimCmd Unknown_40AE38[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(64, 4),
+ ANIMCMD_FRAME(128, 4),
+ ANIMCMD_FRAME(192, 4),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd Unknown_40AE4C[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_FRAME(192, 8),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd Unknown_40AE60[] =
+{
+ ANIMCMD_FRAME(256, 4),
+ ANIMCMD_FRAME(0x140, 4),
+ ANIMCMD_FRAME(0x180, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd Unknown_40AE70[] =
+{
+ ANIMCMD_FRAME(0x180, 16),
+ ANIMCMD_FRAME(0x140, 16),
+ ANIMCMD_FRAME(256, 16),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gUnknown_0840AE80[] =
+{
+ Unknown_40AE38,
+ Unknown_40AE4C,
+ Unknown_40AE60,
+ Unknown_40AE70,
+};
+static const struct OamData gOamData_840AE90 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const struct OamData gOamData_840AE98 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const struct OamData gOamData_840AEA0 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 2,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840AEA8[] =
+{
+ ANIMCMD_FRAME(80, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AEB0[] =
+{
+ ANIMCMD_FRAME(84, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AEB8[] =
+{
+ ANIMCMD_FRAME(88, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AEC0[] =
+{
+ ANIMCMD_FRAME(92, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AEC8[] =
+{
+ ANIMCMD_FRAME(96, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AED0[] =
+{
+ ANIMCMD_FRAME(100, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AED8[] =
+{
+ ANIMCMD_FRAME(104, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AEE0[] =
+{
+ ANIMCMD_FRAME(112, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AEE8[] =
+{
+ ANIMCMD_FRAME(113, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AEF0[] =
+{
+ ANIMCMD_FRAME(114, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AEF8[] =
+{
+ ANIMCMD_FRAME(115, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AF00[] =
+{
+ ANIMCMD_FRAME(116, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AF08[] =
+{
+ ANIMCMD_FRAME(117, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_840AF10[] =
+{
+ ANIMCMD_FRAME(128, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_840AF18[] =
+{
+ gSpriteAnim_840AEA8,
+ gSpriteAnim_840AEB0,
+ gSpriteAnim_840AEB8,
+ gSpriteAnim_840AEC0,
+ gSpriteAnim_840AEC8,
+ gSpriteAnim_840AED0,
+ gSpriteAnim_840AED8,
+};
+static const union AnimCmd *const gSpriteAnimTable_840AF34[] =
+{
+ gSpriteAnim_840AEE0,
+ gSpriteAnim_840AEE8,
+ gSpriteAnim_840AEF0,
+ gSpriteAnim_840AEF8,
+ gSpriteAnim_840AF00,
+ gSpriteAnim_840AF08,
+};
+static const union AnimCmd *const gSpriteAnimTable_840AF4C[] =
+{
+ gSpriteAnim_840AF10,
+};
+static const s16 gUnknown_0840AF50[][2] =
+{
+ {0, -72},
+ {1, -56},
+ {2, -40},
+ {3, -24},
+ {4, 8},
+ {5, 24},
+ {3, 40},
+ {1, 56},
+ {6, 72},
+};
+static const s16 gUnknown_0840AF74[][2] =
+{
+ {0, -28},
+ {1, -20},
+ {2, -12},
+ {3, -4},
+ {2, 4},
+ {4, 12},
+ {5, 20},
+ {3, 28},
+};
+static void sub_813D908(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840AF94 =
+{
+ .tileTag = 2000,
+ .paletteTag = 2001,
+ .oam = &gOamData_840AE90,
+ .anims = gSpriteAnimTable_840AF18,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813D908,
+};
+static const struct SpriteTemplate gSpriteTemplate_840AFAC =
+{
+ .tileTag = 2000,
+ .paletteTag = 2001,
+ .oam = &gOamData_840AE98,
+ .anims = gSpriteAnimTable_840AF34,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813D908,
+};
+static const struct SpriteTemplate gSpriteTemplate_840AFC4 =
+{
+ .tileTag = 2000,
+ .paletteTag = 2001,
+ .oam = &gOamData_840AEA0,
+ .anims = gSpriteAnimTable_840AF4C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813D908,
+};
+static const struct OamData gOamData_840AFDC =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840AFE4[] =
+{
+ ANIMCMD_FRAME(0, 10),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd *const gSpriteAnimTable_840AFEC[] =
+{
+ gSpriteAnim_840AFE4,
+};
+static void sub_813DA64(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840AFF0 =
+{
+ .tileTag = 2002,
+ .paletteTag = 2002,
+ .oam = &gOamData_840AFDC,
+ .anims = gSpriteAnimTable_840AFEC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813DA64,
+};
+const struct SpriteSheet gUnknown_0840B008[] =
+{
+ {gIntroTiles, 0x1400, 2000},
+ {NULL},
+};
+const struct SpriteSheet gUnknown_0840B018[] =
+{
+ {gIntro1EonTiles, 0x400, 2002},
+ {NULL},
+};
+const struct SpritePalette gUnknown_0840B028[] =
+{
+ {Palette_406340, 2000},
+ {Palette_406360, 2001},
+ {gIntro1EonPalette, 2002},
+ {NULL},
+};
+static const union AnimCmd gUnknown_0840B048[] =
+{
+ ANIMCMD_FRAME(3, 0),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_0840B050[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd gUnknown_0840B058[] =
+{
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gUnknown_0840B064[] =
+{
+ gUnknown_0840B048,
+ gUnknown_0840B050,
+ gUnknown_0840B058,
+};
+static const struct OamData gOamData_840B070 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840B078[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_840B080[] =
+{
+ gSpriteAnim_840B078,
+};
+static void sub_813E30C(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B084 =
+{
+ .tileTag = 2002,
+ .paletteTag = 2002,
+ .oam = &gOamData_840B070,
+ .anims = gSpriteAnimTable_840B080,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813E30C,
+};
+static const struct OamData gOamData_840B09C =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840B0A4[] =
+{
+ ANIMCMD_FRAME(1, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_840B0AC[] =
+{
+ gSpriteAnim_840B0A4,
+};
+static void sub_813E4B8(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B0B0 =
+{
+ .tileTag = 2003,
+ .paletteTag = 2003,
+ .oam = &gOamData_840B09C,
+ .anims = gSpriteAnimTable_840B0AC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813E4B8,
+};
+static const struct OamData gOamData_840B0C8 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840B0D0[] =
+{
+ ANIMCMD_FRAME(14, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_840B0D8[] =
+{
+ gSpriteAnim_840B0D0,
+};
+static void sub_813E5E0(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B0DC =
+{
+ .tileTag = 2003,
+ .paletteTag = 2004,
+ .oam = &gOamData_840B0C8,
+ .anims = gSpriteAnimTable_840B0D8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813E5E0,
+};
+static void sub_813E6C0(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B0F4 =
+{
+ .tileTag = 2003,
+ .paletteTag = 2004,
+ .oam = &gOamData_840B0C8,
+ .anims = gSpriteAnimTable_840B0D8,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813E6C0,
+};
+static const struct OamData gOamData_840B10C =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840B114[] =
+{
+ ANIMCMD_FRAME(6, 8),
+ ANIMCMD_FRAME(6, 8, .hFlip = TRUE),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd *const gSpriteAnimTable_840B120[] =
+{
+ gSpriteAnim_840B114,
+};
+static void sub_813E804(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B124 =
+{
+ .tileTag = 2003,
+ .paletteTag = 2004,
+ .oam = &gOamData_840B10C,
+ .anims = gSpriteAnimTable_840B120,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813E804,
+};
+static const struct OamData gOamData_840B13C =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840B144[] =
+{
+ ANIMCMD_FRAME(10, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_840B14C[] =
+{
+ gSpriteAnim_840B144,
+};
+static void sub_813E980(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B150 =
+{
+ .tileTag = 2003,
+ .paletteTag = 2004,
+ .oam = &gOamData_840B13C,
+ .anims = gSpriteAnimTable_840B14C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813E980,
+};
+static const u8 gUnknown_0840B168[] = {0xE6, 0xEB, 0xE4, 0xEA, 0xE5, 0xE9, 0xE7, 0xE8};
+static void sub_813EA60(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B170 =
+{
+ .tileTag = 2003,
+ .paletteTag = 2004,
+ .oam = &gOamData_840B13C,
+ .anims = gSpriteAnimTable_840B14C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813EA60,
+};
+static const u16 gUnknown_0840B188[] = {0x200, 0x1C0, 0x180, 0x140, 0x100, 0xE0, 0xC0, 0xA0, 0x80, 0x80};
+static const struct OamData gOamData_840B19C =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840B1A4[] =
+{
+ ANIMCMD_FRAME(2, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_840B1AC[] =
+{
+ gSpriteAnim_840B1A4,
+};
+static void sub_813EBBC(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B1B0 =
+{
+ .tileTag = 2003,
+ .paletteTag = 2004,
+ .oam = &gOamData_840B19C,
+ .anims = gSpriteAnimTable_840B1AC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813EBBC,
+};
+static void sub_813EC90(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B1C8 =
+{
+ .tileTag = 2003,
+ .paletteTag = 2004,
+ .oam = &gOamData_840B19C,
+ .anims = gSpriteAnimTable_840B1AC,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813EC90,
+};
+static const struct OamData gOamData_840B1E0 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_840B1E8[] =
+{
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_840B1F0[] =
+{
+ gSpriteAnim_840B1E8,
+};
+static void sub_813EDFC(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_840B1F4 =
+{
+ .tileTag = 2003,
+ .paletteTag = 2003,
+ .oam = &gOamData_840B1E0,
+ .anims = gSpriteAnimTable_840B1F0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_813EDFC,
+};
+const struct SpriteSheet gIntro3PokeballGfx_Table[] =
+{
+ {gInterfaceGfx_PokeBall, 0x100, 2002},
+ {NULL},
+};
+const struct SpriteSheet gIntro3MiscGfx_Table[] =
+{
+ {gIntro3MiscTiles, 0xa00, 2003},
+ {NULL},
+};
+const struct SpritePalette gInterfacePokeballPal_Table[] =
+{
+ {gInterfacePal_PokeBall, 2002},
+ {NULL},
+};
+const struct SpritePalette gIntro3MiscPal_Table[] =
+{
+ {gIntro3Misc1Palette, 2003},
+ {gIntro3Misc2Palette, 2004},
+ {NULL},
+};
+const u32 unusedData = 0x02000000;
+
static void MainCB2_EndIntro(void);
static void Task_IntroLoadPart1Graphics(u8);
static void Task_IntroFadeIn(u8);
@@ -129,18 +799,18 @@ static void sub_813CCE8(u8);
static u16 sub_813CE88(u16, s16, s16, u16, u8);
static u8 sub_813CFA8(u16, u16, u16, u16);
static void sub_813D084(u8);
-void sub_813D220(struct Sprite *);
-void sub_813D368(struct Sprite *);
-void sub_813D414(struct Sprite *);
-void SpriteCB_WaterDropFall(struct Sprite *);
+static void sub_813D220(struct Sprite *);
+static void sub_813D368(struct Sprite *);
+static void sub_813D414(struct Sprite *);
+static void SpriteCB_WaterDropFall(struct Sprite *);
static u8 CreateWaterDrop(s16, s16, u16, u16, u16, u8);
-void sub_813D788(struct Sprite *);
-void sub_813D880(struct Sprite *);
+static void sub_813D788(struct Sprite *);
+static void sub_813D880(struct Sprite *);
static u8 CreateGameFreakLogo(s16, s16, u8);
-void sub_813DB9C(struct Sprite *);
-void sub_813DE70(struct Sprite *);
-void sub_813E10C(struct Sprite *);
-void sub_813E210(struct Sprite *);
+static void sub_813DB9C(struct Sprite *);
+static void sub_813DE70(struct Sprite *);
+static void sub_813E10C(struct Sprite *);
+static void sub_813E210(struct Sprite *);
static void sub_813E580(u16, u16);
static void sub_813E7C0(u8);
static void sub_813E930(u8);
@@ -181,7 +851,7 @@ static void LoadCopyrightGraphics(u16 a1, u16 a2, u16 a3)
static void SerialCb_CopyrightScreen(void)
{
- GameCubeMultiBoot_HandleSerialInterrupt(&gUnknown_03005EE0);
+ GameCubeMultiBoot_HandleSerialInterrupt(&gMultibootProgramStruct);
}
static u8 SetUpCopyrightScreen(void)
@@ -209,7 +879,11 @@ static u8 SetUpCopyrightScreen(void)
ResetSpriteData();
FreeAllSpritePalettes();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF);
- REG_BG0CNT = 1792;
+ REG_BG0CNT = BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_SCREENBASE(7)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256;
ime = REG_IME;
REG_IME = 0;
REG_IE |= INTR_FLAG_VBLANK;
@@ -218,15 +892,15 @@ static u8 SetUpCopyrightScreen(void)
SetVBlankCallback(VBlankCB_Intro);
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON;
SetSerialCallback(SerialCb_CopyrightScreen);
- GameCubeMultiBoot_Init(&gUnknown_03005EE0);
+ GameCubeMultiBoot_Init(&gMultibootProgramStruct);
default:
UpdatePaletteFade();
gMain.state++;
- GameCubeMultiBoot_Main(&gUnknown_03005EE0);
+ GameCubeMultiBoot_Main(&gMultibootProgramStruct);
break;
case 140:
- GameCubeMultiBoot_Main(&gUnknown_03005EE0);
- if (gUnknown_03005EE0.gcmb_field_2 != 1)
+ GameCubeMultiBoot_Main(&gMultibootProgramStruct);
+ if (gMultibootProgramStruct.gcmb_field_2 != 1)
{
BeginNormalPaletteFade(0xFFFFFFFFu, 0, 0, 0x10, 0);
gMain.state++;
@@ -237,9 +911,9 @@ static u8 SetUpCopyrightScreen(void)
break;
CreateTask(Task_IntroLoadPart1Graphics, 0);
SetMainCallback2(MainCB2_Intro);
- if (gUnknown_03005EE0.gcmb_field_2)
+ if (gMultibootProgramStruct.gcmb_field_2)
{
- GameCubeMultiBoot_ExecuteProgram(&gUnknown_03005EE0);
+ GameCubeMultiBoot_ExecuteProgram(&gMultibootProgramStruct);
}
else
{
@@ -257,7 +931,7 @@ void c2_copyright_1(void)
if (!SetUpCopyrightScreen())
{
sub_8052E4C();
- sub_81251B8();
+ ResetSaveCounters();
sub_8125EC8(0);
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
ClearSav2();
@@ -288,13 +962,13 @@ static void Task_IntroLoadPart1Graphics(u8 taskId)
DmaClear16(3, VRAM + 0xA800, 0x800);
LZ77UnCompVram(gIntro1BG3_Tilemap, (void *)(VRAM + 0xB000));
DmaClear16(3, VRAM + 0xB800, 0x800);
- LoadPalette(gIntro1BGPals, 0, 0x200);
- REG_BG3CNT = 0x9603;
- REG_BG2CNT = 0x9402;
- REG_BG1CNT = 0x9201;
- REG_BG0CNT = 0x9000;
- LoadCompressedObjectPic(&gUnknown_0840B008);
- LoadCompressedObjectPic(&gUnknown_0840B018);
+ LoadPalette(gIntro1BGPals, 0, sizeof(gIntro1BGPals));
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512;
+ REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512;
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512;
+ REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512;
+ LoadCompressedObjectPic(&gUnknown_0840B008[0]);
+ LoadCompressedObjectPic(&gUnknown_0840B018[0]);
LoadSpritePalettes(gUnknown_0840B028);
CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20);
CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E);
@@ -323,19 +997,19 @@ static void Task_IntroWaterDrops(u8 taskId)
//start moving rock
if (gIntroFrameCounter == 76)
gSprites[gTasks[taskId].data[0]].data0 = 1;
-
+
//drop rock
if (gIntroFrameCounter == 251)
gSprites[gTasks[taskId].data[0]].data0 = 2;
-
+
if (gIntroFrameCounter == 368)
CreateWaterDrop(48, 0, 0x400, 5, 0x70, TRUE);
if (gIntroFrameCounter == 384)
CreateWaterDrop(200, 60, 0x400, 9, 0x80, TRUE);
-
+
if (gIntroFrameCounter == 560)
CreateGameFreakLogo(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, CreateTask(sub_813CCE8, 0));
-
+
if (gIntroFrameCounter > 739)
{
gTasks[taskId].data[1] = 0x50;
@@ -353,7 +1027,7 @@ static void Task_IntroScrollDownAndShowEon(u8 taskId)
if (gIntroFrameCounter < 904)
{
s32 r2;
-
+
//slide backgrounds downward
r2 = (gTasks[taskId].data[1] << 16) + (u16)gTasks[taskId].data[2] - 0xC000;
gTasks[taskId].data[1] = r2 >> 16;
@@ -367,12 +1041,12 @@ static void Task_IntroScrollDownAndShowEon(u8 taskId)
gTasks[taskId].data[5] = r2 >> 16;
gTasks[taskId].data[6] = r2;
REG_BG0VOFS = gTasks[taskId].data[5];
-
+
//show Lati@s sprite
if (gIntroFrameCounter == 880)
{
u8 spriteId = CreateSprite(&gSpriteTemplate_840AFF0, 200, 160, 10);
-
+
gSprites[spriteId].invisible = 1;
}
}
@@ -412,7 +1086,7 @@ static void Task_IntroLoadPart2Graphics(u8 taskId)
static void Task_IntroStartBikeRide(u8 taskId)
{
u8 spriteId;
-
+
if (gUnknown_02039318 == 0)
LoadCompressedObjectPic(&gIntro2BrendanSpriteSheet);
else
@@ -454,7 +1128,7 @@ static void Task_IntroHandleBikeAndEonMovement(u8 taskId)
{
s16 a;
u16 sine;
-
+
if (gIntroFrameCounter > 1823)
{
BeginNormalPaletteFade(0xFFFFFFFF, 16, 0, 16, 0xFFFF);
@@ -472,7 +1146,7 @@ static void Task_IntroHandleBikeAndEonMovement(u8 taskId)
gSprites[gTasks[taskId].data[1]].data0 = 3;
if (gIntroFrameCounter == 1727)
gSprites[gTasks[taskId].data[1]].data0 = 4;
-
+
//TODO: Clean this up
a = (((u16)gTasks[taskId].data[3] << 16) >> 18) & 0x7F;
sine = Sin(a, 48);
@@ -509,7 +1183,7 @@ static void Task_IntroLoadPart3Graphics(u8 taskId)
ResetSpriteData();
FreeAllSpritePalettes();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF);
- REG_BG2CNT = 0x4883;
+ REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_256COLOR | BGCNT_AFF256x256;
REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
gTasks[taskId].func = Task_IntroSpinAndZoomPokeball;
gIntroFrameCounter = 0;
@@ -545,7 +1219,7 @@ static void Task_IntroLoadPart3Streaks(u8 taskId)
{
u16 i;
void *vram;
-
+
intro_reset_and_hide_bgs();
for (i = 0; i < 32; i++)
{
@@ -574,9 +1248,9 @@ static void Task_IntroLoadPart3Streaks(u8 taskId)
ResetSpriteData();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 8;
- LoadCompressedObjectPic(&gIntro3PokeballGfx_Table);
- LoadCompressedObjectPic(&gIntro3MiscGfx_Table);
- LoadCompressedObjectPalette(&gInterfacePokeballPal_Table);
+ LoadCompressedObjectPic(&gIntro3PokeballGfx_Table[0]);
+ LoadCompressedObjectPic(&gIntro3MiscGfx_Table[0]);
+ LoadCompressedObjectPalette(&gInterfacePokeballPal_Table[0]);
LoadSpritePalettes(gIntro3MiscPal_Table);
gTasks[taskId].func = task_intro_14;
}
@@ -587,8 +1261,16 @@ static void task_intro_14(u8 taskId)
REG_WIN0V = 0xA0;
REG_WININ = 0x1C;
REG_WINOUT = 0x1D;
- REG_BG3CNT = 0x603;
- REG_BG0CNT = 0x700;
+ REG_BG3CNT = BGCNT_PRIORITY(3)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_SCREENBASE(6)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256;
+ REG_BG0CNT = BGCNT_PRIORITY(0)
+ | BGCNT_CHARBASE(0)
+ | BGCNT_SCREENBASE(7)
+ | BGCNT_16COLOR
+ | BGCNT_TXT256x256;
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON;
gTasks[taskId].data[15] = CreateTask(task_intro_20, 0);
gTasks[gTasks[taskId].data[15]].data[0] = 0;
@@ -599,11 +1281,11 @@ static void task_intro_14(u8 taskId)
static void task_intro_15(u8 taskId)
{
u16 foo = gTasks[taskId].data[0];
-
+
if (gTasks[taskId].data[0] != 32)
{
u32 bar; //needed to match for some reason
-
+
gTasks[taskId].data[0] += 4;
REG_WIN0V = (gTasks[taskId].data[0] * 256) - (bar = foo - 0x9C);
}
@@ -628,7 +1310,7 @@ static void task_intro_17(u8 taskId)
static void Task_IntroPokemonBattle(u8 taskId)
{
u8 spriteId;
-
+
if (gIntroFrameCounter == 80)
{
spriteId = sub_813CE88(SPECIES_SHARPEDO, 0xF0, 0xA0, 5, 1);
@@ -742,18 +1424,21 @@ static void task_intro_19(u8 taskId)
static void task_intro_20(u8 taskId)
{
+#define BG2_FLAGS (BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(14) | BGCNT_16COLOR | BGCNT_TXT256x256)
+#define DISPCNT_FLAGS (DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON)
+
gTasks[taskId].data[15]++;
switch (gTasks[taskId].data[0])
{
case 0:
- REG_DISPCNT = 0x3940;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON;
REG_BG2CNT = 0;
gTasks[taskId].data[0] = 0xFF;
break;
case 2:
BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF);
- REG_BG2CNT = 0x0E07;
- REG_DISPCNT = 0x3D40;
+ REG_BG2CNT = BG2_FLAGS;
+ REG_DISPCNT = DISPCNT_FLAGS;
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = 0;
gTasks[taskId].data[0] = 20;
@@ -766,8 +1451,8 @@ static void task_intro_20(u8 taskId)
break;
case 3:
BeginNormalPaletteFade(1, 0, 0x10, 0, 0xFFFF);
- REG_BG2CNT = 0x0E07;
- REG_DISPCNT = 0x3D40;
+ REG_BG2CNT = BG2_FLAGS;
+ REG_DISPCNT = DISPCNT_FLAGS;
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = 0;
gTasks[taskId].data[0] = 0x1E;
@@ -780,8 +1465,8 @@ static void task_intro_20(u8 taskId)
break;
case 4:
BeginNormalPaletteFade(1, 5, 0, 0x10, 0x37F7);
- REG_BG2CNT = 0x0E07;
- REG_DISPCNT = 0x3D40;
+ REG_BG2CNT = BG2_FLAGS;
+ REG_DISPCNT = DISPCNT_FLAGS;
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = 0;
gTasks[taskId].data[3] = 8;
@@ -798,6 +1483,9 @@ static void task_intro_20(u8 taskId)
case 0xFF: //needed to prevent jump table optimization
break;
}
+
+#undef BG2_FLAGS
+#undef DISPCNT_FLAGS
}
static void intro_reset_and_hide_bgs(void)
@@ -834,7 +1522,7 @@ static void sub_813CCE8(u8 taskId)
{
u32 foo;
u32 bar asm("r2");
-
+
gTasks[taskId].data[1]--;
//tail merge at _0813CDC2
foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0);
@@ -865,7 +1553,7 @@ static void sub_813CCE8(u8 taskId)
{
u32 foo;
u32 bar asm("r2");
-
+
gTasks[taskId].data[1]++;
//_0813CDC2
foo = gTasks[taskId].data[1] + (gTasks[taskId].data[1] < 0);
@@ -1077,7 +1765,7 @@ void sub_813CE30(u16 scrX, u16 scrY, u16 zoom, u16 alpha)
{
struct BgAffineSrcData src;
struct BgAffineDstData dest;
-
+
src.texX = 0x8000;
src.texY = 0x8000;
src.scrX = scrX;
@@ -1098,7 +1786,7 @@ static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front)
{
void *pal;
u8 spriteId;
-
+
if (front)
LoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].x, gMonFrontPicCoords[species].y, 0x2000000, gUnknown_0840B5A0[d], species, 0, 1);
else
@@ -1115,7 +1803,7 @@ static u16 sub_813CE88(u16 species, s16 x, s16 y, u16 d, u8 front)
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);
LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + d * 0x10, 0x20);
sub_8143680(d, d);
@@ -1129,7 +1817,7 @@ static u8 sub_813CFA8(u16 a, u16 b, u16 c, u16 d)
static void sub_813D084(u8 a)
{
u16 color;
-
+
switch (a)
{
default:
@@ -1147,10 +1835,10 @@ static void sub_813D084(u8 a)
gPlttBufferFaded[241] = color;
}
-void sub_813D0CC(struct Sprite *sprite)
+static void sub_813D0CC(struct Sprite *sprite)
{
u8 r0;
-
+
if (sprite->data2 >= 192)
{
if (sprite->data3 != 0)
@@ -1174,7 +1862,7 @@ void sub_813D0CC(struct Sprite *sprite)
}
}
-void sub_813D158(struct Sprite *sprite)
+static void sub_813D158(struct Sprite *sprite)
{
if (gSprites[sprite->data7].data7 != 0)
{
@@ -1198,13 +1886,13 @@ void sub_813D158(struct Sprite *sprite)
}
}
-void sub_813D208(struct Sprite *sprite)
+static void sub_813D208(struct Sprite *sprite)
{
if (sprite->data0 != 0)
sprite->callback = sub_813D220;
}
-void sub_813D220(struct Sprite *sprite)
+static void sub_813D220(struct Sprite *sprite)
{
if (sprite->pos1.x <= 116)
{
@@ -1229,7 +1917,7 @@ void sub_813D220(struct Sprite *sprite)
s16 var3;
s16 var4;
s16 temp;
-
+
data4 = sprite->data4;
sin1 = gSineTable[(u8)data4];
sin2 = gSineTable[(u8)(data4 + 64)];
@@ -1253,7 +1941,7 @@ void sub_813D220(struct Sprite *sprite)
}
}
-void sub_813D368(struct Sprite *sprite)
+static void sub_813D368(struct Sprite *sprite)
{
SetOamMatrix(sprite->data1, sprite->data6 + 64, 0, 0, sprite->data6 + 64);
SetOamMatrix(sprite->data1 + 1, sprite->data6 + 64, 0, 0, sprite->data6 + 64);
@@ -1261,7 +1949,7 @@ void sub_813D368(struct Sprite *sprite)
if (sprite->data4 != 64)
{
u16 data4;
-
+
sprite->data4 -= 8;
data4 = sprite->data4;
sprite->pos2.x = gSineTable[(u8)(data4 + 64)] / 64;
@@ -1274,12 +1962,12 @@ void sub_813D368(struct Sprite *sprite)
}
}
-void sub_813D414(struct Sprite *sprite)
+static void sub_813D414(struct Sprite *sprite)
{
if (sprite->data0 != 2)
{
s16 r2;
-
+
sprite->data4 += 8;
r2 = gSineTable[(u8)sprite->data4] / 16 + 64;
sprite->pos2.x = gSineTable[(u8)(r2 + 64)] / 64;
@@ -1291,7 +1979,7 @@ void sub_813D414(struct Sprite *sprite)
}
}
-void SpriteCB_WaterDropFall(struct Sprite *sprite)
+static void SpriteCB_WaterDropFall(struct Sprite *sprite)
{
if (sprite->pos1.y < sprite->data5)
{
@@ -1314,7 +2002,7 @@ void SpriteCB_WaterDropFall(struct Sprite *sprite)
}
//Duplicate function
-void SpriteCB_WaterDropFall_2(struct Sprite *sprite)
+static void SpriteCB_WaterDropFall_2(struct Sprite *sprite)
{
if (sprite->pos1.y < sprite->data5)
{
@@ -1340,7 +2028,7 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately)
{
u8 spriteId;
u8 oldSpriteId;
-
+
spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0);
gSprites[spriteId].data0 = 0;
gSprites[spriteId].data7 = 0;
@@ -1358,7 +2046,7 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately)
else
gSprites[spriteId].callback = SpriteCB_WaterDropFall_2;
oldSpriteId = spriteId;
-
+
spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0);
gSprites[spriteId].data7 = oldSpriteId;
gSprites[spriteId].data1 = d + 1;
@@ -1366,7 +2054,7 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately)
gSprites[spriteId].oam.matrixNum = d + 1;
CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2);
gSprites[spriteId].callback = sub_813D158;
-
+
spriteId = CreateSprite(&gSpriteTemplate_840AE20, x, y, 0);
gSprites[spriteId].data7 = oldSpriteId;
gSprites[spriteId].data1 = d + 2;
@@ -1375,15 +2063,15 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately)
gSprites[spriteId].oam.matrixNum = d + 2;
CalcCenterToCornerVec(&gSprites[spriteId], 0, 2, 2);
gSprites[spriteId].callback = sub_813D158;
-
+
SetOamMatrix(d, c + 32, 0, 0, c + 32);
SetOamMatrix(d + 1, c + 32, 0, 0, c + 32);
SetOamMatrix(d + 2, c + 32, 0, 0, 2 * (c + 32));
-
+
return oldSpriteId;
}
-void sub_813D788(struct Sprite *sprite)
+static void sub_813D788(struct Sprite *sprite)
{
switch (sprite->data0)
{
@@ -1435,7 +2123,7 @@ void sub_813D788(struct Sprite *sprite)
}
}
-void sub_813D880(struct Sprite *sprite)
+static void sub_813D880(struct Sprite *sprite)
{
switch (sprite->data0)
{
@@ -1462,7 +2150,7 @@ void sub_813D880(struct Sprite *sprite)
sprite->data1 += 4;
}
-void sub_813D908(struct Sprite *sprite)
+static void sub_813D908(struct Sprite *sprite)
{
if (gTasks[sprite->data0].data[0] == 0)
{
@@ -1482,7 +2170,7 @@ static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c)
{
u8 spriteId;
u16 i;
-
+
for (i = 0; i < 9; i++)
{
spriteId = CreateSprite(&gSpriteTemplate_840AF94, gUnknown_0840AF50[i][1] + a, b - 4, 0);
@@ -1497,16 +2185,16 @@ static u8 CreateGameFreakLogo(s16 a, s16 b, u8 c)
}
spriteId = CreateSprite(&gSpriteTemplate_840AFC4, 120, b - 4, 0);
gSprites[spriteId].data0 = c;
-
+
return spriteId;
}
#ifdef NONMATCHING
-void sub_813DA64(struct Sprite *sprite)
+static void sub_813DA64(struct Sprite *sprite)
{
sprite->data7++;
-
- switch(sprite->data0)
+
+ switch (sprite->data0)
{
case 0:
default:
@@ -1527,7 +2215,7 @@ void sub_813DA64(struct Sprite *sprite)
s16 foo;
s16 r5;
s16 r2;
-
+
//_0813DAC0
if (sprite->data3 < 0x50)
{
@@ -1543,9 +2231,9 @@ void sub_813DA64(struct Sprite *sprite)
foo = sin1 * sprite->data1 / 256;
r5 = -r3 * sprite->data1 / 256;
r2 = r3 * sprite->data1 / 256;
-
+
SetOamMatrix(1, r6, r2, r5, foo);
-
+
if (sprite->data1 < 0x100)
sprite->data1 += 8;
else
@@ -1563,178 +2251,178 @@ void sub_813DA64(struct Sprite *sprite)
}
#else
__attribute__((naked))
-void sub_813DA64(struct Sprite *sprite)
+static void sub_813DA64(struct Sprite *sprite)
{
asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- sub sp, 0x4\n\
- adds r4, r0, 0\n\
- ldrh r0, [r4, 0x3C]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x3C]\n\
- movs r1, 0x2E\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0\n\
- beq _0813DA7C\n\
- cmp r0, 0x1\n\
- beq _0813DAC0\n\
+ push {r4-r6,lr}\n\
+ sub sp, 0x4\n\
+ adds r4, r0, 0\n\
+ ldrh r0, [r4, 0x3C]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x3C]\n\
+ movs r1, 0x2E\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r0, 0\n\
+ beq _0813DA7C\n\
+ cmp r0, 0x1\n\
+ beq _0813DAC0\n\
_0813DA7C:\n\
- ldrb r0, [r4, 0x1]\n\
- movs r1, 0x3\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x1]\n\
- ldrb r1, [r4, 0x3]\n\
- movs r0, 0x3F\n\
- negs r0, r0\n\
- ands r0, r1\n\
- movs r1, 0x2\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x3]\n\
- adds r0, r4, 0\n\
- movs r1, 0x1\n\
- movs r2, 0x3\n\
- movs r3, 0x3\n\
- bl CalcCenterToCornerVec\n\
- adds r2, r4, 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, [r4, 0x2E]\n\
- movs r0, 0x80\n\
- strh r0, [r4, 0x30]\n\
- ldr r0, _0813DABC @ =0x0000ffe8\n\
- strh r0, [r4, 0x32]\n\
- movs r0, 0\n\
- b _0813DB92\n\
- .align 2, 0\n\
+ ldrb r0, [r4, 0x1]\n\
+ movs r1, 0x3\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x1]\n\
+ ldrb r1, [r4, 0x3]\n\
+ movs r0, 0x3F\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ movs r1, 0x2\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x3]\n\
+ adds r0, r4, 0\n\
+ movs r1, 0x1\n\
+ movs r2, 0x3\n\
+ movs r3, 0x3\n\
+ bl CalcCenterToCornerVec\n\
+ adds r2, r4, 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, [r4, 0x2E]\n\
+ movs r0, 0x80\n\
+ strh r0, [r4, 0x30]\n\
+ ldr r0, _0813DABC @ =0x0000ffe8\n\
+ strh r0, [r4, 0x32]\n\
+ movs r0, 0\n\
+ b _0813DB92\n\
+ .align 2, 0\n\
_0813DABC: .4byte 0x0000ffe8\n\
_0813DAC0:\n\
- ldrh r1, [r4, 0x34]\n\
- movs r2, 0x34\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0x4F\n\
- bgt _0813DAF8\n\
- lsls r0, r1, 24\n\
- lsrs r0, 24\n\
- movs r1, 0x78\n\
- bl Sin\n\
- negs r0, r0\n\
- strh r0, [r4, 0x26]\n\
- ldrh r0, [r4, 0x34]\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- movs r1, 0x8C\n\
- bl Sin\n\
- negs r0, r0\n\
- strh r0, [r4, 0x24]\n\
- movs r1, 0x34\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0x40\n\
- ble _0813DAF8\n\
- ldrb r0, [r4, 0x5]\n\
- movs r1, 0xC\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x5]\n\
+ ldrh r1, [r4, 0x34]\n\
+ movs r2, 0x34\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0x4F\n\
+ bgt _0813DAF8\n\
+ lsls r0, r1, 24\n\
+ lsrs r0, 24\n\
+ movs r1, 0x78\n\
+ bl Sin\n\
+ negs r0, r0\n\
+ strh r0, [r4, 0x26]\n\
+ ldrh r0, [r4, 0x34]\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ movs r1, 0x8C\n\
+ bl Sin\n\
+ negs r0, r0\n\
+ strh r0, [r4, 0x24]\n\
+ movs r1, 0x34\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r0, 0x40\n\
+ ble _0813DAF8\n\
+ ldrb r0, [r4, 0x5]\n\
+ movs r1, 0xC\n\
+ orrs r0, r1\n\
+ strb r0, [r4, 0x5]\n\
_0813DAF8:\n\
- ldr r2, _0813DB60 @ =gSineTable\n\
- ldrh r1, [r4, 0x32]\n\
- lsls r0, r1, 24\n\
- lsrs r0, 23\n\
- adds r0, r2\n\
- ldrh r3, [r0]\n\
- adds r1, 0x40\n\
- lsls r1, 24\n\
- lsrs r1, 23\n\
- adds r1, r2\n\
- movs r2, 0\n\
- ldrsh r0, [r1, r2]\n\
- movs r1, 0x30\n\
- ldrsh r2, [r4, r1]\n\
- adds r1, r0, 0\n\
- muls r1, r2\n\
- adds r0, r1, 0\n\
- cmp r1, 0\n\
- bge _0813DB20\n\
- adds r0, 0xFF\n\
+ ldr r2, _0813DB60 @ =gSineTable\n\
+ ldrh r1, [r4, 0x32]\n\
+ lsls r0, r1, 24\n\
+ lsrs r0, 23\n\
+ adds r0, r2\n\
+ ldrh r3, [r0]\n\
+ adds r1, 0x40\n\
+ lsls r1, 24\n\
+ lsrs r1, 23\n\
+ adds r1, r2\n\
+ movs r2, 0\n\
+ ldrsh r0, [r1, r2]\n\
+ movs r1, 0x30\n\
+ ldrsh r2, [r4, r1]\n\
+ adds r1, r0, 0\n\
+ muls r1, r2\n\
+ adds r0, r1, 0\n\
+ cmp r1, 0\n\
+ bge _0813DB20\n\
+ adds r0, 0xFF\n\
_0813DB20:\n\
- lsls r0, 8\n\
- lsrs r6, r0, 16\n\
- lsls r0, r3, 16\n\
- asrs r3, r0, 16\n\
- negs r0, r3\n\
- muls r0, r2\n\
- cmp r0, 0\n\
- bge _0813DB32\n\
- adds r0, 0xFF\n\
+ lsls r0, 8\n\
+ lsrs r6, r0, 16\n\
+ lsls r0, r3, 16\n\
+ asrs r3, r0, 16\n\
+ negs r0, r3\n\
+ muls r0, r2\n\
+ cmp r0, 0\n\
+ bge _0813DB32\n\
+ adds r0, 0xFF\n\
_0813DB32:\n\
- lsls r0, 8\n\
- lsrs r5, r0, 16\n\
- adds r0, r3, 0\n\
- muls r0, r2\n\
- cmp r0, 0\n\
- bge _0813DB40\n\
- adds r0, 0xFF\n\
+ lsls r0, 8\n\
+ lsrs r5, r0, 16\n\
+ adds r0, r3, 0\n\
+ muls r0, r2\n\
+ cmp r0, 0\n\
+ bge _0813DB40\n\
+ adds r0, 0xFF\n\
_0813DB40:\n\
- lsls r0, 8\n\
- lsrs r2, r0, 16\n\
- adds r1, r6, 0\n\
- adds r3, r5, 0\n\
- str r1, [sp]\n\
- movs r0, 0x1\n\
- bl SetOamMatrix\n\
- ldrh r1, [r4, 0x30]\n\
- movs r2, 0x30\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0xFF\n\
- bgt _0813DB64\n\
- adds r0, r1, 0\n\
- adds r0, 0x8\n\
- b _0813DB68\n\
- .align 2, 0\n\
+ lsls r0, 8\n\
+ lsrs r2, r0, 16\n\
+ adds r1, r6, 0\n\
+ adds r3, r5, 0\n\
+ str r1, [sp]\n\
+ movs r0, 0x1\n\
+ bl SetOamMatrix\n\
+ ldrh r1, [r4, 0x30]\n\
+ movs r2, 0x30\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0xFF\n\
+ bgt _0813DB64\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x8\n\
+ b _0813DB68\n\
+ .align 2, 0\n\
_0813DB60: .4byte gSineTable\n\
_0813DB64:\n\
- adds r0, r1, 0\n\
- adds r0, 0x20\n\
+ adds r0, r1, 0\n\
+ adds r0, 0x20\n\
_0813DB68:\n\
- strh r0, [r4, 0x30]\n\
- ldrh r1, [r4, 0x32]\n\
- movs r2, 0x32\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0x17\n\
- bgt _0813DB78\n\
- adds r0, r1, 0x1\n\
- strh r0, [r4, 0x32]\n\
+ strh r0, [r4, 0x30]\n\
+ ldrh r1, [r4, 0x32]\n\
+ movs r2, 0x32\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0x17\n\
+ bgt _0813DB78\n\
+ adds r0, r1, 0x1\n\
+ strh r0, [r4, 0x32]\n\
_0813DB78:\n\
- ldrh r2, [r4, 0x34]\n\
- movs r1, 0x34\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0x3F\n\
- bgt _0813DB86\n\
- adds r0, r2, 0x2\n\
- b _0813DB92\n\
+ ldrh r2, [r4, 0x34]\n\
+ movs r1, 0x34\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r0, 0x3F\n\
+ bgt _0813DB86\n\
+ adds r0, r2, 0x2\n\
+ b _0813DB92\n\
_0813DB86:\n\
- ldrh r1, [r4, 0x3C]\n\
- movs r0, 0x3\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0813DB94\n\
- adds r0, r2, 0x1\n\
+ ldrh r1, [r4, 0x3C]\n\
+ movs r0, 0x3\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0813DB94\n\
+ adds r0, r2, 0x1\n\
_0813DB92:\n\
- strh r0, [r4, 0x34]\n\
+ strh r0, [r4, 0x34]\n\
_0813DB94:\n\
- add sp, 0x4\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
+ add sp, 0x4\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
.syntax divided\n");
}
#endif
-void sub_813DB9C(struct Sprite *sprite)
+static void sub_813DB9C(struct Sprite *sprite)
{
switch (sprite->data0)
{
@@ -1789,7 +2477,7 @@ void sub_813DB9C(struct Sprite *sprite)
&& sprite->pos1.x + sprite->pos2.x > -64)
{
u16 r2;
-
+
sprite->pos2.y = -(sprite->data4 * sprite->data4) / 8;
if (sprite->data2 != 0)
sprite->pos2.x += sprite->data4;
@@ -1806,11 +2494,11 @@ void sub_813DB9C(struct Sprite *sprite)
else
{
DestroySprite(sprite);
- }
+ }
}
}
-void sub_813DD58(struct Sprite *sprite)
+static void sub_813DD58(struct Sprite *sprite)
{
switch (sprite->data0)
{
@@ -1853,7 +2541,7 @@ void sub_813DD58(struct Sprite *sprite)
}
}
-void sub_813DE70(struct Sprite *sprite)
+static void sub_813DE70(struct Sprite *sprite)
{
switch (sprite->data0)
{
@@ -1894,7 +2582,7 @@ void sub_813DE70(struct Sprite *sprite)
case 4:
{
s16 r4, r5;
-
+
r5 = gSprites[sprite->data6].pos1.x + gSprites[sprite->data6].pos2.x;
r4 = gSprites[sprite->data6].pos1.y + gSprites[sprite->data6].pos2.y;
DestroySprite(&gSprites[sprite->data6]);
@@ -1904,7 +2592,7 @@ void sub_813DE70(struct Sprite *sprite)
gSprites[sprite->data6].data1 = 1;
gSprites[sprite->data6].data2 = 1;
sub_813E580(r5, r4);
-
+
r5 = gSprites[sprite->data7].pos1.x + gSprites[sprite->data7].pos2.x;
r4 = gSprites[sprite->data7].pos1.y + gSprites[sprite->data7].pos2.y;
DestroySprite(&gSprites[sprite->data7]);
@@ -1914,7 +2602,7 @@ void sub_813DE70(struct Sprite *sprite)
gSprites[sprite->data7].data1 = 2;
gSprites[sprite->data7].data2 = 0;
sub_813E580(r5, r4);
-
+
BeginNormalPaletteFade(0xFF0000, 0, 16, 16, RGB(31, 23, 31));
sprite->data0 = 1;
break;
@@ -1931,7 +2619,7 @@ void sub_813DE70(struct Sprite *sprite)
}
}
-void sub_813E10C(struct Sprite *sprite)
+static void sub_813E10C(struct Sprite *sprite)
{
switch (sprite->data0)
{
@@ -1999,7 +2687,7 @@ void sub_813E10C(struct Sprite *sprite)
}
}
-void sub_813E210(struct Sprite *sprite)
+static void sub_813E210(struct Sprite *sprite)
{
switch (sprite->data0)
{
@@ -2067,10 +2755,10 @@ void sub_813E210(struct Sprite *sprite)
}
}
-void sub_813E30C(struct Sprite *sprite)
+static void sub_813E30C(struct Sprite *sprite)
{
u16 r4, r1;
-
+
sprite->data7++;
switch (sprite->data0)
{
@@ -2122,12 +2810,12 @@ void sub_813E30C(struct Sprite *sprite)
}
}
-void sub_813E4B8(struct Sprite *sprite)
+static void sub_813E4B8(struct Sprite *sprite)
{
u16 r4;
u16 r2;
u16 r1;
-
+
sprite->data7++;
if (sprite->data7 & 1)
sprite->invisible = FALSE;
@@ -2157,7 +2845,7 @@ static void sub_813E580(u16 x, u16 y)
{
u8 i;
u8 spriteId;
-
+
for (i = 0; i < 8; i++)
{
spriteId = CreateSprite(&gSpriteTemplate_840B0B0, x, y, 0);
@@ -2168,7 +2856,7 @@ static void sub_813E580(u16 x, u16 y)
}
}
-void sub_813E5E0(struct Sprite *sprite)
+static void sub_813E5E0(struct Sprite *sprite)
{
if (gUnknown_0203931A != 0)
{
@@ -2190,13 +2878,13 @@ void sub_813E5E0(struct Sprite *sprite)
}
}
-void sub_813E6C0(struct Sprite *sprite)
+static void sub_813E6C0(struct Sprite *sprite)
{
u8 spriteId;
u8 i;
s16 var1;
s16 var2;
-
+
if (gUnknown_0203931A != 0)
{
DestroySprite(sprite);
@@ -2215,7 +2903,7 @@ void sub_813E6C0(struct Sprite *sprite)
//Make redundant copies of these variables to get the asm to match
s16 _var1 = var1;
s16 _var2 = var2;
-
+
spriteId = CreateSprite(&gSpriteTemplate_840B0DC, _var1, _var2, r3);
if (spriteId != 64)
{
@@ -2235,7 +2923,7 @@ void sub_813E6C0(struct Sprite *sprite)
static void sub_813E7C0(u8 a)
{
u8 spriteId;
-
+
spriteId = CreateSprite(&gSpriteTemplate_840B0F4, 0, 0, 0);
if (spriteId != 64)
{
@@ -2246,7 +2934,7 @@ static void sub_813E7C0(u8 a)
}
}
-void sub_813E804(struct Sprite *sprite)
+static void sub_813E804(struct Sprite *sprite)
{
if (gUnknown_0203931A != 0)
{
@@ -2275,7 +2963,7 @@ static void sub_813E930(u8 a)
{
u8 i;
u8 spriteId;
-
+
for (i = 0; i < 8; i++)
{
spriteId = CreateSprite(&gSpriteTemplate_840B124, gSprites[a].pos1.x, gSprites[a].pos1.y, 0);
@@ -2287,7 +2975,7 @@ static void sub_813E930(u8 a)
}
}
-void sub_813E980(struct Sprite *sprite)
+static void sub_813E980(struct Sprite *sprite)
{
if (gUnknown_0203931A != 0)
{
@@ -2297,7 +2985,7 @@ void sub_813E980(struct Sprite *sprite)
{
u8 r0;
u16 matrixNum;
-
+
sprite->invisible = gSprites[sprite->data0].invisible;
sprite->data7++;
sprite->data6 += 8;
@@ -2313,12 +3001,12 @@ void sub_813E980(struct Sprite *sprite)
}
}
-void sub_813EA60(struct Sprite *sprite)
+static void sub_813EA60(struct Sprite *sprite)
{
bool32 r6;
s16 r1, r2;
u8 spriteId;
-
+
if (gUnknown_0203931A != 0)
{
DestroySprite(sprite);
@@ -2355,7 +3043,7 @@ static void InitIntroTorchicAttackAnim(u8 a)
{
u8 spriteId;
u8 i;
-
+
spriteId = CreateSprite(&gSpriteTemplate_840B170, 0, 0, 0);
if (spriteId != 64)
{
@@ -2370,8 +3058,8 @@ static void InitIntroTorchicAttackAnim(u8 a)
}
}
-void sub_813EBBC(struct Sprite *sprite)
-{
+static void sub_813EBBC(struct Sprite *sprite)
+{
if (gUnknown_0203931A != 0)
{
DestroySprite(sprite);
@@ -2390,13 +3078,13 @@ void sub_813EBBC(struct Sprite *sprite)
}
}
-void sub_813EC90(struct Sprite *sprite)
+static void sub_813EC90(struct Sprite *sprite)
{
bool32 r6;
s16 r1, r2;
u8 spriteId;
u16 foo;
-
+
if (gUnknown_0203931A != 0)
{
DestroySprite(sprite);
@@ -2438,7 +3126,7 @@ void sub_813EC90(struct Sprite *sprite)
static void InitIntroMudkipAttackAnim(u8 a)
{
u8 spriteId;
-
+
spriteId = CreateSprite(&gSpriteTemplate_840B1C8, 0, 0, 0);
if (spriteId != 64)
{
@@ -2449,10 +3137,10 @@ static void InitIntroMudkipAttackAnim(u8 a)
}
}
-void sub_813EDFC(struct Sprite *sprite)
+static void sub_813EDFC(struct Sprite *sprite)
{
u16 foo;
-
+
//I'm not sure why a switch statement was used here.
//if (sprite->data0 != 1) would have been more appropriate.
switch (sprite->data0)
diff --git a/src/item.c b/src/item.c
index 3f74b5925..656563ad4 100644
--- a/src/item.c
+++ b/src/item.c
@@ -61,7 +61,7 @@ void CopyItemName(u16 itemId, u8 *string)
s8 CountUsedBagPocketSlots(u8 pocket)
{
u8 i;
-
+
for (i = 0; i < gBagPockets[pocket].capacity; i++)
{
if (gBagPockets[pocket].itemSlots[i].itemId == 0)
@@ -73,7 +73,7 @@ s8 CountUsedBagPocketSlots(u8 pocket)
bool8 IsBagPocketNonEmpty(u8 pocket)
{
u8 i;
-
+
for (i = 0; i < gBagPockets[pocket - 1].capacity; i++)
{
if (gBagPockets[pocket - 1].itemSlots[i].itemId != 0)
@@ -86,7 +86,7 @@ bool8 CheckBagHasItem(u16 itemId, u16 count)
{
u8 i;
u8 pocket;
-
+
if (ItemId_GetPocket(itemId) == 0)
return FALSE;
pocket = ItemId_GetPocket(itemId) - 1;
@@ -112,7 +112,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count)
u8 i;
u8 pocket;
u16 slotCapacity;
-
+
if (ItemId_GetPocket(itemId) == 0)
return FALSE;
pocket = ItemId_GetPocket(itemId) - 1;
@@ -120,7 +120,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count)
slotCapacity = 99;
else
slotCapacity = 999;
-
+
//Check space in any existing item slots that already contain this item
for (i = 0; i < gBagPockets[pocket].capacity; i++)
{
@@ -135,7 +135,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count)
return TRUE;
}
}
-
+
//Check space in empty item slots
if (count > 0)
{
@@ -152,7 +152,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count)
if (count > 0)
return FALSE; //No more item slots. The bag is full
}
-
+
return TRUE;
}
@@ -162,7 +162,7 @@ bool8 AddBagItem(u16 itemId, u16 count)
u8 pocket;
u16 slotCapacity;
struct ItemSlot newItems[64];
-
+
if (ItemId_GetPocket(itemId) == 0)
return FALSE;
pocket = ItemId_GetPocket(itemId) - 1;
@@ -172,7 +172,7 @@ bool8 AddBagItem(u16 itemId, u16 count)
slotCapacity = 99;
else
slotCapacity = 999;
-
+
//Use any item slots that already contain this item
for (i = 0; i < gBagPockets[pocket].capacity; i++)
{
@@ -193,7 +193,7 @@ bool8 AddBagItem(u16 itemId, u16 count)
goto copy_items;
}
}
-
+
//Put any remaining items into new item slots.
if (count > 0)
{
@@ -214,7 +214,7 @@ bool8 AddBagItem(u16 itemId, u16 count)
if (count > 0)
return FALSE; //No more empty item slots. The bag is full.
}
-
+
copy_items:
//Copy pocket back into the bag.
memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot));
@@ -226,11 +226,11 @@ bool8 RemoveBagItem(u16 itemId, u16 count)
u8 i;
u8 pocket;
u16 totalQuantity = 0;
-
+
if (ItemId_GetPocket(itemId) == 0 || itemId == 0)
return FALSE;
pocket = ItemId_GetPocket(itemId) - 1;
-
+
for (i = 0; i < gBagPockets[pocket].capacity; i++)
{
if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
@@ -238,7 +238,7 @@ bool8 RemoveBagItem(u16 itemId, u16 count)
}
if (totalQuantity < count)
return FALSE; //We don't have enough of the item
-
+
if (gBagPockets[pocket].capacity > gUnknown_02038560
&& gBagPockets[pocket].itemSlots[gUnknown_02038560].itemId == itemId)
{
@@ -257,7 +257,7 @@ bool8 RemoveBagItem(u16 itemId, u16 count)
if (count == 0)
return TRUE;
}
-
+
for (i = 0; i < gBagPockets[pocket].capacity; i++)
{
if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
@@ -289,7 +289,7 @@ u8 GetPocketByItemId(u16 itemId)
void ClearItemSlots(struct ItemSlot *itemSlots, u8 b)
{
u16 i;
-
+
for (i = 0; i < b; i++)
{
itemSlots[i].itemId = 0;
@@ -300,7 +300,7 @@ void ClearItemSlots(struct ItemSlot *itemSlots, u8 b)
static s32 FindFreePCItemSlot(void)
{
s8 i;
-
+
for (i = 0; i < 50; i++)
{
if (gSaveBlock1.pcItems[i].itemId == 0)
@@ -313,7 +313,7 @@ u8 CountUsedPCItemSlots(void)
{
u8 usedSlots = 0;
u8 i;
-
+
for (i = 0; i < 50; i++)
{
if (gSaveBlock1.pcItems[i].itemId != 0)
@@ -325,7 +325,7 @@ u8 CountUsedPCItemSlots(void)
bool8 CheckPCHasItem(u16 itemId, u16 count)
{
u8 i;
-
+
for (i = 0; i < 50; i++)
{
if (gSaveBlock1.pcItems[i].itemId == itemId && gSaveBlock1.pcItems[i].quantity >= count)
@@ -339,10 +339,10 @@ bool8 AddPCItem(u16 itemId, u16 count)
u8 i;
s8 freeSlot;
struct ItemSlot newItems[50];
-
+
//Copy PC items
memcpy(newItems, gSaveBlock1.pcItems, sizeof(newItems));
-
+
//Use any item slots that already contain this item
for (i = 0; i < 50; i++)
{
@@ -363,7 +363,7 @@ bool8 AddPCItem(u16 itemId, u16 count)
}
}
}
-
+
//Put any remaining items into a new item slot.
if (count > 0)
{
@@ -373,7 +373,7 @@ bool8 AddPCItem(u16 itemId, u16 count)
newItems[freeSlot].itemId = itemId;
newItems[freeSlot].quantity = count;
}
-
+
//Copy items back to the PC
memcpy(gSaveBlock1.pcItems, newItems, sizeof(gSaveBlock1.pcItems));
return TRUE;
@@ -393,7 +393,7 @@ static void CompactPCItems(void)
{
u16 i;
u16 j;
-
+
for (i = 0; i < 49; i++)
{
for (j = i + 1; j <= 49; j++)
@@ -410,7 +410,7 @@ static void CompactPCItems(void)
void SwapRegisteredBike(void)
{
- switch(gSaveBlock1.registeredItem)
+ switch (gSaveBlock1.registeredItem)
{
case 0x103:
gSaveBlock1.registeredItem = 0x110;
@@ -464,7 +464,7 @@ bool8 ItemId_CopyDescription(u8 *a, u32 itemId, u32 c)
u32 r5 = c + 1;
u8 *description = gItems[SanitizeItemId(itemId)].description;
u8 *str = a;
-
+
for (;;)
{
if (*description == 0xFF || *description == 0xFE)
diff --git a/src/item_use.c b/src/item_use.c
index 557705460..b68b72b26 100644
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -1,21 +1,22 @@
#include "global.h"
-#include "task.h"
-#include "item.h"
-#include "palette.h"
-#include "weather.h"
-#include "string_util.h"
-#include "menu.h"
-#include "mail.h"
#include "asm.h"
-#include "rom4.h"
-#include "metatile_behavior.h"
-#include "field_player_avatar.h"
#include "event_data.h"
+#include "field_player_avatar.h"
+#include "field_player_avatar.h"
+#include "item.h"
+#include "mail.h"
#include "map_obj_lock.h"
+#include "menu.h"
+#include "metatile_behavior.h"
+#include "palette.h"
+#include "rom4.h"
#include "script.h"
-#include "field_player_avatar.h"
-#include "sound.h"
#include "songs.h"
+#include "sound.h"
+#include "string_util.h"
+#include "task.h"
+#include "weather.h"
+#include "fieldmap.h"
extern void (* const gExitToOverworldFuncList[])();
extern void (* gUnknown_03005D00)(u8);
@@ -38,6 +39,7 @@ extern u8 GetPlayerDirectionTowardsHiddenItem(s16, s16);
extern void SetPlayerDirectionTowardsItem(u8);
extern void DisplayItemRespondingMessageAndExitItemfinder(u8);
extern void RotatePlayerAndExitItemfinder(u8);
+extern void sub_80C9838(u8, s16, s16);
extern u8 gOtherText_DadsAdvice[];
extern u8 gOtherText_CantGetOffBike[];
@@ -47,15 +49,16 @@ extern u8 gItemFinderDirections[];
extern u16 gScriptItemId;
-bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, int);
+bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId);
void RunItemfinderResults(u8);
void ExitItemfinder(u8);
+void sub_80C9720(u8);
void ExecuteSwitchToOverworldFromItemUse(u8 taskId)
{
u8 taskData;
- if(gScriptItemId == 0xAF)
+ if (gScriptItemId == 0xAF)
taskData = gTasks[taskId].data[15] - 1;
else
taskData = ItemId_GetType(gScriptItemId) - 1;
@@ -67,119 +70,119 @@ void ExecuteSwitchToOverworldFromItemUse(u8 taskId)
void ItemMenu_ConfirmNormalFade(u8 var)
{
- ExecuteSwitchToOverworldFromItemUse(var);
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ ExecuteSwitchToOverworldFromItemUse(var);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
}
void ItemMenu_ConfirmComplexFade(u8 var)
{
- ExecuteSwitchToOverworldFromItemUse(var);
- fade_screen(1, 0);
+ ExecuteSwitchToOverworldFromItemUse(var);
+ fade_screen(1, 0);
}
void SetUpItemUseOnFieldCallback(u8 taskId)
{
- if(gTasks[taskId].data[2] != 1)
- {
- gUnknown_0300485C = (void *)ExecuteItemUseFromBlackPalette;
- ItemMenu_ConfirmNormalFade(taskId);
- }
- else
- gUnknown_03005D00(taskId);
+ if (gTasks[taskId].data[2] != 1)
+ {
+ gUnknown_0300485C = (void *)ExecuteItemUseFromBlackPalette;
+ ItemMenu_ConfirmNormalFade(taskId);
+ }
+ else
+ gUnknown_03005D00(taskId);
}
-void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *var3)
+void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text)
{
- StringExpandPlaceholders(gStringVar4, var3);
-
- 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;
- }
+ StringExpandPlaceholders(gStringVar4, 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;
+ }
}
void DisplayDadsAdviceCannotUseItemMessage(u8 var1, u8 playerMenuStatus)
{
- HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_DadsAdvice);
+ HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_DadsAdvice);
}
void DisplayCantGetOffBikeItemMessage(u8 var1, u8 playerMenuStatus)
{
- HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_CantGetOffBike);
+ HandleDeniedItemUseMessage(var1, playerMenuStatus, gOtherText_CantGetOffBike);
}
u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId)
{
- if(ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM)
- return 1;
- else if(ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone)
- return 2;
- else
- return 0;
+ if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM)
+ return 1;
+ else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone)
+ return 2;
+ else
+ return 0;
}
void ItemMenu_ReadMail(u8 taskId)
{
- struct MailStruct mailStruct;
+ struct MailStruct mailStruct;
- if(!gPaletteFade.active)
- {
- mailStruct.itemId = gScriptItemId;
- HandleReadMail(&mailStruct, sub_80A5D04, 0);
- DestroyTask(taskId);
- }
+ if (!gPaletteFade.active)
+ {
+ mailStruct.itemId = gScriptItemId;
+ HandleReadMail(&mailStruct, sub_80A5D04, 0);
+ DestroyTask(taskId);
+ }
}
void ItemUseOutOfBattle_Mail(u8 taskId)
{
- BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
- gTasks[taskId].func = ItemMenu_ReadMail;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = ItemMenu_ReadMail;
}
void ItemUseOutOfBattle_Bike(u8 taskId)
{
- s16 x, y;
- u8 tileBehavior;
-
- PlayerGetDestCoords(&x, &y);
- tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
-
- if(FlagGet(SYS_CYCLING_ROAD) == TRUE // on cycling road?
- || MetatileBehavior_IsVerticalRail(tileBehavior) == TRUE
- || MetatileBehavior_IsHorizontalRail(tileBehavior) == TRUE
- || MetatileBehavior_IsIsolatedVerticalRail(tileBehavior) == TRUE
- || MetatileBehavior_IsIsolatedHorizontalRail(tileBehavior) == TRUE)
- {
- DisplayCantGetOffBikeItemMessage(taskId, gTasks[taskId].data[2]);
- }
- else
- {
- if(IsBikingAllowedByMap() == TRUE && IsBikingDisallowedByPlayer() == FALSE)
- {
- gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Bike;
- SetUpItemUseOnFieldCallback(taskId);
- }
- else
- DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]);
- }
+ s16 x, y;
+ u8 tileBehavior;
+
+ PlayerGetDestCoords(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (FlagGet(SYS_CYCLING_ROAD) == TRUE // on cycling road?
+ || MetatileBehavior_IsVerticalRail(tileBehavior) == TRUE
+ || MetatileBehavior_IsHorizontalRail(tileBehavior) == TRUE
+ || MetatileBehavior_IsIsolatedVerticalRail(tileBehavior) == TRUE
+ || MetatileBehavior_IsIsolatedHorizontalRail(tileBehavior) == TRUE)
+ {
+ DisplayCantGetOffBikeItemMessage(taskId, gTasks[taskId].data[2]);
+ }
+ else
+ {
+ if (IsBikingAllowedByMap() == TRUE && IsBikingDisallowedByPlayer() == FALSE)
+ {
+ gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Bike;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]);
+ }
}
void ItemUseOnFieldCB_Bike(u8 taskId)
{
- if(ItemId_GetSecondaryId(gScriptItemId) == 0)
- GetOnOffBike(2);
- if(ItemId_GetSecondaryId(gScriptItemId) == 1)
- GetOnOffBike(4);
-
- sub_8064E2C();
- ScriptContext2_Disable();
- DestroyTask(taskId);
+ if (ItemId_GetSecondaryId(gScriptItemId) == 0)
+ GetOnOffBike(2);
+ if (ItemId_GetSecondaryId(gScriptItemId) == 1)
+ GetOnOffBike(4);
+
+ sub_8064E2C();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
}
bool32 CanFish(void)
@@ -214,31 +217,31 @@ bool32 CanFish(void)
void ItemUseOutOfBattle_Rod(u8 taskId)
{
- if(CanFish() == TRUE)
- {
- gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Rod;
- SetUpItemUseOnFieldCallback(taskId);
- }
- else
- DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]);
+ if (CanFish() == TRUE)
+ {
+ gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Rod;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]);
}
void ItemUseOnFieldCB_Rod(u8 taskId)
{
- StartFishing(ItemId_GetSecondaryId(gScriptItemId));
- DestroyTask(taskId);
+ StartFishing(ItemId_GetSecondaryId(gScriptItemId));
+ DestroyTask(taskId);
}
void ItemUseOutOfBattle_Itemfinder(u8 var)
{
- IncrementGameStat(0x27);
- gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder;
- SetUpItemUseOnFieldCallback(var);
+ IncrementGameStat(0x27);
+ gUnknown_03005D00 = (void *)ItemUseOnFieldCB_Itemfinder;
+ SetUpItemUseOnFieldCallback(var);
}
void ItemUseOnFieldCB_Itemfinder(u8 taskId)
{
- if(ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE)
+ if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE)
gTasks[taskId].func = RunItemfinderResults;
else
DisplayItemMessageOnField(taskId, gOtherText_NoResponse, ExitItemfinder, 0);
@@ -247,16 +250,16 @@ void ItemUseOnFieldCB_Itemfinder(u8 taskId)
void RunItemfinderResults(u8 taskId)
{
u8 playerDir;
- u8 playerDirToItem;
+ u8 playerDirToItem;
u8 i;
s16 *data = gTasks[taskId].data;
- if(!data[3])
+ if (!data[3])
{
- if(data[4] == 4)
+ if (data[4] == 4)
{
playerDirToItem = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]);
- if(playerDirToItem)
+ if (playerDirToItem)
{
SetPlayerDirectionTowardsItem(gItemFinderDirections[playerDirToItem - 1]);
gTasks[taskId].func = DisplayItemRespondingMessageAndExitItemfinder;
@@ -265,7 +268,7 @@ void RunItemfinderResults(u8 taskId)
{
playerDir = player_get_direction_lower_nybble();
- // rotate player clockwise depending on current direction.
+ // rotate player clockwise depending on current direction.
for (i = 0; i < 4; i++)
if (playerDir == gItemFinderDirections[i])
data[5] = (i + 1) & 3;
@@ -274,7 +277,7 @@ void RunItemfinderResults(u8 taskId)
data[3] = 0;
data[2] = 0;
}
- return;
+ return;
}
PlaySE(SE_DAUGI); // play the itemfinder jingle 4 times before executing the itemfinder.
data[4]++;
@@ -284,131 +287,102 @@ void RunItemfinderResults(u8 taskId)
void ExitItemfinder(u8 taskId)
{
- MenuZeroFillWindowRect(0, 14, 29, 19);
- sub_8064E2C();
- ScriptContext2_Disable();
- DestroyTask(taskId);
+ MenuZeroFillWindowRect(0, 14, 29, 19);
+ sub_8064E2C();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
}
-// too much struct math.
-__attribute__((naked))
-bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, int var)
+bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId)
{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- sub sp, 0x4\n\
- adds r5, r0, 0\n\
- lsls r1, 24\n\
- lsrs r6, r1, 24\n\
- mov r4, sp\n\
- adds r4, 0x2\n\
- mov r0, sp\n\
- adds r1, r4, 0\n\
- bl PlayerGetDestCoords\n\
- ldr r1, _080C9618 @ =gTasks\n\
- lsls r0, r6, 2\n\
- adds r0, r6\n\
- lsls r0, 3\n\
- adds r0, r1\n\
- movs r1, 0\n\
- strh r1, [r0, 0xC]\n\
- movs r3, 0\n\
- mov r9, r4\n\
- ldrb r0, [r5, 0x3]\n\
- cmp r3, r0\n\
- bge _080C95FC\n\
- subs r1, 0x5\n\
- mov r8, r1\n\
-_080C9580:\n\
- lsls r3, 16\n\
- asrs r1, r3, 16\n\
- ldr r2, [r5, 0x10]\n\
- lsls r0, r1, 1\n\
- adds r0, r1\n\
- lsls r4, r0, 2\n\
- adds r1, r4, r2\n\
- ldrb r0, [r1, 0x5]\n\
- adds r7, r3, 0\n\
- cmp r0, 0x7\n\
- bne _080C95EC\n\
- movs r2, 0x96\n\
- lsls r2, 2\n\
- adds r0, r2, 0\n\
- ldrh r1, [r1, 0xA]\n\
- adds r0, r1\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- bl FlagGet\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _080C95EC\n\
- ldr r1, [r5, 0x10]\n\
- adds r1, r4, r1\n\
- ldrh r2, [r1]\n\
- adds r2, 0x7\n\
- mov r0, sp\n\
- ldrh r0, [r0]\n\
- subs r2, r0\n\
- ldrh r0, [r1, 0x2]\n\
- adds r0, 0x7\n\
- mov r3, r9\n\
- ldrh r1, [r3]\n\
- subs r0, r1\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- lsls r2, 16\n\
- asrs r1, r2, 16\n\
- movs r3, 0xE0\n\
- lsls r3, 11\n\
- adds r2, r3\n\
- lsrs r2, 16\n\
- cmp r2, 0xE\n\
- bhi _080C95EC\n\
- lsls r0, 16\n\
- asrs r2, r0, 16\n\
- cmp r2, r8\n\
- blt _080C95EC\n\
- cmp r2, 0x5\n\
- bgt _080C95EC\n\
- adds r0, r6, 0\n\
- bl sub_80C9838\n\
-_080C95EC:\n\
- movs r1, 0x80\n\
- lsls r1, 9\n\
- adds r0, r7, r1\n\
- lsrs r3, r0, 16\n\
- asrs r0, 16\n\
- ldrb r2, [r5, 0x3]\n\
- cmp r0, r2\n\
- blt _080C9580\n\
-_080C95FC:\n\
- adds r0, r6, 0\n\
- bl sub_80C9720\n\
- ldr r0, _080C9618 @ =gTasks\n\
- lsls r1, r6, 2\n\
- adds r1, r6\n\
- lsls r1, 3\n\
- adds r1, r0\n\
- movs r3, 0xC\n\
- ldrsh r0, [r1, r3]\n\
- cmp r0, 0x1\n\
- beq _080C961C\n\
- movs r0, 0\n\
- b _080C961E\n\
- .align 2, 0\n\
-_080C9618: .4byte gTasks\n\
-_080C961C:\n\
- movs r0, 0x1\n\
-_080C961E:\n\
- add sp, 0x4\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .syntax divided");
+ int distanceX, distanceY;
+ u16 x, y;
+ s16 newDistanceX, newDistanceY, i;
+
+ PlayerGetDestCoords(&x, &y);
+ gTasks[taskId].data[2] = FALSE;
+
+ for (i = 0; i < events->bgEventCount; i++)
+ {
+ if ((events -> bgEvents[i].kind == 7) && !FlagGet(events -> bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 600))
+ {
+ // do a distance lookup of each item so long as the index remains less than the objects on the current map.
+ distanceX = (u16)events -> bgEvents[i].x + 7;
+ newDistanceX = distanceX - x;
+ distanceY = (u16)events -> bgEvents[i].y + 7;
+ newDistanceY = distanceY - y;
+
+ // is item in range?
+ if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6))
+ sub_80C9838(taskId, newDistanceX, newDistanceY); // send coordinates of the item relative to the player
+ }
+ }
+ sub_80C9720(taskId);
+
+ // hidden item detected?
+ if(gTasks[taskId].data[2] == TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 HiddenItemAtPos(struct MapEvents *events, s16 x, s16 y)
+{
+ u8 bgEventCount = events->bgEventCount;
+ struct BgEvent *bgEvent = events->bgEvents;
+ int i;
+
+ for(i = 0; i < bgEventCount; i++)
+ {
+ if(bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed?
+ {
+ if(!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + 600))
+ return TRUE;
+ else
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+bool8 sub_80C9688(struct MapConnection *connection, int x, int y)
+{
+ struct MapHeader *mapHeader;
+ u16 localX, localY;
+ u32 localOffset;
+ s32 localLength;
+
+ mapHeader = mapconnection_get_mapheader(connection);
+
+ 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;
+ }
+ return HiddenItemAtPos(mapHeader->events, localX, localY);
}
diff --git a/src/libc.c b/src/libc.c
index 370981878..920673e3e 100644
--- a/src/libc.c
+++ b/src/libc.c
@@ -19,13 +19,13 @@ void *memcpy(void *dst0, const void *src0, size_t len0)
// If the size is small, or either src or dst is unaligned,
// then go to the byte copy loop. This should be rare.
- if(len >= 16 && !(UNALIGNED(src) | UNALIGNED(dst)))
+ if (len >= 16 && !(UNALIGNED(src) | UNALIGNED(dst)))
{
aligned_dst = (long *)dst;
aligned_src = (long *)src;
// Copy 4X long words at a time if possible.
- while(len >= 16)
+ while (len >= 16)
{
*aligned_dst++ = *aligned_src++;
*aligned_dst++ = *aligned_src++;
@@ -35,7 +35,7 @@ void *memcpy(void *dst0, const void *src0, size_t len0)
}
// Copy one long word at a time if possible
- while(len >= 4)
+ while (len >= 4)
{
*aligned_dst++ = *aligned_src++;
len -= 4;
@@ -46,7 +46,7 @@ void *memcpy(void *dst0, const void *src0, size_t len0)
}
// Pick up any remaining bytes with a byte copier.
- while(len--)
+ while (len--)
*dst++ = *src++;
return dst0;
@@ -62,7 +62,7 @@ void *memset(void *m, int c, size_t n)
// If the size is small or m is unaligned,
// then go to the byte copy loop. This should be rare.
- if(n >= LBLOCKSIZE && !UNALIGNED(m))
+ if (n >= LBLOCKSIZE && !UNALIGNED(m))
{
// We know that n is large and m is word-aligned.
aligned_addr = (unsigned long *)m;
@@ -70,7 +70,7 @@ void *memset(void *m, int c, size_t n)
// Store C into each char sized location in buffer so that
// we can set large blocks quickly.
c &= 0xFF;
- if(LBLOCKSIZE == 4)
+ if (LBLOCKSIZE == 4)
{
buffer = (c << 8) | c;
buffer |= (buffer << 16);
@@ -78,11 +78,11 @@ void *memset(void *m, int c, size_t n)
else
{
buffer = 0;
- for(i = 0; i < LBLOCKSIZE; i++)
+ for (i = 0; i < LBLOCKSIZE; i++)
buffer = (buffer << 8) | c;
}
- while(n >= LBLOCKSIZE * 4)
+ while (n >= LBLOCKSIZE * 4)
{
*aligned_addr++ = buffer;
*aligned_addr++ = buffer;
@@ -90,7 +90,7 @@ void *memset(void *m, int c, size_t n)
*aligned_addr++ = buffer;
n -= LBLOCKSIZE * 4;
}
- while(n >= LBLOCKSIZE)
+ while (n >= LBLOCKSIZE)
{
*aligned_addr++ = buffer;
n -= LBLOCKSIZE;
@@ -100,7 +100,7 @@ void *memset(void *m, int c, size_t n)
}
// Pick up the remainder with a bytewise loop.
- while(n--)
+ while (n--)
*s++ = (char)c;
return m;
@@ -112,16 +112,16 @@ int strcmp(const char *s1, const char *s2)
unsigned long *a2;
// If s1 or s2 are unaligned, then skip this and compare bytes.
- if(!(UNALIGNED(s1) | UNALIGNED(s2)))
+ if (!(UNALIGNED(s1) | UNALIGNED(s2)))
{
// Compare them a word at a time.
a1 = (unsigned long *)s1;
a2 = (unsigned long *)s2;
- while(*a1 == *a2)
+ while (*a1 == *a2)
{
// If *a1 == *a2, and we find a null in *a1,
// then the strings must be equal, so return zero.
- if(CONTAINSNULL(*a1))
+ if (CONTAINSNULL(*a1))
return 0;
a1++;
@@ -133,7 +133,7 @@ int strcmp(const char *s1, const char *s2)
}
// Check the remaining few bytes.
- while(*s1 != '\0' && *s1 == *s2)
+ while (*s1 != '\0' && *s1 == *s2)
{
s1++;
s2++;
diff --git a/src/link.c b/src/link.c
index 7b4625bfd..783f6aecd 100644
--- a/src/link.c
+++ b/src/link.c
@@ -1,17 +1,17 @@
#include "global.h"
#include "link.h"
#include "asm.h"
+#include "battle.h"
#include "main.h"
-#include "task.h"
-#include "text.h"
-#include "sprite.h"
-#include "songs.h"
+#include "menu.h"
#include "palette.h"
#include "rng.h"
-#include "menu.h"
-#include "sound.h"
#include "save.h"
-#include "battle.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "text.h"
#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT)
@@ -155,21 +155,21 @@ EWRAM_DATA u32 gFiller_20238B8 = {0};
EWRAM_DATA u32 dword_20238BC = {0};
EWRAM_DATA bool8 gLinkOpen = {0};
-#include "link/digit_palette.h"
-#include "link/digit_tiles.h"
+static const u16 sLinkTestDigitPalette[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal");
+static const u32 sLinkTestDigitTiles[] = INCBIN_U32("graphics/interface/link_test_digits.4bpp");
static const u8 sDebugMessages[7][12] =
{
- _"せつぞく ちゅうです",
- _"せつぞく できません",
- _"かくにん ちゅうです",
- _"かくにん できました",
- _"かくにん できません",
- _"かくにん を かくにん",
- _"かくにん は しっぱい",
+ _("せつぞく ちゅうです"),
+ _("せつぞく できません"),
+ _("かくにん ちゅうです"),
+ _("かくにん できました"),
+ _("かくにん できません"),
+ _("かくにん を かくにん"),
+ _("かくにん は しっぱい"),
};
-static const u8 sColorCodes[] = _"{HIGHLIGHT TRANSPARENT}{COLOR WHITE2}";
+static const u8 sColorCodes[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE2}");
static const u32 sBlockRequestLookupTable[5 * 2] =
{
@@ -180,11 +180,11 @@ static const u32 sBlockRequestLookupTable[5 * 2] =
(u32)gBlockSendBuffer, 40,
};
-static const u8 sTestString[] = _"テストな";
+static const u8 sTestString[] = _("テストな");
ALIGNED(4) static const u8 sMagic[] = "GameFreak inc.";
-ALIGNED(4) static const u8 sEmptyString[] = _"";
+ALIGNED(4) static const u8 sEmptyString[] = _("");
void Task_DestroySelf(u8 taskId)
{
@@ -402,7 +402,7 @@ static void LinkTestProcessKeyInput(void)
if (gMain.newKeys & START_BUTTON)
SetSuppressLinkErrorMessage(TRUE);
if (gMain.newKeys & R_BUTTON)
- sub_8125D44(1);
+ TrySavingData(LINK_SAVE);
if (gMain.newKeys & SELECT_BUTTON)
sub_800832C();
if (gLinkTestDebugValuesEnabled)
@@ -475,8 +475,8 @@ static void ProcessRecvCmds(u8 unusedParam)
case 0x2222:
InitLocalLinkPlayer();
localLinkPlayerBlock.linkPlayer = localLinkPlayer;
- memcpy(localLinkPlayerBlock.magic1, sMagic, 15);
- memcpy(localLinkPlayerBlock.magic2, sMagic, 15);
+ memcpy(localLinkPlayerBlock.magic1, sMagic, sizeof(localLinkPlayerBlock.magic1) - 1);
+ memcpy(localLinkPlayerBlock.magic2, sMagic, sizeof(localLinkPlayerBlock.magic2) - 1);
InitBlockSend(&localLinkPlayerBlock, sizeof(localLinkPlayerBlock));
break;
case 0x5555:
diff --git a/src/load_save.c b/src/load_save.c
index 5babb843e..0add1b0e3 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "gba/flash_internal.h"
#include "load_save.h"
#include "asm.h"
#include "main.h"
@@ -6,7 +7,8 @@
#include "rom4.h"
extern u8 gPlayerPartyCount;
-extern u32 gUnknown_3004820;
+
+bool32 gFlashMemoryPresent;
struct LoadedSaveData
{
@@ -22,13 +24,13 @@ extern struct LoadedSaveData gLoadedSaveData[];
void CheckForFlashMemory(void)
{
- if(!IdentifyFlash())
+ if (!IdentifyFlash())
{
- gUnknown_3004820 = 1;
+ gFlashMemoryPresent = TRUE;
InitFlashTimer();
}
else
- gUnknown_3004820 = 0;
+ gFlashMemoryPresent = FALSE;
}
bool32 GetSecretBase2Field_9(void)
@@ -80,16 +82,16 @@ void LoadPlayerParty(void)
static void SaveMapObjects(void)
{
int i;
-
- for(i = 0; i < 16; i++)
+
+ for (i = 0; i < 16; i++)
gSaveBlock1.mapObjects[i] = gMapObjects[i];
}
static void LoadMapObjects(void)
{
int i;
-
- for(i = 0; i < 16; i++)
+
+ for (i = 0; i < 16; i++)
gMapObjects[i] = gSaveBlock1.mapObjects[i];
}
@@ -110,27 +112,27 @@ void LoadPlayerBag(void)
int i;
// load player items.
- for(i = 0; i < 20; i++)
+ for (i = 0; i < 20; i++)
gLoadedSaveData->items[i] = gSaveBlock1.bagPocket_Items[i];
// load player key items.
- for(i = 0; i < 20; i++)
+ for (i = 0; i < 20; i++)
gLoadedSaveData->keyItems[i] = gSaveBlock1.bagPocket_KeyItems[i];
// load player pokeballs.
- for(i = 0; i < 16; i++)
+ for (i = 0; i < 16; i++)
gLoadedSaveData->pokeBalls[i] = gSaveBlock1.bagPocket_PokeBalls[i];
// load player TMs and HMs.
- for(i = 0; i < 64; i++)
+ for (i = 0; i < 64; i++)
gLoadedSaveData->TMsHMs[i] = gSaveBlock1.bagPocket_TMHM[i];
// load player berries.
- for(i = 0; i < 46; i++)
+ for (i = 0; i < 46; i++)
gLoadedSaveData->berries[i] = gSaveBlock1.bagPocket_Berries[i];
// load mail.
- for(i = 0; i < 16; i++)
+ for (i = 0; i < 16; i++)
gLoadedSaveData->mail[i] = gSaveBlock1.mail[i];
}
@@ -139,26 +141,26 @@ void SavePlayerBag(void)
int i;
// save player items.
- for(i = 0; i < 20; i++)
+ for (i = 0; i < 20; i++)
gSaveBlock1.bagPocket_Items[i] = gLoadedSaveData->items[i];
// save player key items.
- for(i = 0; i < 20; i++)
+ for (i = 0; i < 20; i++)
gSaveBlock1.bagPocket_KeyItems[i] = gLoadedSaveData->keyItems[i];
// save player pokeballs.
- for(i = 0; i < 16; i++)
+ for (i = 0; i < 16; i++)
gSaveBlock1.bagPocket_PokeBalls[i] = gLoadedSaveData->pokeBalls[i];
// save player TMs and HMs.
- for(i = 0; i < 64; i++)
+ for (i = 0; i < 64; i++)
gSaveBlock1.bagPocket_TMHM[i] = gLoadedSaveData->TMsHMs[i];
// save player berries.
- for(i = 0; i < 46; i++)
+ for (i = 0; i < 46; i++)
gSaveBlock1.bagPocket_Berries[i] = gLoadedSaveData->berries[i];
// save mail.
- for(i = 0; i < 16; i++)
+ for (i = 0; i < 16; i++)
gSaveBlock1.mail[i] = gLoadedSaveData->mail[i];
}
diff --git a/src/lottery_corner.c b/src/lottery_corner.c
index c18aeef48..66e1238ef 100644
--- a/src/lottery_corner.c
+++ b/src/lottery_corner.c
@@ -1,10 +1,11 @@
#include "global.h"
#include "lottery_corner.h"
-#include "rng.h"
-#include "string_util.h"
#include "event_data.h"
-#include "species.h"
#include "items.h"
+#include "rng.h"
+#include "species.h"
+#include "string_util.h"
+#include "text.h"
extern u16 gScriptResult;
extern u16 gSpecialVar_0x8004;
@@ -36,11 +37,11 @@ void ResetLotteryCorner(void)
void SetRandomLotteryNumber(u16 i)
{
u32 var = Random();
-
- while(--i != 0xFFFF)
+
+ while (--i != 0xFFFF)
var = var * 1103515245 + 12345;
- SetLotteryNumber(var);
+ SetLotteryNumber(var);
}
void RetrieveLotteryNumber(void)
@@ -55,24 +56,24 @@ void PickLotteryCornerTicket(void)
u16 j;
u32 box;
u32 slot;
-
+
gSpecialVar_0x8004 = 0;
slot = 0;
box = 0;
- for(i = 0; i < 6; i++)
+ for (i = 0; i < 6; i++)
{
struct Pokemon *pkmn = &gPlayerParty[i];
-
+
// UB: Too few arguments for function GetMonData
- if(GetMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE)
+ if (GetMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE)
{
// do not calculate ticket values for eggs.
- if(!GetMonData(pkmn, MON_DATA_IS_EGG))
+ if (!GetMonData(pkmn, MON_DATA_IS_EGG))
{
u32 otId = GetMonData(pkmn, MON_DATA_OT_ID);
u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId);
-
- if(numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1)
+
+ if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1)
{
gSpecialVar_0x8004 = numMatchingDigits - 1;
box = 14;
@@ -83,23 +84,23 @@ void PickLotteryCornerTicket(void)
else // pokemon are always arranged from populated spots first to unpopulated, so the moment a NONE species is found, that's the end of the list.
break;
}
-
+
// player has 14 boxes.
- for(i = 0; i < 14; i++)
+ for (i = 0; i < 14; i++)
{
// player has 30 slots per box.
- for(j = 0; j < 30; j++)
+ for (j = 0; j < 30; j++)
{
struct BoxPokemon *pkmn = &gPokemonStorage.boxes[i][j];
-
+
// UB: Too few arguments for function GetMonData
- if(GetBoxMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE &&
+ if (GetBoxMonData(pkmn, MON_DATA_SPECIES) != SPECIES_NONE &&
!GetBoxMonData(pkmn, MON_DATA_IS_EGG))
{
u32 otId = GetBoxMonData(pkmn, MON_DATA_OT_ID);
u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId);
-
- if(numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1)
+
+ if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1)
{
gSpecialVar_0x8004 = numMatchingDigits - 1;
box = i;
@@ -108,12 +109,12 @@ void PickLotteryCornerTicket(void)
}
}
}
-
- if(gSpecialVar_0x8004 != 0)
+
+ if (gSpecialVar_0x8004 != 0)
{
gSpecialVar_0x8005 = sLotteryPrizes[gSpecialVar_0x8004 - 1];
-
- if(box == 14)
+
+ if (box == 14)
{
gSpecialVar_0x8006 = 0;
GetMonData(&gPlayerParty[slot], MON_DATA_NICKNAME, gStringVar1);
@@ -131,13 +132,13 @@ static u8 GetMatchingDigits(u16 winNumber, u16 otId)
{
u8 i;
u8 matchingDigits = 0;
-
- for(i = 0; i < 5; i++)
+
+ for (i = 0; i < 5; i++)
{
sWinNumberDigit = winNumber % 10;
sOtIdDigit = otId % 10;
-
- if(sWinNumberDigit == sOtIdDigit)
+
+ if (sWinNumberDigit == sOtIdDigit)
{
winNumber = winNumber / 10;
otId = otId / 10;
@@ -163,7 +164,7 @@ u32 GetLotteryNumber(void)
{
u16 highNum = VarGet(VAR_POKELOT_RND1);
u16 lowNum = VarGet(VAR_POKELOT_RND2);
-
+
return (lowNum << 16) | highNum;
}
diff --git a/src/mail.c b/src/mail.c
index 6cff514a1..97c8dab5b 100644
--- a/src/mail.c
+++ b/src/mail.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "mail.h"
#include "asm.h"
+#include "items.h"
#include "menu.h"
#include "palette.h"
#include "rom4.h"
@@ -8,7 +9,7 @@
#include "string_util.h"
#include "task.h"
#include "text.h"
-#include "items.h"
+#include "name_string_util.h"
struct UnkMailStruct
{
@@ -17,7 +18,8 @@ struct UnkMailStruct
u8 unk_0_4:4;
};
-struct MailLayout {
+struct MailLayout
+{
u8 var0;
u8 var1;
u8 var2;
@@ -26,28 +28,30 @@ struct MailLayout {
struct UnkMailStruct *var4;
};
-struct Unk2000000 {
- /* 0x00 */ u8 words[8][27];
- /* 0xEC */ u8 varD8[20];
- /* 0xEC */ MainCallback varEC;
- /* 0xF0 */ MainCallback varF0;
- /* 0xFF */ struct MailStruct *varF4;
- /* 0xF8 */ u8 varF8;
- /* 0xF9 */ u8 varF9;
- /* 0xFA */ u8 varFA;
- /* 0xFB */ u8 varFB;
- /* 0xFC */ u8 varFC;
+struct Unk2000000
+{
+ /* 0x00*/ u8 words[8][27];
+ /* 0xEC*/ u8 varD8[20];
+ /* 0xEC*/ MainCallback varEC;
+ /* 0xF0*/ MainCallback varF0;
+ /* 0xFF*/ struct MailStruct *varF4;
+ /* 0xF8*/ u8 varF8;
+ /* 0xF9*/ u8 varF9;
+ /* 0xFA*/ u8 varFA;
+ /* 0xFB*/ u8 varFB;
+ /* 0xFC*/ u8 varFC;
u8 padFD[1];
- /* 0xFE */ u8 varFE;
- /* 0xFF */ u8 varFF;
- /* 0x100 */ u8 var100;
+ /* 0xFE*/ u8 varFE;
+ /* 0xFF*/ u8 varFF;
+ /*0x100*/ u8 var100;
u8 pad101[3];
- /* 0x104 */ MainCallback var104;
- /* 0x108 */ MainCallback var108;
- /* 0x10C */ struct MailLayout *var10C;
+ /*0x104*/ MainCallback var104;
+ /*0x108*/ MainCallback var108;
+ /*0x10C*/ struct MailLayout *var10C;
};
-struct MailGraphics {
+struct MailGraphics
+{
u16 (*palette)[];
u8 (*tiles)[];
u8 (*tileMap)[];
@@ -78,7 +82,8 @@ static void sub_80F8F78(void);
static void sub_80F8FB4(void);
#ifdef NONMATCHING
-void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) {
+void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2)
+{
u16 mailDesign;
u8 buffer[4];
u8 local1;
@@ -87,44 +92,52 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) {
// Compiler uses [sub 1], while asm uses [ptr + FE]
unk_2000000.varFE = 1;
- unk_2000000.var104 = (MainCallback) sub_80EB3FC;
- unk_2000000.var108 = (MainCallback) ConvertEasyChatWordsToString;
+ unk_2000000.var104 = (MainCallback)sub_80EB3FC;
+ unk_2000000.var108 = (MainCallback)ConvertEasyChatWordsToString;
mailDesign = arg0->itemId - ITEM_ORANGE_MAIL;
- if (mailDesign <= 11) {
+ if (mailDesign <= 11)
+ {
unk_2000000.varFA = arg0->itemId - ITEM_ORANGE_MAIL;
- } else {
+ }
+ else
+ {
unk_2000000.varFA = 0;
arg2 = FALSE;
}
- switch (unk_2000000.var100) {
- case 0:
- default:
- unk_2000000.var10C = &gUnknown_083E5730[unk_2000000.varFA];
- break;
+ switch (unk_2000000.var100)
+ {
+ case 0:
+ default:
+ unk_2000000.var10C = &gUnknown_083E5730[unk_2000000.varFA];
+ break;
- case 1:
- unk_2000000.var10C = &gUnknown_083E57A4[unk_2000000.varFA];
- break;
+ case 1:
+ unk_2000000.var10C = &gUnknown_083E57A4[unk_2000000.varFA];
+ break;
}
- if (((sub_80A2D64(arg0->species, buffer) << 16) +0xFFFF0000) <= (410 << 16)) {
- switch (unk_2000000.varFA) {
- case 6:
- unk_2000000.varFB = 1;
- break;
+ if (((sub_80A2D64(arg0->species, buffer) << 16) + 0xFFFF0000) <= (410 << 16))
+ {
+ switch (unk_2000000.varFA)
+ {
+ case 6:
+ unk_2000000.varFB = 1;
+ break;
- case 9:
- unk_2000000.varFB = 2;
- break;
+ case 9:
+ unk_2000000.varFB = 2;
+ break;
- default:
- unk_2000000.varFB = 0;
- break;
+ default:
+ unk_2000000.varFB = 0;
+ break;
}
- } else {
+ }
+ else
+ {
unk_2000000.varFB = 0;
}
@@ -137,146 +150,147 @@ void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) {
}
#else
__attribute__((naked))
-void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2) {
+void HandleReadMail(struct MailStruct *arg0, MainCallback arg1, bool8 arg2)
+{
asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- sub sp, 0x4\n\
- adds r4, r0, 0\n\
- adds r6, r1, 0\n\
- lsls r2, 24\n\
- lsrs r5, r2, 24\n\
- ldr r2, _080F8958 @ =0x02000000\n\
- adds r1, r2, 0\n\
- adds r1, 0xFF\n\
- movs r0, 0x2\n\
- strb r0, [r1]\n\
- adds r0, 0xFE\n\
- adds r1, r2, r0\n\
- movs r0, 0x1\n\
- strb r0, [r1]\n\
- movs r0, 0x82\n\
- lsls r0, 1\n\
- adds r1, r2, r0\n\
- ldr r0, _080F895C @ =sub_80EB3FC\n\
- str r0, [r1]\n\
- movs r0, 0x84\n\
- lsls r0, 1\n\
- adds r1, r2, r0\n\
- ldr r0, _080F8960 @ =ConvertEasyChatWordsToString\n\
- str r0, [r1]\n\
- ldrh r1, [r4, 0x20]\n\
- adds r0, r1, 0\n\
- subs r0, 0x79\n\
- lsls r0, 16\n\
- lsrs r0, 16\n\
- cmp r0, 0xB\n\
- bhi _080F8964\n\
- subs r1, 0x79\n\
- adds r0, r2, 0\n\
- adds r0, 0xFA\n\
- strb r1, [r0]\n\
- b _080F896E\n\
- .align 2, 0\n\
+ push {r4-r6,lr}\n\
+ sub sp, 0x4\n\
+ adds r4, r0, 0\n\
+ adds r6, r1, 0\n\
+ lsls r2, 24\n\
+ lsrs r5, r2, 24\n\
+ ldr r2, _080F8958 @ =0x02000000\n\
+ adds r1, r2, 0\n\
+ adds r1, 0xFF\n\
+ movs r0, 0x2\n\
+ strb r0, [r1]\n\
+ adds r0, 0xFE\n\
+ adds r1, r2, r0\n\
+ movs r0, 0x1\n\
+ strb r0, [r1]\n\
+ movs r0, 0x82\n\
+ lsls r0, 1\n\
+ adds r1, r2, r0\n\
+ ldr r0, _080F895C @ =sub_80EB3FC\n\
+ str r0, [r1]\n\
+ movs r0, 0x84\n\
+ lsls r0, 1\n\
+ adds r1, r2, r0\n\
+ ldr r0, _080F8960 @ =ConvertEasyChatWordsToString\n\
+ str r0, [r1]\n\
+ ldrh r1, [r4, 0x20]\n\
+ adds r0, r1, 0\n\
+ subs r0, 0x79\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0xB\n\
+ bhi _080F8964\n\
+ subs r1, 0x79\n\
+ adds r0, r2, 0\n\
+ adds r0, 0xFA\n\
+ strb r1, [r0]\n\
+ b _080F896E\n\
+ .align 2, 0\n\
_080F8958: .4byte 0x02000000\n\
_080F895C: .4byte sub_80EB3FC\n\
_080F8960: .4byte ConvertEasyChatWordsToString\n\
_080F8964:\n\
- adds r1, r2, 0\n\
- adds r1, 0xFA\n\
- movs r0, 0\n\
- strb r0, [r1]\n\
- movs r5, 0\n\
+ adds r1, r2, 0\n\
+ adds r1, 0xFA\n\
+ movs r0, 0\n\
+ strb r0, [r1]\n\
+ movs r5, 0\n\
_080F896E:\n\
- ldr r1, _080F8994 @ =0x02000000\n\
- movs r2, 0x80\n\
- lsls r2, 1\n\
- adds r0, r1, r2\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _080F8980\n\
- cmp r0, 0x1\n\
- beq _080F899C\n\
+ ldr r1, _080F8994 @ =0x02000000\n\
+ movs r2, 0x80\n\
+ lsls r2, 1\n\
+ adds r0, r1, r2\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ beq _080F8980\n\
+ cmp r0, 0x1\n\
+ beq _080F899C\n\
_080F8980:\n\
- movs r0, 0x86\n\
- lsls r0, 1\n\
- adds r2, r1, r0\n\
- adds r0, r1, 0\n\
- adds r0, 0xFA\n\
- ldrb r0, [r0]\n\
- lsls r0, 3\n\
- ldr r1, _080F8998 @ =gUnknown_083E5730\n\
- b _080F89AC\n\
- .align 2, 0\n\
+ movs r0, 0x86\n\
+ lsls r0, 1\n\
+ adds r2, r1, r0\n\
+ adds r0, r1, 0\n\
+ adds r0, 0xFA\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 3\n\
+ ldr r1, _080F8998 @ =gUnknown_083E5730\n\
+ b _080F89AC\n\
+ .align 2, 0\n\
_080F8994: .4byte 0x02000000\n\
_080F8998: .4byte gUnknown_083E5730\n\
_080F899C:\n\
- movs r0, 0x86\n\
- lsls r0, 1\n\
- adds r2, r1, r0\n\
- adds r0, r1, 0\n\
- adds r0, 0xFA\n\
- ldrb r0, [r0]\n\
- lsls r0, 3\n\
- ldr r1, _080F89DC @ =gUnknown_083E57A4\n\
+ movs r0, 0x86\n\
+ lsls r0, 1\n\
+ adds r2, r1, r0\n\
+ adds r0, r1, 0\n\
+ adds r0, 0xFA\n\
+ ldrb r0, [r0]\n\
+ lsls r0, 3\n\
+ ldr r1, _080F89DC @ =gUnknown_083E57A4\n\
_080F89AC:\n\
- adds r0, r1\n\
- str r0, [r2]\n\
- ldrh r0, [r4, 0x1E]\n\
- mov r1, sp\n\
- bl sub_80A2D64\n\
- lsls r0, 16\n\
- ldr r1, _080F89E0 @ =0xffff0000\n\
- adds r0, r1\n\
- movs r1, 0xCD\n\
- lsls r1, 17\n\
- cmp r0, r1\n\
- bhi _080F89F8\n\
- ldr r0, _080F89E4 @ =0x02000000\n\
- adds r1, r0, 0\n\
- adds r1, 0xFA\n\
- ldrb r2, [r1]\n\
- adds r1, r0, 0\n\
- cmp r2, 0x6\n\
- beq _080F89E8\n\
- cmp r2, 0x9\n\
- beq _080F89F0\n\
- b _080F89FA\n\
- .align 2, 0\n\
+ adds r0, r1\n\
+ str r0, [r2]\n\
+ ldrh r0, [r4, 0x1E]\n\
+ mov r1, sp\n\
+ bl sub_80A2D64\n\
+ lsls r0, 16\n\
+ ldr r1, _080F89E0 @ =0xffff0000\n\
+ adds r0, r1\n\
+ movs r1, 0xCD\n\
+ lsls r1, 17\n\
+ cmp r0, r1\n\
+ bhi _080F89F8\n\
+ ldr r0, _080F89E4 @ =0x02000000\n\
+ adds r1, r0, 0\n\
+ adds r1, 0xFA\n\
+ ldrb r2, [r1]\n\
+ adds r1, r0, 0\n\
+ cmp r2, 0x6\n\
+ beq _080F89E8\n\
+ cmp r2, 0x9\n\
+ beq _080F89F0\n\
+ b _080F89FA\n\
+ .align 2, 0\n\
_080F89DC: .4byte gUnknown_083E57A4\n\
_080F89E0: .4byte 0xffff0000\n\
_080F89E4: .4byte 0x02000000\n\
_080F89E8:\n\
- adds r2, r1, 0\n\
- adds r2, 0xFB\n\
- movs r0, 0x1\n\
- b _080F8A00\n\
+ adds r2, r1, 0\n\
+ adds r2, 0xFB\n\
+ movs r0, 0x1\n\
+ b _080F8A00\n\
_080F89F0:\n\
- adds r2, r1, 0\n\
- adds r2, 0xFB\n\
- movs r0, 0x2\n\
- b _080F8A00\n\
+ adds r2, r1, 0\n\
+ adds r2, 0xFB\n\
+ movs r0, 0x2\n\
+ b _080F8A00\n\
_080F89F8:\n\
- ldr r1, _080F8A20 @ =0x02000000\n\
+ ldr r1, _080F8A20 @ =0x02000000\n\
_080F89FA:\n\
- adds r2, r1, 0\n\
- adds r2, 0xFB\n\
- movs r0, 0\n\
+ adds r2, r1, 0\n\
+ adds r2, 0xFB\n\
+ movs r0, 0\n\
_080F8A00:\n\
- strb r0, [r2]\n\
- adds r0, r1, 0\n\
- adds r0, 0xF4\n\
- str r4, [r0]\n\
- subs r0, 0x8\n\
- str r6, [r0]\n\
- adds r0, 0xC\n\
- strb r5, [r0]\n\
- ldr r0, _080F8A24 @ =sub_80F8D50\n\
- bl SetMainCallback2\n\
- add sp, 0x4\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ strb r0, [r2]\n\
+ adds r0, r1, 0\n\
+ adds r0, 0xF4\n\
+ str r4, [r0]\n\
+ subs r0, 0x8\n\
+ str r6, [r0]\n\
+ adds r0, 0xC\n\
+ strb r5, [r0]\n\
+ ldr r0, _080F8A24 @ =sub_80F8D50\n\
+ bl SetMainCallback2\n\
+ add sp, 0x4\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_080F8A20: .4byte 0x02000000\n\
_080F8A24: .4byte sub_80F8D50\n\
.syntax divided\n");
@@ -287,150 +301,162 @@ _080F8A24: .4byte sub_80F8D50\n\
#define RETURN_UP_STATE break
#define RETURN_SKIP_STATE return FALSE
-static u8 sub_80F8A28(void) {
- switch (gMain.state) {
- case 0:
- SetVBlankCallback(NULL);
- remove_some_task();
- REG_DISPCNT = 0;
- RETURN_UP_STATE;
-
- case 1: CpuFill16(0, (void *) OAM, OAM_SIZE);
- RETURN_UP_STATE;
-
- case 2:
- ResetPaletteFade();
- RETURN_UP_STATE;
-
- case 3:
- ResetTasks();
- RETURN_UP_STATE;
-
- case 4:
- ResetSpriteData();
- RETURN_UP_STATE;
-
- case 5:
- FreeAllSpritePalettes();
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BG1HOFS = 0;
- REG_BG1VOFS = 0;
- REG_BG2VOFS = 0;
- REG_BG2HOFS = 0;
- REG_BG3HOFS = 0;
- REG_BG3VOFS = 0;
- REG_BLDCNT = 0;
- REG_BLDALPHA = 0;
- RETURN_UP_STATE;
-
- case 6:
- SetUpWindowConfig(&gWindowConfig_81E6DFC);
- RETURN_UP_STATE;
-
- case 7:
- MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC);
- RETURN_UP_STATE;
+static u8 sub_80F8A28(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ SetVBlankCallback(NULL);
+ remove_some_task();
+ REG_DISPCNT = 0;
+ RETURN_UP_STATE;
+
+ case 1: CpuFill16(0, (void *)OAM, OAM_SIZE);
+ RETURN_UP_STATE;
+
+ case 2:
+ ResetPaletteFade();
+ RETURN_UP_STATE;
+
+ case 3:
+ ResetTasks();
+ RETURN_UP_STATE;
+
+ case 4:
+ ResetSpriteData();
+ RETURN_UP_STATE;
+
+ case 5:
+ FreeAllSpritePalettes();
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ RETURN_UP_STATE;
+
+ case 6:
+ SetUpWindowConfig(&gWindowConfig_81E6DFC);
+ RETURN_UP_STATE;
+
+ case 7:
+ MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC);
+ RETURN_UP_STATE;
+
+ case 8:
+ if (MultistepInitMenuWindowContinue() == 0)
+ {
+ return FALSE;
+ }
+ RETURN_UP_STATE;
- case 8:
- if (MultistepInitMenuWindowContinue() == 0) {
- return FALSE;
- }
- RETURN_UP_STATE;
+ case 9:
+ MenuZeroFillScreen();
+ RETURN_UP_STATE;
- case 9:
- MenuZeroFillScreen();
- RETURN_UP_STATE;
+ case 10: CpuFill16(1, (void *)(VRAM + 0x4800), 0x800);
+ RETURN_UP_STATE;
- case 10: CpuFill16(1, (void *) (VRAM + 0x4800), 0x800);
- RETURN_UP_STATE;
+ case 11:
+ LoadPalette(gMailGraphicsTable[unk_2000000.varFA].palette, 0, 16 * 2);
+ RETURN_UP_STATE;
- case 11:
- LoadPalette(gMailGraphicsTable[unk_2000000.varFA].palette, 0, 16 * 2);
- RETURN_UP_STATE;
+ case 12:
+ LZ77UnCompVram(gMailGraphicsTable[unk_2000000.varFA].tileMap, (void *)(VRAM + 0x4000));
+ RETURN_UP_STATE;
- case 12:
- LZ77UnCompVram(gMailGraphicsTable[unk_2000000.varFA].tileMap, (void *) (VRAM + 0x4000));
- RETURN_UP_STATE;
+ case 13:
+ LZ77UnCompVram(gMailGraphicsTable[unk_2000000.varFA].tiles, (void *)(VRAM));
- case 13:
- LZ77UnCompVram(gMailGraphicsTable[unk_2000000.varFA].tiles, (void *) (VRAM));
+ gPlttBufferUnfaded[241] = gMailGraphicsTable[unk_2000000.varFA].color10;
+ gPlttBufferUnfaded[248] = gMailGraphicsTable[unk_2000000.varFA].color12;
+ gPlttBufferUnfaded[10] = gUnknown_083E562C[gSaveBlock2.playerGender][0];
+ gPlttBufferUnfaded[11] = gUnknown_083E562C[gSaveBlock2.playerGender][1];
+ RETURN_UP_STATE;
- gPlttBufferUnfaded[241] = gMailGraphicsTable[unk_2000000.varFA].color10;
- gPlttBufferUnfaded[248] = gMailGraphicsTable[unk_2000000.varFA].color12;
- gPlttBufferUnfaded[10] = gUnknown_083E562C[gSaveBlock2.playerGender][0];
- gPlttBufferUnfaded[11] = gUnknown_083E562C[gSaveBlock2.playerGender][1];
- RETURN_UP_STATE;
+ case 14:
+ if (unk_2000000.varF8 != 0)
+ {
+ sub_80F8DA0();
+ }
+ RETURN_UP_STATE;
- case 14:
- if (unk_2000000.varF8 != 0) {
- sub_80F8DA0();
- }
- RETURN_UP_STATE;
+ case 15:
+ if (unk_2000000.varF8 != 0)
+ {
+ sub_80F8E80();
+ }
- case 15:
- if (unk_2000000.varF8 != 0) {
- sub_80F8E80();
- }
+ SetVBlankCallback(sub_80F8F18);
+ gPaletteFade.bufferTransferDisabled = 1;
+ RETURN_UP_STATE;
- SetVBlankCallback(sub_80F8F18);
- gPaletteFade.bufferTransferDisabled = 1;
- RETURN_UP_STATE;
+ case 16:
+ {
+ u16 local1;
- case 16: {
- u16 local1;
+ local1 = sub_809D4A8(unk_2000000.varF4->species);
- local1 = sub_809D4A8(unk_2000000.varF4->species);
+ switch (unk_2000000.varFB)
+ {
+ case 1:
+ sub_809D580(local1);
+ unk_2000000.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0);
+ break;
- switch (unk_2000000.varFB) {
- case 1:
- sub_809D580(local1);
- unk_2000000.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 96, 128, 0);
- break;
+ case 2:
+ sub_809D580(local1);
+ unk_2000000.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0);
+ break;
+ }
+ RETURN_UP_STATE;
+ }
- case 2:
- sub_809D580(local1);
- unk_2000000.varFC = sub_809D3A4(local1, SpriteCallbackDummy, 40, 128, 0);
- break;
- }
+ case 17:
+ if (sub_8055870() != TRUE)
+ {
RETURN_UP_STATE;
}
-
- case 17:
- if (sub_8055870() != TRUE) {
- RETURN_UP_STATE;
- }
- RETURN_SKIP_STATE;
-
- case 18:
- REG_BG0CNT = 0x9F08;
- REG_BG1CNT = 0x0801;
- REG_BG2CNT = 0x0902;
- REG_BLDCNT = 0;
- REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
- BeginNormalPaletteFade(-1, 0, 16, 0, 0);
- gPaletteFade.bufferTransferDisabled = 0;
- unk_2000000.varF0 = sub_80F8F58;
- return TRUE;
-
- default:
- return FALSE;
+ RETURN_SKIP_STATE;
+
+ case 18:
+ REG_BG0CNT = 0x9F08;
+ REG_BG1CNT = 0x0801;
+ REG_BG2CNT = 0x0902;
+ REG_BLDCNT = 0;
+ REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
+ BeginNormalPaletteFade(-1, 0, 16, 0, 0);
+ gPaletteFade.bufferTransferDisabled = 0;
+ unk_2000000.varF0 = sub_80F8F58;
+ return TRUE;
+
+ default:
+ return FALSE;
}
gMain.state += 1;
return FALSE;
}
-void sub_80F8D50(void) {
- do {
- if (sub_80F8A28() == 1) {
+void sub_80F8D50(void)
+{
+ do
+ {
+ if (sub_80F8A28() == 1)
+ {
SetMainCallback2(sub_80F8F2C);
return;
}
} while (sub_80F9344() != 1);
}
-u8 *sub_80F8D7C(u8 *dest, u8 *src) {
+u8 *sub_80F8D7C(u8 *dest, u8 *src)
+{
u16 length;
StringCopy(dest, src);
@@ -442,24 +468,28 @@ u8 *sub_80F8D7C(u8 *dest, u8 *src) {
}
#ifdef NONMATCHING
-static void sub_80F8DA0(void) {
+static void sub_80F8DA0(void)
+{
u8 local0;
local0 = unk_2000000.var10C->var0;
// No idea what's happening in this loop.
- if (local0 <= 0) {
+ if (local0 <= 0)
+ {
u8 i;
u8 i2 = 0;
- for (i = 0; i < unk_2000000.var10C->var0; i++) {
+ for (i = 0; i < unk_2000000.var10C->var0; i++)
+ {
ConvertEasyChatWordsToString(unk_2000000.words[i], &unk_2000000.varF4->words[i2],
- ((*unk_2000000.var10C->var4)[i] << 28) >> 30, 1);
+ ((*unk_2000000.var10C->var4)[i] << 28) >> 30, 1);
i2 += ((*unk_2000000.var10C->var4)[i] << 28) >> 30;
}
}
- if (unk_2000000.var100 == 0) {
+ if (unk_2000000.var100 == 0)
+ {
u8 *ptr;
u16 length;
@@ -469,7 +499,9 @@ static void sub_80F8DA0(void) {
length = StringLength(unk_2000000.varD8);
unk_2000000.varF9 = unk_2000000.var10C->var2 - length;
- } else {
+ }
+ else
+ {
u8 *ptr;
ptr = StringCopy(unk_2000000.varD8, gOtherText_From);
@@ -480,129 +512,134 @@ static void sub_80F8DA0(void) {
}
#else
__attribute__((naked))
-static void sub_80F8DA0(void) {
+static void sub_80F8DA0(void)
+{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r8\n\
- push {r7}\n\
- movs r6, 0\n\
- movs r5, 0\n\
- ldr r2, _080F8E3C @ =0x02000000\n\
- movs r0, 0x86\n\
- lsls r0, 1\n\
- adds r1, r2, r0\n\
- ldr r0, [r1]\n\
- ldrb r0, [r0]\n\
- cmp r5, r0\n\
- bcs _080F8E04\n\
- mov r8, r2\n\
- adds r7, r1, 0\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ movs r6, 0\n\
+ movs r5, 0\n\
+ ldr r2, _080F8E3C @ =0x02000000\n\
+ movs r0, 0x86\n\
+ lsls r0, 1\n\
+ adds r1, r2, r0\n\
+ ldr r0, [r1]\n\
+ ldrb r0, [r0]\n\
+ cmp r5, r0\n\
+ bcs _080F8E04\n\
+ mov r8, r2\n\
+ adds r7, r1, 0\n\
_080F8DBE:\n\
- lsls r0, r5, 3\n\
- subs r0, r5\n\
- lsls r0, 2\n\
- subs r0, r5\n\
- add r0, r8\n\
- mov r1, r8\n\
- adds r1, 0xF4\n\
- lsls r2, r6, 1\n\
- ldr r1, [r1]\n\
- adds r1, r2\n\
- ldr r2, [r7]\n\
- ldr r2, [r2, 0x4]\n\
- lsls r4, r5, 2\n\
- adds r2, r4, r2\n\
- ldr r2, [r2]\n\
- lsls r2, 28\n\
- lsrs r2, 30\n\
- movs r3, 0x1\n\
- bl ConvertEasyChatWordsToString\n\
- ldr r1, [r7]\n\
- ldr r0, [r1, 0x4]\n\
- adds r4, r0\n\
- ldr r0, [r4]\n\
- lsls r0, 28\n\
- lsrs r0, 30\n\
- adds r0, r6, r0\n\
- lsls r0, 24\n\
- lsrs r6, r0, 24\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- ldrb r1, [r1]\n\
- cmp r5, r1\n\
- bcc _080F8DBE\n\
+ lsls r0, r5, 3\n\
+ subs r0, r5\n\
+ lsls r0, 2\n\
+ subs r0, r5\n\
+ add r0, r8\n\
+ mov r1, r8\n\
+ adds r1, 0xF4\n\
+ lsls r2, r6, 1\n\
+ ldr r1, [r1]\n\
+ adds r1, r2\n\
+ ldr r2, [r7]\n\
+ ldr r2, [r2, 0x4]\n\
+ lsls r4, r5, 2\n\
+ adds r2, r4, r2\n\
+ ldr r2, [r2]\n\
+ lsls r2, 28\n\
+ lsrs r2, 30\n\
+ movs r3, 0x1\n\
+ bl ConvertEasyChatWordsToString\n\
+ ldr r1, [r7]\n\
+ ldr r0, [r1, 0x4]\n\
+ adds r4, r0\n\
+ ldr r0, [r4]\n\
+ lsls r0, 28\n\
+ lsrs r0, 30\n\
+ adds r0, r6, r0\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ ldrb r1, [r1]\n\
+ cmp r5, r1\n\
+ bcc _080F8DBE\n\
_080F8E04:\n\
- ldr r2, _080F8E40 @ =0x020000d8\n\
- adds r4, r2, 0\n\
- subs r4, 0xD8\n\
- adds r0, r2, 0\n\
- adds r0, 0x28\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- bne _080F8E48\n\
- ldr r1, [r2, 0x1C]\n\
- adds r1, 0x12\n\
- adds r0, r2, 0\n\
- bl sub_80F8D7C\n\
- adds r2, r0, 0\n\
- ldr r1, _080F8E44 @ =gOtherText_From\n\
- bl StringCopy\n\
- ldr r0, _080F8E40 @ =0x020000d8\n\
- bl StringLength\n\
- movs r2, 0x86\n\
- lsls r2, 1\n\
- adds r1, r4, r2\n\
- ldr r1, [r1]\n\
- ldrb r1, [r1, 0x2]\n\
- subs r1, r0\n\
- b _080F8E6A\n\
- .align 2, 0\n\
+ ldr r2, _080F8E40 @ =0x020000d8\n\
+ adds r4, r2, 0\n\
+ subs r4, 0xD8\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x28\n\
+ ldrb r0, [r0]\n\
+ cmp r0, 0\n\
+ bne _080F8E48\n\
+ ldr r1, [r2, 0x1C]\n\
+ adds r1, 0x12\n\
+ adds r0, r2, 0\n\
+ bl sub_80F8D7C\n\
+ adds r2, r0, 0\n\
+ ldr r1, _080F8E44 @ =gOtherText_From\n\
+ bl StringCopy\n\
+ ldr r0, _080F8E40 @ =0x020000d8\n\
+ bl StringLength\n\
+ movs r2, 0x86\n\
+ lsls r2, 1\n\
+ adds r1, r4, r2\n\
+ ldr r1, [r1]\n\
+ ldrb r1, [r1, 0x2]\n\
+ subs r1, r0\n\
+ b _080F8E6A\n\
+ .align 2, 0\n\
_080F8E3C: .4byte 0x02000000\n\
_080F8E40: .4byte 0x020000d8\n\
_080F8E44: .4byte gOtherText_From\n\
_080F8E48:\n\
- ldr r1, _080F8E7C @ =gOtherText_From\n\
- adds r0, r2, 0\n\
- bl StringCopy\n\
- adds r2, r0, 0\n\
- adds r0, r4, 0\n\
- adds r0, 0xF4\n\
- ldr r1, [r0]\n\
- adds r1, 0x12\n\
- adds r0, r2, 0\n\
- bl sub_80F8D7C\n\
- movs r1, 0x86\n\
- lsls r1, 1\n\
- adds r0, r4, r1\n\
- ldr r0, [r0]\n\
- ldrb r1, [r0, 0x2]\n\
+ ldr r1, _080F8E7C @ =gOtherText_From\n\
+ adds r0, r2, 0\n\
+ bl StringCopy\n\
+ adds r2, r0, 0\n\
+ adds r0, r4, 0\n\
+ adds r0, 0xF4\n\
+ ldr r1, [r0]\n\
+ adds r1, 0x12\n\
+ adds r0, r2, 0\n\
+ bl sub_80F8D7C\n\
+ movs r1, 0x86\n\
+ lsls r1, 1\n\
+ adds r0, r4, r1\n\
+ ldr r0, [r0]\n\
+ ldrb r1, [r0, 0x2]\n\
_080F8E6A:\n\
- adds r0, r4, 0\n\
- adds r0, 0xF9\n\
- strb r1, [r0]\n\
- pop {r3}\n\
- mov r8, r3\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ adds r0, r4, 0\n\
+ adds r0, 0xF9\n\
+ strb r1, [r0]\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_080F8E7C: .4byte gOtherText_From\n\
.syntax divided\n");
}
#endif
-static void sub_80F8E80(void) {
+static void sub_80F8E80(void)
+{
u16 pos;
u8 x;
u8 y = 0;
- for (pos = 0; pos < unk_2000000.var10C->var0; pos++) {
- if (unk_2000000.words[pos][0] == 0xFF) {
+ for (pos = 0; pos < unk_2000000.var10C->var0; pos++)
+ {
+ if (unk_2000000.words[pos][0] == 0xFF)
+ {
continue;
}
- if (unk_2000000.words[pos][0] == 0x00) {
+ if (unk_2000000.words[pos][0] == 0x00)
+ {
continue;
}
@@ -615,14 +652,17 @@ static void sub_80F8E80(void) {
MenuPrint(unk_2000000.varD8, unk_2000000.varF9, unk_2000000.var10C->var1);
}
-static void sub_80F8F18(void) {
+static void sub_80F8F18(void)
+{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-static void sub_80F8F2C(void) {
- if(unk_2000000.varFB != 0) {
+static void sub_80F8F2C(void)
+{
+ if (unk_2000000.varFB != 0)
+ {
AnimateSprites();
BuildOamBuffer();
}
@@ -630,38 +670,45 @@ static void sub_80F8F2C(void) {
unk_2000000.varF0();
}
-static void sub_80F8F58(void) {
+static void sub_80F8F58(void)
+{
u8 local0;
local0 = UpdatePaletteFade();
- if(local0 == 0) {
+ if (local0 == 0)
+ {
unk_2000000.varF0 = sub_80F8F78;
}
}
-static void sub_80F8F78(void) {
- if (gMain.newKeys & (A_BUTTON | B_BUTTON)) {
+static void sub_80F8F78(void)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
unk_2000000.varF0 = sub_80F8FB4;
}
}
-static void sub_80F8FB4(void) {
+static void sub_80F8FB4(void)
+{
u16 local1;
- if (UpdatePaletteFade()) {
+ if (UpdatePaletteFade())
+ {
return;
}
SetMainCallback2(unk_2000000.varEC);
- switch (unk_2000000.varFB) {
- case 2:
- case 1:
- local1 = sub_809D4A8(unk_2000000.varF4->species);
- sub_809D608(local1);
-
- sub_809D510(&gSprites[unk_2000000.varFC]);
- break;
+ switch (unk_2000000.varFB)
+ {
+ case 2:
+ case 1:
+ local1 = sub_809D4A8(unk_2000000.varF4->species);
+ sub_809D608(local1);
+
+ sub_809D510(&gSprites[unk_2000000.varFC]);
+ break;
}
memset(&unk_2000000, 0, 0x110);
diff --git a/src/main.c b/src/main.c
index 76ac3d6d9..0e93fb89f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -15,7 +15,6 @@
#include "sound.h"
extern struct SoundInfo gSoundInfo;
-extern u32 gUnknown_3004820;
extern u32 IntrMain[];
static void VBlankIntr(void);
@@ -93,8 +92,8 @@ void AgbMain()
gSoftResetDisabled = FALSE;
- if (gUnknown_3004820 != 1)
- SetMainCallback2(0);
+ if (gFlashMemoryPresent != TRUE)
+ SetMainCallback2(NULL);
gUnknown_3001764 = 0;
diff --git a/src/main_menu.c b/src/main_menu.c
index 7adbda096..3c8df52d4 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -2,6 +2,7 @@
#include "main_menu.h"
#include "asm.h"
#include "decompress.h"
+#include "event_data.h"
#include "menu.h"
#include "mystery_event_menu.h"
#include "option_menu.h"
@@ -16,7 +17,7 @@
#include "task.h"
#include "text.h"
#include "title_screen.h"
-#include "event_data.h"
+#include "naming_screen.h"
#define BirchSpeechUpdateWindowText() ((u8)MenuUpdateWindowText_OverrideLineLength(24))
@@ -69,9 +70,7 @@ extern const u8 gUnknown_081E7834[];
extern const u8 gUnknown_081E796C[];
extern const u8 gSystemText_NewPara[];
-extern u8 gSpriteAffineAnimTable_81E79AC[];
-
-extern u8 gStringVar4[];
+extern const union AffineAnimCmd *const gSpriteAffineAnimTable_81E79AC[];
extern u8 unk_2000000[];
@@ -1083,7 +1082,7 @@ static void Task_NewGameSpeech22(u8 taskId)
if (!gPaletteFade.active)
{
SetPresetPlayerName(1);
- DoNamingScreen(0, &gSaveBlock2, gSaveBlock2.playerGender, 0, 0, CB_ContinueNewGameSpeechPart2);
+ DoNamingScreen(0, gSaveBlock2.playerName, gSaveBlock2.playerGender, 0, 0, CB_ContinueNewGameSpeechPart2);
}
}
@@ -1258,7 +1257,7 @@ static void Task_NewGameSpeech30(u8 taskId)
spriteId = gTasks[taskId].data[TD_TRAINER_SPRITE_ID];
gSprites[spriteId].oam.affineMode = 1;
- gSprites[spriteId].affineAnims = (union AffineAnimCmd **)gSpriteAffineAnimTable_81E79AC;
+ gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_81E79AC;
InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 0);
gSprites[spriteId].callback = ShrinkPlayerSprite;
diff --git a/src/map_name_popup.c b/src/map_name_popup.c
new file mode 100644
index 000000000..c10a3f9de
--- /dev/null
+++ b/src/map_name_popup.c
@@ -0,0 +1,106 @@
+#include "global.h"
+#include "asm.h"
+#include "event_data.h"
+#include "menu.h"
+#include "task.h"
+
+EWRAM_DATA static u8 sTaskId = 0;
+
+static void Task_MapNamePopup(u8);
+static void DrawMapNamePopup(void);
+
+bool8 unref_sub_80A2F44(void)
+{
+ CloseMenu();
+ ShowMapNamePopup();
+ return 1;
+}
+
+void ShowMapNamePopup(void)
+{
+ if (FlagGet(0x4000) != TRUE)
+ {
+ if (!FuncIsActiveTask(Task_MapNamePopup))
+ {
+ sTaskId = CreateTask(Task_MapNamePopup, 90);
+ REG_BG0VOFS = 32;
+ DrawMapNamePopup();
+ gTasks[sTaskId].data[0] = 0;
+ gTasks[sTaskId].data[2] = 32;
+ }
+ else
+ {
+ if (gTasks[sTaskId].data[0] != 2)
+ gTasks[sTaskId].data[0] = 2;
+ gTasks[sTaskId].data[3] = 1;
+ }
+ }
+}
+
+void Task_MapNamePopup(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ task->data[2] -= 2;
+ if (task->data[2] <= 0 )
+ {
+ task->data[0] = 1;
+ gTasks[sTaskId].data[1] = 0;
+ }
+ break;
+ case 1:
+ task->data[1]++;
+ if (task->data[1] > 120 )
+ {
+ task->data[1] = 0;
+ task->data[0] = 2;
+ }
+ break;
+ case 2:
+ task->data[2] += 2;
+ if (task->data[2] > 31)
+ {
+ if (task->data[3])
+ {
+ DrawMapNamePopup();
+ task->data[0] = 0;
+ task->data[3] = 0;
+ }
+ else
+ {
+ task->data[0] = 4;
+ return;
+ }
+ }
+ break;
+ case 4:
+ HideMapNamePopup();
+ return;
+ }
+
+ REG_BG0VOFS = task->data[2];
+}
+
+void HideMapNamePopup(void)
+{
+ if (FuncIsActiveTask(Task_MapNamePopup))
+ {
+ MenuLoadTextWindowGraphics();
+ MenuZeroFillWindowRect(0, 0, 13, 3);
+ REG_BG0VOFS = 0;
+ DestroyTask(sTaskId);
+ }
+}
+
+void DrawMapNamePopup(void)
+{
+ u8 name[20];
+
+ MenuLoadTextWindowGraphics_OverrideFrameType(0);
+ sub_80FBFB4(name, gMapHeader.name, 0);
+ MenuDrawTextWindow(0, 0, 13, 3);
+ sub_8072BD8(name, 1, 1, 0x60);
+}
diff --git a/src/map_obj_lock.c b/src/map_obj_lock.c
index b1e7bb3df..e500deca0 100644
--- a/src/map_obj_lock.c
+++ b/src/map_obj_lock.c
@@ -3,6 +3,7 @@
#include "asm.h"
#include "field_player_avatar.h"
#include "task.h"
+#include "field_map_obj_helpers.h"
extern u16 gScriptFacing;
diff --git a/src/matsuda_debug_menu.c b/src/matsuda_debug_menu.c
index 131369e91..6177d9edb 100644
--- a/src/matsuda_debug_menu.c
+++ b/src/matsuda_debug_menu.c
@@ -10,8 +10,8 @@
#include "string_util.h"
#include "task.h"
#include "text.h"
-
-#define BIT(n) (1 << (n))
+#include "contest.h"
+#include "matsuda_debug_menu.h"
extern u8 gUnknown_0203856C;
extern u8 gUnknown_0203857D[][64];
@@ -63,24 +63,6 @@ extern u8* gMatsudaDebugMenuTextList2[];
extern u8* gMatsudaDebugMenuTextList3[];
extern u8 gMatsudaDebugMenuContestTopLeft[][2];
-struct ContestPokemon
-{
- /* 0x00 */ u16 species;
- /* 0x02 */ u8 nickname[POKEMON_NAME_LENGTH];
- /* 0x0D */ u8 trainerName[8];
- /* 0x15 */ u8 filler15[9];
- /* 0x1E */ u16 moves[4]; // moves
- /* 0x26 */ u8 cool; // cool
- /* 0x27 */ u8 beauty; // beauty
- /* 0x28 */ u8 cute; // cute
- /* 0x29 */ u8 smart; // smart
- /* 0x2A */ u8 tough; // tough
- /* 0x2B */ u8 sheen; // sheen
- /* 0x2C */ u8 filler2C[20];
-};
-
-extern struct ContestPokemon gContestMons[];
-
extern bool8 gReceivedRemoteLinkPlayers;
extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
@@ -103,7 +85,6 @@ static void sub_80AA10C(void);
static void sub_80AA5BC(u8);
static void sub_80AA614(u8, u8);
static void sub_80AAD08(struct Sprite *, s8);
-extern void sub_80AB184(void);
extern void sub_80AB47C(void);
extern int sub_80B2A7C(u8); //Don't know return type size
@@ -120,8 +101,8 @@ u8 unref_sub_80A9B28(void)
static bool8 sub_80A9B78(void)
{
s8 choice = ProcessMenuInput();
-
- switch(choice)
+
+ switch (choice)
{
case -2:
return FALSE;
@@ -143,11 +124,11 @@ s8 MatsudaDebugMenu_ContestResults(void)
static void sub_80A9BE4(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
DestroyTask(taskId);
- if(!(gIsLinkContest & 1))
+ if (!(gIsLinkContest & 1))
sub_80AF668();
sub_80C2358();
@@ -171,7 +152,7 @@ s8 MatsudaDebugMenu_CommTest(void)
{
u8 newTaskId;
u8 newTaskId2;
-
+
newTaskId = CreateTask(sub_80A9E3C, 0);
SetTaskFuncWithFollowupFunc(newTaskId, sub_80A9E3C, sub_80A9C98);
newTaskId2 = CreateTask(sub_80A9E04, 1);
@@ -198,7 +179,7 @@ static void sub_80A9CDC(u8 taskId)
static void sub_80A9CF8(u8 taskId)
{
- if(gReceivedRemoteLinkPlayers == FALSE)
+ if (gReceivedRemoteLinkPlayers == FALSE)
{
DestroyTask(gTasks[taskId].data[10]);
DestroyTask(taskId);
@@ -217,7 +198,7 @@ static void sub_80A9D58(u8 taskId)
int i;
u8 dest[4];
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
dest[i] = gTasks[taskId].data[5 + i];
gUnknown_0203869B = sub_80C4B34(dest);
@@ -240,17 +221,17 @@ static void sub_80A9DD8(u8 taskId)
static void sub_80A9E04(u8 taskId)
{
- if(gMain.newKeys == 2)
+ if (gMain.newKeys == 2)
gTasks[(u8)gTasks[taskId].data[10]].func = sub_80A9D30;
}
static void sub_80A9E3C(u8 taskId)
{
u8 i;
-
+
OpenLink();
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
gBlockRecvBuffer[i][0] = 255;
gTasks[taskId].data[0] = 0;
@@ -261,15 +242,15 @@ static void sub_80A9E80(u8 taskId)
{
TaskFunc func;
- if(gTasks[taskId].data[0] < 10)
+ if (gTasks[taskId].data[0] < 10)
gTasks[taskId].data[0]++;
else
{
- if(GetLinkPlayerCount_2() > 3)
+ if (GetLinkPlayerCount_2() > 3)
{
gTasks[taskId].data[0] = 0;
-
- if(IsLinkMaster())
+
+ if (IsLinkMaster())
{
func = sub_80A9ED8;
gTasks[taskId].func = (TaskFunc)func;
@@ -286,7 +267,7 @@ static void sub_80A9E80(u8 taskId)
static void sub_80A9ED8(u8 taskId)
{
gTasks[taskId].data[0] = gTasks[taskId].data[0] + 1;
- if((gTasks[taskId].data[0]) == 101)
+ if ((gTasks[taskId].data[0]) == 101)
{
sub_8007F4C();
gTasks[taskId].data[0] = 0;
@@ -296,10 +277,10 @@ static void sub_80A9ED8(u8 taskId)
static void sub_80A9F10(u8 taskId)
{
- if(gReceivedRemoteLinkPlayers)
+ if (gReceivedRemoteLinkPlayers)
{
gContestPlayerMonIndex = GetMultiplayerId();
- if(GetLinkPlayerCount() == 4)
+ if (GetLinkPlayerCount() == 4)
{
gIsLinkContest = 1;
SwitchTaskToFollowupFunc(taskId);
@@ -334,18 +315,18 @@ static void sub_80A9FE4(void)
u8 *addr;
u32 i;
u8 ptr[5];
-
+
memcpy(ptr, gMatsudaDebugMenu_UnknownByteArray, 5);
addr = (void *)VRAM;
i = VRAM_SIZE;
- while(1)
+ while (1)
{
DmaFill32(3, 0, addr, 0x1000);
addr += 0x1000;
i -= 0x1000;
- if(i <= 0x1000)
+ if (i <= 0x1000)
{
DmaFill32(3, 0, addr, i);
break;
@@ -361,7 +342,7 @@ static void sub_80AA064(void)
BuildOamBuffer();
RunTasks();
UpdatePaletteFade();
- if(gMain.newKeys == 4)
+ if (gMain.newKeys == 4)
SetMainCallback2(sub_805469C);
}
@@ -395,21 +376,21 @@ static void sub_80AA10C(void)
ResetSpriteData();
ResetTasks();
FreeAllSpritePalettes();
- sub_80A9FE4();
+ sub_80A9FE4();
SetVBlankCallback(sub_80AA090);
SetMainCallback2(sub_80AA064);
gPaletteFade.bufferTransferDisabled = 0;
gUnknown_02038694 = 0;
- if(!(gContestMons[0].nickname[0]))
+ if (!(gContestMons[0].nickname[0]))
sub_80AE398(0, 0);
sub_80AE098(gUnknown_02038694);
- for(i = 0; i < 6; i++)
+ for (i = 0; i < 6; i++)
{
- sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList1[i],
- (0xA * i + 0x2A), gMatsudaDebugMenuContestTopLeft[i][0],
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList1[i],
+ (0xA * i + 0x2A), gMatsudaDebugMenuContestTopLeft[i][0],
gMatsudaDebugMenuContestTopLeft[i][1]);
}
@@ -431,7 +412,7 @@ static void sub_80AA10C(void)
gSprites[spriteId].data3 = zero; // only this assignment of zero is necessary. other replacements of 0 with zero do not change the asm, compiler will treat it the same.
}
-void sub_80AA280(u8 var)
+void sub_80AA280(u8 var) // no?
{
u8 i;
@@ -439,9 +420,9 @@ void sub_80AA280(u8 var)
StringCopy(unk_2000000, gMatsudaDebugMenu_StartText);
StringAppend(unk_2000000, &gUnknown_0203857D[var][0]);
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
{
- if(var == i)
+ if (var == i)
{
sub_8003460(&gMenuWindow, unk_2000000, (10 * i + 2), gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]);
}
@@ -499,49 +480,49 @@ static void sub_80AA4F0(u8 var1, u8 var2)
static void sub_80AA5BC(u8 var)
{
- sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12);
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12);
}
void sub_80AA5E8(u8 var)
{
- sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4);
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4);
}
static void sub_80AA614(u8 var1, u8 var2)
{
- u16 var = sub_80AE770(var1, var2);
+ u16 var = sub_80AE770(var1, var2);
- ConvertIntToDecimalStringN(unk_2000000, var, STR_CONV_MODE_RIGHT_ALIGN, 3);
- sub_8003460(&gMenuWindow, unk_2000000, 0xE2, 3, 0xC);
+ ConvertIntToDecimalStringN(unk_2000000, var, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, unk_2000000, 0xE2, 3, 0xC);
}
void sub_80AA658(u8 var)
{
- u8 i;
+ u8 i;
- sub_80AA340(var);
- sub_80AA388(var);
- sub_80AA3D0(var);
- sub_80AA418(var);
- sub_80AA460(var);
- sub_80AA4A8(var);
+ sub_80AA340(var);
+ sub_80AA388(var);
+ sub_80AA3D0(var);
+ sub_80AA418(var);
+ sub_80AA460(var);
+ sub_80AA4A8(var);
- for(i = 0; i < 4; i++)
- sub_80AA4F0(var, i);
+ for (i = 0; i < 4; i++)
+ sub_80AA4F0(var, i);
}
void SetDebugMonForContest(void)
{
- SetMonData(&gPlayerParty[0], MON_DATA_COOL, &gContestMons[gContestPlayerMonIndex].cool);
- SetMonData(&gPlayerParty[0], MON_DATA_CUTE, &gContestMons[gContestPlayerMonIndex].cute);
- SetMonData(&gPlayerParty[0], MON_DATA_BEAUTY, &gContestMons[gContestPlayerMonIndex].beauty);
- SetMonData(&gPlayerParty[0], MON_DATA_SMART, &gContestMons[gContestPlayerMonIndex].smart);
- SetMonData(&gPlayerParty[0], MON_DATA_TOUGH, &gContestMons[gContestPlayerMonIndex].tough);
- SetMonData(&gPlayerParty[0], MON_DATA_SHEEN, &gContestMons[gContestPlayerMonIndex].sheen);
- SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[0]);
- SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[1]);
- SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[2]);
- SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[3]);
+ SetMonData(&gPlayerParty[0], MON_DATA_COOL, &gContestMons[gContestPlayerMonIndex].cool);
+ SetMonData(&gPlayerParty[0], MON_DATA_CUTE, &gContestMons[gContestPlayerMonIndex].cute);
+ SetMonData(&gPlayerParty[0], MON_DATA_BEAUTY, &gContestMons[gContestPlayerMonIndex].beauty);
+ SetMonData(&gPlayerParty[0], MON_DATA_SMART, &gContestMons[gContestPlayerMonIndex].smart);
+ SetMonData(&gPlayerParty[0], MON_DATA_TOUGH, &gContestMons[gContestPlayerMonIndex].tough);
+ SetMonData(&gPlayerParty[0], MON_DATA_SHEEN, &gContestMons[gContestPlayerMonIndex].sheen);
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[0]);
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[1]);
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[2]);
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[3]);
}
void sub_80AA754(struct Sprite *sprite)
@@ -590,32 +571,32 @@ void sub_80AA754(struct Sprite *sprite)
static void sub_80AA8A0(struct Sprite *sprite, s8 var1, u8 var2)
{
- if(var1 == 1)
- {
- sprite->data2 = var2;
- sub_80AA280(var2);
- sub_80AA658(sprite->data2);
- }
+ if (var1 == 1)
+ {
+ sprite->data2 = var2;
+ sub_80AA280(var2);
+ sub_80AA658(sprite->data2);
+ }
}
void sub_80AA8C8(struct Sprite *sprite, s8 var1)
{
- sub_80AA8A0(sprite, var1, 0);
+ sub_80AA8A0(sprite, var1, 0);
}
void sub_80AA8D8(struct Sprite *sprite, s8 var1)
{
- sub_80AA8A0(sprite, var1, 1);
+ sub_80AA8A0(sprite, var1, 1);
}
void sub_80AA8E8(struct Sprite *sprite, s8 var1)
{
- sub_80AA8A0(sprite, var1, 2);
+ sub_80AA8A0(sprite, var1, 2);
}
void sub_80AA8F8(struct Sprite *sprite, s8 var1)
{
- sub_80AA8A0(sprite, var1, 3);
+ sub_80AA8A0(sprite, var1, 3);
}
static u8 sub_80AA908(u32 a1, u8 a2, s8 a3) // first param is unused.
@@ -634,48 +615,48 @@ void sub_80AA930(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].cool = sub_80AA908(val, gContestMons[sprite->data2].cool, var2);
- sub_80AA340(sprite->data2);
+ gContestMons[sprite->data2].cool = sub_80AA908(val, gContestMons[sprite->data2].cool, var2);
+ sub_80AA340(sprite->data2);
}
void sub_80AA974(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].cute = sub_80AA908(val, gContestMons[sprite->data2].cute, var2);
- sub_80AA388(sprite->data2);
+ gContestMons[sprite->data2].cute = sub_80AA908(val, gContestMons[sprite->data2].cute, var2);
+ sub_80AA388(sprite->data2);
}
void sub_80AA9B8(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].beauty = sub_80AA908(val, gContestMons[sprite->data2].beauty, var2);
- sub_80AA3D0(sprite->data2);
+ gContestMons[sprite->data2].beauty = sub_80AA908(val, gContestMons[sprite->data2].beauty, var2);
+ sub_80AA3D0(sprite->data2);
}
void sub_80AA9FC(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].smart = sub_80AA908(val, gContestMons[sprite->data2].smart, var2);
- sub_80AA418(sprite->data2);
+ gContestMons[sprite->data2].smart = sub_80AA908(val, gContestMons[sprite->data2].smart, var2);
+ sub_80AA418(sprite->data2);
}
void sub_80AAA40(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].tough = sub_80AA908(val, gContestMons[sprite->data2].tough, var2);
- sub_80AA460(sprite->data2);
+ gContestMons[sprite->data2].tough = sub_80AA908(val, gContestMons[sprite->data2].tough, var2);
+ sub_80AA460(sprite->data2);
}
void sub_80AAA84(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].sheen = sub_80AA908(val, gContestMons[sprite->data2].sheen, var2);
- sub_80AA4A8(sprite->data2);
+ gContestMons[sprite->data2].sheen = sub_80AA908(val, gContestMons[sprite->data2].sheen, var2);
+ sub_80AA4A8(sprite->data2);
}
// a similar function is at 0x80AA908, however, it apparently returns the wrong type (u8 vs u16).
@@ -695,39 +676,39 @@ void sub_80AAAF0(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].moves[0] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[0], var2);
- sub_80AA4F0(sprite->data2, 0);
+ gContestMons[sprite->data2].moves[0] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[0], var2);
+ sub_80AA4F0(sprite->data2, 0);
}
void sub_80AAB30(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].moves[1] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[1], var2);
- sub_80AA4F0(sprite->data2, 1);
+ gContestMons[sprite->data2].moves[1] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[1], var2);
+ sub_80AA4F0(sprite->data2, 1);
}
void sub_80AAB70(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].moves[2] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[2], var2);
- sub_80AA4F0(sprite->data2, 2);
+ gContestMons[sprite->data2].moves[2] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[2], var2);
+ sub_80AA4F0(sprite->data2, 2);
}
void sub_80AABB0(struct Sprite *sprite, u8 var2)
{
u8 val = sprite->data2;
- gContestMons[sprite->data2].moves[3] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[3], var2);
- sub_80AA4F0(sprite->data2, 3);
+ gContestMons[sprite->data2].moves[3] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[3], var2);
+ sub_80AA4F0(sprite->data2, 3);
}
void sub_80AABF0(struct Sprite *sprite, s8 var2)
{
s8 a = (var2 > 0) ? 1 : -1;
s8 r4 = sprite->data3 + a;
-
+
if (r4 < 0)
r4 = 0;
else if (r4 > 4)
@@ -781,7 +762,7 @@ void sub_80AAD44(struct Sprite *sprite, s8 var2)
if (var2 == 1)
{
int i;
-
+
SetDebugMonForContest();
for (i = 0; i < 4; i++)
gUnknown_02038670[i] = sub_80AE770(i, gScriptContestCategory);
@@ -799,22 +780,22 @@ void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d)
//u32 sp44;
//u32 sp48;
u32 sp58;
-
+
gMain.state = 0;
-
+
r5 = d + 1;
//Could also be DmaClear32
DmaFill32(3, 0, (u8 *)VRAM + 0x18000 - r5 * 256, 0x100);
-
+
r7 = StringLength(string);
if (r7 > 8)
r7 = 8;
sp58 = d * 2;
-
+
//More stuff
-
+
r7_2 = 0x7C - sp58;
-
+
}
*/
@@ -1000,7 +981,7 @@ void unref_sub_80AAEE8(s32 a, u8 b, u8 c, u8 d)
{
u8 string[12];
u8 offset = 0;
-
+
if (a < 0)
{
string[0] = 0xAE;
@@ -1013,19 +994,22 @@ void unref_sub_80AAEE8(s32 a, u8 b, u8 c, u8 d)
void sub_80AAF30(void)
{
s32 i;
-
+
gUnknown_0203856C = 1;
gContestPlayerMonIndex = 3;
sub_80AE098(0);
+
for (i = 3; i > -1; i--)
gUnknown_02038690[i] = 3 - i;
+
for (i = 0; i < 3; i++)
{
gUnknown_02038670[i] = 0;
gUnknown_02038680[i] = 0;
gUnknown_02038678[i] = 0;
- memcpy(&gContestMons[i], &gContestMons[3], 0x40);
+ memcpy(&gContestMons[i], &gContestMons[3], sizeof(struct ContestPokemon));
}
+
gUnknown_02038670[3] = 0x12C;
gUnknown_02038680[3] = 0x190;
gUnknown_02038678[3] = 0x190;
@@ -1044,7 +1028,7 @@ int MatsudaDebugMenu_SetHighScore(void)
int MatsudaDebugMenu_ResetHighScore(void)
{
s32 i;
-
+
gUnknown_0203856C = 0;
for (i = 0; i < 4; i++)
{
@@ -1060,7 +1044,7 @@ int MatsudaDebugMenu_ResetHighScore(void)
int MatsudaDebugMenu_SetArtMuseumItems(void)
{
s32 i;
-
+
gContestPlayerMonIndex = 3;
sub_80AE098(0);
for (i = 3; i > -1; i--)
@@ -1076,7 +1060,7 @@ void unref_sub_80AB084(u8 *text)
u16 savedIme;
u8 *addr;
size_t size;
-
+
REG_BG0HOFS = 0;
REG_BG0VOFS = 0;
REG_BG1HOFS = 0;
@@ -1090,7 +1074,7 @@ void unref_sub_80AB084(u8 *text)
REG_WIN1H = 0;
REG_WIN1V = 0;
REG_DISPCNT = 0x1F40;
-
+
savedIme = REG_IME;
REG_IME = 0;
REG_IE |= INTR_FLAG_VBLANK;
@@ -1099,15 +1083,15 @@ void unref_sub_80AB084(u8 *text)
ResetTasks();
ResetSpriteData();
SetMainCallback2(sub_80AB184);
-
+
addr = (void *)VRAM;
size = 0x18000;
- while(1)
+ while (1)
{
DmaFill32(3, 0, addr, 0x1000);
addr += 0x1000;
size -= 0x1000;
- if(size <= 0x1000)
+ if (size <= 0x1000)
{
DmaFill32(3, 0, addr, size);
break;
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
new file mode 100644
index 000000000..c01a51091
--- /dev/null
+++ b/src/mauville_old_man.c
@@ -0,0 +1,406 @@
+#include "global.h"
+#include "string_util.h"
+#include "menu.h"
+#include "script.h"
+#include "asm.h"
+#include "rng.h"
+
+extern u16 gScriptResult;
+extern u16 gSpecialVar_0x8004;
+
+extern void sub_80F83F8(void);
+extern void sub_81099CC(void);
+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[];
+
+extern u16 gUnknown_083E537C[];
+
+void sub_80F7A34(void)
+{
+ u16 i;
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ oldMan->oldMan1.unk_2D94 = 0;
+ oldMan->oldMan1.unk_2DBD = 0;
+
+ for(i = 0; i < 6; i++)
+ oldMan->oldMan1.mauvilleOldMan_ecArray[i] = gUnknown_083E537C[i];
+}
+
+void sub_80F7A6C(void)
+{
+ struct UnkMauvilleOldManStruct *bard = &gSaveBlock1.oldMan.oldMan1;
+
+ bard->unk_2D94 = 1;
+ bard->unk_2D95 = 0;
+}
+
+void sub_80F7A7C(void)
+{
+ sub_80F83F8();
+}
+
+void sub_80F7A88(void)
+{
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ oldMan->oldMan1.unk_2D94 = 4;
+ oldMan->oldMan1.unk_2D95 = 0;
+}
+
+void sub_80F7A98(void)
+{
+ sub_81099CC();
+}
+
+void SetMauvilleOldMan(void)
+{
+ u32 var = ((u16)((gSaveBlock2.playerTrainerId[1] << 8 | gSaveBlock2.playerTrainerId[0])) % 10) / 2;
+
+ 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;
+ }
+ sub_80F83D0();
+}
+
+u8 GetCurrentMauvilleOldMan(void)
+{
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ return oldMan->oldMan1.unk_2D94;
+}
+
+void sub_80F7B14(void)
+{
+ gScriptResult = GetCurrentMauvilleOldMan();
+}
+
+void sub_80F7B2C(void)
+{
+ u16 *scriptPtr = &gScriptResult; // why??
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ *scriptPtr = oldMan->oldMan1.unk_2DBD;
+}
+
+void sub_80F7B40(void)
+{
+ u16 i;
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+ //struct UnkMauvilleOldManStruct *oldManStruct = &gSaveBlock1.oldManStruct;
+
+ StringCopy(oldMan->oldMan1.playerName, gSaveBlock2.playerName);
+
+ for(i = 0; i < 4; i++)
+ oldMan->oldMan1.playerTrainerId[i] = gSaveBlock2.playerTrainerId[i];
+
+ for(i = 0; i < 6; i++)
+ oldMan->oldMan1.mauvilleOldMan_ecArray[i] = oldMan->oldMan1.mauvilleOldMan_ecArray2[i];
+
+ oldMan->oldMan1.unk_2DBD = 1;
+}
+
+// too mathy
+__attribute__((naked))
+void sub_80F7BA0(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ ldr r1, _080F7C48 @ =gSaveBlock1 + 0x2D94\n\
+ ldr r0, _080F7C4C @ =gSpecialVar_0x8004\n\
+ ldrh r0, [r0]\n\
+ adds r5, r1, 0\n\
+ adds r5, 0xE\n\
+ cmp r0, 0\n\
+ bne _080F7BB2\n\
+ adds r5, r1, 0x2\n\
+_080F7BB2:\n\
+ ldr r2, _080F7C50 @ =gStringVar4\n\
+ adds r4, r2, 0\n\
+ movs r6, 0\n\
+_080F7BB8:\n\
+ ldrh r1, [r5]\n\
+ adds r5, 0x2\n\
+ adds r0, r2, 0\n\
+ bl sub_80EB3FC\n\
+ adds r2, r0, 0\n\
+ adds r7, r6, 0x1\n\
+ cmp r2, r4\n\
+ beq _080F7BDA\n\
+ movs r1, 0x37\n\
+_080F7BCC:\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0\n\
+ bne _080F7BD4\n\
+ strb r1, [r4]\n\
+_080F7BD4:\n\
+ adds r4, 0x1\n\
+ cmp r2, r4\n\
+ bne _080F7BCC\n\
+_080F7BDA:\n\
+ adds r4, 0x1\n\
+ movs r0, 0\n\
+ strb r0, [r2]\n\
+ adds r2, 0x1\n\
+ ldrh r1, [r5]\n\
+ adds r5, 0x2\n\
+ adds r0, r2, 0\n\
+ bl sub_80EB3FC\n\
+ adds r2, r0, 0\n\
+ cmp r2, r4\n\
+ beq _080F7C02\n\
+ movs r1, 0x37\n\
+_080F7BF4:\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0\n\
+ bne _080F7BFC\n\
+ strb r1, [r4]\n\
+_080F7BFC:\n\
+ adds r4, 0x1\n\
+ cmp r2, r4\n\
+ bne _080F7BF4\n\
+_080F7C02:\n\
+ adds r4, 0x1\n\
+ movs r0, 0xFE\n\
+ strb r0, [r2]\n\
+ adds r2, 0x1\n\
+ ldrh r1, [r5]\n\
+ adds r5, 0x2\n\
+ adds r0, r2, 0\n\
+ bl sub_80EB3FC\n\
+ adds r2, r0, 0\n\
+ cmp r2, r4\n\
+ beq _080F7C2A\n\
+ movs r1, 0x37\n\
+_080F7C1C:\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0\n\
+ bne _080F7C24\n\
+ strb r1, [r4]\n\
+_080F7C24:\n\
+ adds r4, 0x1\n\
+ cmp r2, r4\n\
+ bne _080F7C1C\n\
+_080F7C2A:\n\
+ cmp r6, 0\n\
+ bne _080F7C3A\n\
+ movs r0, 0xFC\n\
+ strb r0, [r2]\n\
+ adds r2, 0x1\n\
+ movs r0, 0xF\n\
+ strb r0, [r2]\n\
+ adds r2, 0x1\n\
+_080F7C3A:\n\
+ lsls r0, r7, 16\n\
+ lsrs r6, r0, 16\n\
+ cmp r6, 0x1\n\
+ bls _080F7BB8\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080F7C48: .4byte gSaveBlock1 + 0x2D94\n\
+_080F7C4C: .4byte gSpecialVar_0x8004\n\
+_080F7C50: .4byte gStringVar4\n\
+ .syntax divided");
+}
+
+void sub_80F7C54(void)
+{
+ sub_80F7F80(gSpecialVar_0x8004);
+ MenuDisplayMessageBox();
+ ScriptContext1_Stop();
+}
+
+void sub_80F7C70(void)
+{
+ u16 *scriptPtr = &gScriptResult; // again??
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ *scriptPtr = oldMan->oldMan1.unk_2D95;
+}
+
+void sub_80F7C84(void)
+{
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ oldMan->oldMan1.unk_2D95 = 1;
+}
+
+void sub_80F7C90(void)
+{
+ u16 var = sub_80EB8EC();
+
+ if(var == 0xFFFF)
+ {
+ gScriptResult = FALSE;
+ }
+ else
+ {
+ sub_80EB3FC(gStringVar1, var);
+ gScriptResult = TRUE;
+ }
+}
+
+void sub_80F7CC8(void)
+{
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ if(oldMan->oldMan1.unk_2D95 == 10)
+ {
+ gScriptResult = FALSE;
+ oldMan->oldMan1.unk_2D95 = 0;
+ }
+ else
+ gScriptResult = TRUE;
+}
+
+// someone fix this
+#ifdef NONMATCHING
+void sub_80F7CF4(void)
+{
+ u8 *stringPtr;
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ if(oldMan->oldMan2.unk1 == 0)
+ sub_80F7DC0();
+
+ if(oldMan->oldMan2.mauvilleOldMan_ecArray[oldMan->oldMan2.unk1] != 0xFFFF) // is not the last element of the array?
+ {
+ u16 random = 7 % Random(); // this is a little bit closer, but the compiler prefers an AND instead of division. i assume its because the compiler wants to avoid division by zero, however using an & causes this order to not be close anymore.
+ sub_80EB3FC(gStringVar4, oldMan->oldMan2.mauvilleOldMan_ecArray[oldMan->oldMan2.unk1]);
+ stringPtr = StringCopy(gStringVar4, gOtherText_Is);
+ stringPtr = StringCopy(stringPtr, (u8 *)gUnknown_083E5388[random]);
+ StringCopy(stringPtr, gOtherText_DontYouAgree);
+ }
+ else
+ {
+ StringCopy(gStringVar4, (u8 *)gUnknown_083E53A8[oldMan->oldMan2.mauvilleOldMan_ecArray2[oldMan->oldMan2.unk2++]]);
+ }
+ if(!(Random() % 10))
+ oldMan->oldMan2.unk1 = 10;
+ else
+ oldMan->oldMan2.unk1++;
+
+ gScriptResult = TRUE;
+}
+#else
+__attribute__((naked))
+void sub_80F7CF4(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ ldr r5, _080F7D50 @ =gSaveBlock1 + 0x2D94\n\
+ ldrb r0, [r5, 0x1]\n\
+ cmp r0, 0\n\
+ bne _080F7D02\n\
+ bl sub_80F7DC0\n\
+_080F7D02:\n\
+ ldrb r0, [r5, 0x1]\n\
+ lsls r0, 1\n\
+ adds r6, r5, 0x4\n\
+ adds r0, r6\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _080F7D54 @ =0x0000ffff\n\
+ cmp r1, r0\n\
+ beq _080F7D68\n\
+ bl Random\n\
+ adds r4, r0, 0\n\
+ lsls r4, 16\n\
+ lsrs r4, 16\n\
+ movs r0, 0x7\n\
+ ands r4, r0\n\
+ ldr r0, _080F7D58 @ =gStringVar4\n\
+ ldrb r1, [r5, 0x1]\n\
+ lsls r1, 1\n\
+ adds r1, r6\n\
+ ldrh r1, [r1]\n\
+ bl sub_80EB3FC\n\
+ adds r2, r0, 0\n\
+ ldr r1, _080F7D5C @ =gOtherText_Is\n\
+ bl StringCopy\n\
+ adds r2, r0, 0\n\
+ ldr r0, _080F7D60 @ =gUnknown_083E5388\n\
+ lsls r4, 2\n\
+ adds r4, r0\n\
+ ldr r1, [r4]\n\
+ adds r0, r2, 0\n\
+ bl StringCopy\n\
+ adds r2, r0, 0\n\
+ ldr r1, _080F7D64 @ =gOtherText_DontYouAgree\n\
+ bl StringCopy\n\
+ b _080F7D88\n\
+ .align 2, 0\n\
+_080F7D50: .4byte gSaveBlock1 + 0x2D94\n\
+_080F7D54: .4byte 0x0000ffff\n\
+_080F7D58: .4byte gStringVar4\n\
+_080F7D5C: .4byte gOtherText_Is\n\
+_080F7D60: .4byte gUnknown_083E5388\n\
+_080F7D64: .4byte gOtherText_DontYouAgree\n\
+_080F7D68:\n\
+ ldr r0, _080F7DA0 @ =gStringVar4\n\
+ ldr r3, _080F7DA4 @ =gUnknown_083E53A8\n\
+ ldrb r1, [r5, 0x2]\n\
+ adds r2, r1, 0x1\n\
+ strb r2, [r5, 0x2]\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ adds r2, r5, 0\n\
+ adds r2, 0x18\n\
+ adds r1, r2\n\
+ ldrb r1, [r1]\n\
+ lsls r1, 2\n\
+ adds r1, r3\n\
+ ldr r1, [r1]\n\
+ bl StringCopy\n\
+_080F7D88:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0xA\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ bne _080F7DA8\n\
+ movs r0, 0xA\n\
+ b _080F7DAC\n\
+ .align 2, 0\n\
+_080F7DA0: .4byte gStringVar4\n\
+_080F7DA4: .4byte gUnknown_083E53A8\n\
+_080F7DA8:\n\
+ ldrb r0, [r5, 0x1]\n\
+ adds r0, 0x1\n\
+_080F7DAC:\n\
+ strb r0, [r5, 0x1]\n\
+ ldr r1, _080F7DBC @ =gScriptResult\n\
+ movs r0, 0x1\n\
+ strh r0, [r1]\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080F7DBC: .4byte gScriptResult\n\
+ .syntax divided");
+}
+#endif
diff --git a/src/menu.c b/src/menu.c
index ee9376079..ba98ff057 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -1,13 +1,13 @@
#include "global.h"
#include "menu.h"
#include "main.h"
-#include "text.h"
-#include "songs.h"
-#include "text_window.h"
-#include "sound.h"
-#include "menu_cursor.h"
#include "map_obj_lock.h"
+#include "menu_cursor.h"
#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "text.h"
+#include "text_window.h"
struct Menu
{
@@ -654,7 +654,7 @@ u8 *sub_8072C44(u8 *a1, s32 a2, u8 a3, u8 a4)
return AlignInt2(gMenuWindowPtr, a1, a2, a3, a4);
}
-u8 *sub_8072C74(u8 *a1, u8 *a2, u8 a3, u8 a4)
+u8 *sub_8072C74(u8 *a1, const u8 *a2, u8 a3, u8 a4)
{
return AlignString(gMenuWindowPtr, a1, a2, a3, a4);
}
diff --git a/src/menu_cursor.c b/src/menu_cursor.c
index 201c6c4d8..fa28332df 100644
--- a/src/menu_cursor.c
+++ b/src/menu_cursor.c
@@ -1,24 +1,24 @@
#include "global.h"
#include "menu_cursor.h"
-#include "sprite.h"
#include "palette.h"
+#include "sprite.h"
-extern struct SpriteSheet gUnknown_0842F140[];
-extern struct SpriteSheet gUnknown_0842F1C0[];
-extern struct SpritePalette gUnknown_0842F240;
-extern struct SpritePalette gUnknown_0842F248;
-extern struct SpriteTemplate gSpriteTemplate_842F250[];
-extern struct SpriteTemplate gSpriteTemplate_842F298[];
+extern const struct SpriteSheet gUnknown_0842F140[];
+extern const struct SpriteSheet gUnknown_0842F1C0[];
+extern const struct SpritePalette gUnknown_0842F240;
+extern const struct SpritePalette gUnknown_0842F248;
+extern const struct SpriteTemplate gSpriteTemplate_842F250[];
+extern const struct SpriteTemplate gSpriteTemplate_842F298[];
-extern struct Subsprite *gUnknown_0842F5BC[];
+extern struct Subsprite *const gUnknown_0842F5BC[];
-extern struct SubspriteTable gSubspriteTables_842F5C0[];
-extern struct SubspriteTable gSubspriteTables_842F6C0[];
-extern struct SubspriteTable gUnknown_0842F758[];
+extern const struct SubspriteTable gSubspriteTables_842F5C0[];
+extern const struct SubspriteTable gSubspriteTables_842F6C0[];
+extern const struct SubspriteTable gUnknown_0842F758[];
-extern struct Subsprite gUnknown_0842F780;
-extern struct Subsprite gUnknown_0842F788;
-extern struct Subsprite gUnknown_0842F790;
+extern const struct Subsprite gUnknown_0842F780;
+extern const struct Subsprite gUnknown_0842F788;
+extern const struct Subsprite gUnknown_0842F790;
extern u16 gUnknown_0203A360[];
diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c
index b78e76e10..a7fb5abef 100644
--- a/src/metatile_behavior.c
+++ b/src/metatile_behavior.c
@@ -1,7 +1,251 @@
#include "global.h"
#include "metatile_behaviors.h"
-extern u8 gUnknown_08308E2C[];
+#define TILE_ATTRIBUTES(three, two, one) (((one) ? 1 : 0) | ((two) ? 2 : 0) | ((three) ? 4 : 0))
+
+static const u8 sTileBitAttributes[] =
+{
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
+ TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
+ TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ TILE_ATTRIBUTES(FALSE, FALSE, FALSE)
+};
bool8 MetatileBehavior_IsWaterfall(u8);
@@ -13,7 +257,7 @@ bool8 MetatileBehavior_IsATile(u8 var)
bool8 MetatileBehavior_IsEncounterTile(u8 var)
{
- if((gUnknown_08308E2C[var] & 1) != 0)
+ if ((sTileBitAttributes[var] & 1) != 0)
return TRUE;
else
return FALSE;
@@ -21,7 +265,7 @@ bool8 MetatileBehavior_IsEncounterTile(u8 var)
bool8 MetatileBehavior_IsJumpEast(u8 var)
{
- if(var == MB_JUMP_EAST)
+ if (var == MB_JUMP_EAST)
return TRUE;
else
return FALSE;
@@ -29,7 +273,7 @@ bool8 MetatileBehavior_IsJumpEast(u8 var)
bool8 MetatileBehavior_IsJumpWest(u8 var)
{
- if(var == MB_JUMP_WEST)
+ if (var == MB_JUMP_WEST)
return TRUE;
else
return FALSE;
@@ -37,7 +281,7 @@ bool8 MetatileBehavior_IsJumpWest(u8 var)
bool8 MetatileBehavior_IsJumpNorth(u8 var)
{
- if(var == MB_JUMP_NORTH)
+ if (var == MB_JUMP_NORTH)
return TRUE;
else
return FALSE;
@@ -45,7 +289,7 @@ bool8 MetatileBehavior_IsJumpNorth(u8 var)
bool8 MetatileBehavior_IsJumpSouth(u8 var)
{
- if(var == MB_JUMP_SOUTH)
+ if (var == MB_JUMP_SOUTH)
return TRUE;
else
return FALSE;
@@ -53,7 +297,7 @@ bool8 MetatileBehavior_IsJumpSouth(u8 var)
bool8 MetatileBehavior_IsPokeGrass(u8 var)
{
- if(var == MB_TALL_GRASS || var == MB_LONG_GRASS)
+ if (var == MB_TALL_GRASS || var == MB_LONG_GRASS)
return TRUE;
else
return FALSE;
@@ -61,7 +305,7 @@ bool8 MetatileBehavior_IsPokeGrass(u8 var)
bool8 MetatileBehavior_IsSandOrDeepSand(u8 var)
{
- if(var == MB_SAND || var == MB_DEEP_SAND)
+ if (var == MB_SAND || var == MB_DEEP_SAND)
return TRUE;
else
return FALSE;
@@ -69,7 +313,7 @@ bool8 MetatileBehavior_IsSandOrDeepSand(u8 var)
bool8 MetatileBehavior_IsDeepSand(u8 var)
{
- if(var == MB_DEEP_SAND)
+ if (var == MB_DEEP_SAND)
return TRUE;
else
return FALSE;
@@ -77,7 +321,7 @@ bool8 MetatileBehavior_IsDeepSand(u8 var)
bool8 MetatileBehavior_IsReflective(u8 var)
{
- if(var == MB_POND_WATER || var == MB_PUDDLE || var == MB_1A || var == MB_ICE || var == MB_SOOTOPOLIS_DEEP_WATER || var == MB_REFLECTION_UNDER_BRIDGE)
+ if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_1A || var == MB_ICE || var == MB_SOOTOPOLIS_DEEP_WATER || var == MB_REFLECTION_UNDER_BRIDGE)
return TRUE;
else
return FALSE;
@@ -85,7 +329,7 @@ bool8 MetatileBehavior_IsReflective(u8 var)
bool8 MetatileBehavior_IsIce(u8 var)
{
- if(var == MB_ICE)
+ if (var == MB_ICE)
return TRUE;
else
return FALSE;
@@ -93,7 +337,7 @@ bool8 MetatileBehavior_IsIce(u8 var)
bool8 MetatileBehavior_IsWarpDoor(u8 var)
{
- if(var == MB_ANIMATED_DOOR)
+ if (var == MB_ANIMATED_DOOR)
return TRUE;
else
return FALSE;
@@ -101,7 +345,7 @@ bool8 MetatileBehavior_IsWarpDoor(u8 var)
bool8 MetatileBehavior_IsDoor(u8 var)
{
- if(var == MB_8D || var == MB_ANIMATED_DOOR)
+ if (var == MB_8D || var == MB_ANIMATED_DOOR)
return TRUE;
else
return FALSE;
@@ -109,7 +353,7 @@ bool8 MetatileBehavior_IsDoor(u8 var)
bool8 MetatileBehavior_IsEscalator(u8 var)
{
- if(var == MB_UP_ESCALATOR || var == MB_DOWN_ESCALATOR)
+ if (var == MB_UP_ESCALATOR || var == MB_DOWN_ESCALATOR)
return TRUE;
else
return FALSE;
@@ -117,7 +361,7 @@ bool8 MetatileBehavior_IsEscalator(u8 var)
bool8 unref_sub_8056EE0(u8 var)
{
- if(var == MB_04)
+ if (var == MB_04)
return TRUE;
else
return FALSE;
@@ -125,7 +369,7 @@ bool8 unref_sub_8056EE0(u8 var)
bool8 MetatileBehavior_IsLadder(u8 var)
{
- if(var == MB_LADDER)
+ if (var == MB_LADDER)
return TRUE;
else
return FALSE;
@@ -133,7 +377,7 @@ bool8 MetatileBehavior_IsLadder(u8 var)
bool8 MetatileBehavior_IsNonAnimDoor(u8 var)
{
- if(var == MB_NON_ANIMATED_DOOR || var == MB_WATER_DOOR || var == MB_DEEP_SOUTH_WARP)
+ if (var == MB_NON_ANIMATED_DOOR || var == MB_WATER_DOOR || var == MB_DEEP_SOUTH_WARP)
return TRUE;
else
return FALSE;
@@ -141,7 +385,7 @@ bool8 MetatileBehavior_IsNonAnimDoor(u8 var)
bool8 MetatileBehavior_IsDeepSouthWarp(u8 var)
{
- if(var == MB_DEEP_SOUTH_WARP)
+ if (var == MB_DEEP_SOUTH_WARP)
return TRUE;
else
return FALSE;
@@ -149,7 +393,7 @@ bool8 MetatileBehavior_IsDeepSouthWarp(u8 var)
bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8 var)
{
- if((gUnknown_08308E2C[var] & 2) != 0)
+ if ((sTileBitAttributes[var] & 2) != 0)
return TRUE;
else
return FALSE;
@@ -157,7 +401,7 @@ bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8 var)
bool8 MetatileBehavior_IsEastArrowWarp(u8 var)
{
- if(var == MB_EAST_ARROW_WARP)
+ if (var == MB_EAST_ARROW_WARP)
return TRUE;
else
return FALSE;
@@ -165,7 +409,7 @@ bool8 MetatileBehavior_IsEastArrowWarp(u8 var)
bool8 MetatileBehavior_IsWestArrowWarp(u8 var)
{
- if(var == MB_WEST_ARROW_WARP)
+ if (var == MB_WEST_ARROW_WARP)
return TRUE;
else
return FALSE;
@@ -173,7 +417,7 @@ bool8 MetatileBehavior_IsWestArrowWarp(u8 var)
bool8 MetatileBehavior_IsNorthArrowWarp(u8 var)
{
- if(var == MB_NORTH_ARROW_WARP || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP)
+ if (var == MB_NORTH_ARROW_WARP || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP)
return TRUE;
else
return FALSE;
@@ -181,7 +425,7 @@ bool8 MetatileBehavior_IsNorthArrowWarp(u8 var)
bool8 MetatileBehavior_IsSouthArrowWarp(u8 var)
{
- if(var == MB_SOUTH_ARROW_WARP || var == MB_WATER_SOUTH_ARROW_WARP || var == MB_SHOAL_CAVE_ENTRANCE)
+ if (var == MB_SOUTH_ARROW_WARP || var == MB_WATER_SOUTH_ARROW_WARP || var == MB_SHOAL_CAVE_ENTRANCE)
return TRUE;
else
return FALSE;
@@ -192,7 +436,7 @@ bool8 MetatileBehavior_IsArrowWarp(u8 var)
{
u8 var2 = 0;
- if(MetatileBehavior_IsEastArrowWarp(var)
+ if (MetatileBehavior_IsEastArrowWarp(var)
|| MetatileBehavior_IsWestArrowWarp(var)
|| MetatileBehavior_IsNorthArrowWarp(var)
|| MetatileBehavior_IsSouthArrowWarp(var))
@@ -204,7 +448,7 @@ bool8 MetatileBehavior_IsArrowWarp(u8 var)
bool8 MetatileBehavior_IsMoveTile(u8 var)
{
- if((var >= MB_WALK_EAST && var <= MB_TRICK_HOUSE_PUZZLE_8_FLOOR) || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT)
+ if ((var >= MB_WALK_EAST && var <= MB_TRICK_HOUSE_PUZZLE_8_FLOOR) || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT)
|| var == MB_MUDDY_SLOPE || var == MB_CRACKED_FLOOR || var == MB_WATERFALL || var == MB_ICE || var == MB_BB || var == MB_BC)
return TRUE;
else
@@ -213,7 +457,7 @@ bool8 MetatileBehavior_IsMoveTile(u8 var)
bool8 MetatileBehavior_IsIce_2(u8 var)
{
- if(var == MB_ICE)
+ if (var == MB_ICE)
return TRUE;
else
return FALSE;
@@ -221,7 +465,7 @@ bool8 MetatileBehavior_IsIce_2(u8 var)
bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 var)
{
- if(var == MB_TRICK_HOUSE_PUZZLE_8_FLOOR)
+ if (var == MB_TRICK_HOUSE_PUZZLE_8_FLOOR)
return TRUE;
else
return FALSE;
@@ -229,7 +473,7 @@ bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8 var)
bool8 MetatileBehavior_0x05(u8 var)
{
- if(var == MB_05)
+ if (var == MB_05)
return TRUE;
else
return FALSE;
@@ -237,7 +481,7 @@ bool8 MetatileBehavior_0x05(u8 var)
bool8 MetatileBehavior_IsWalkNorth(u8 var)
{
- if(var == MB_WALK_NORTH)
+ if (var == MB_WALK_NORTH)
return TRUE;
else
return FALSE;
@@ -245,7 +489,7 @@ bool8 MetatileBehavior_IsWalkNorth(u8 var)
bool8 MetatileBehavior_IsWalkSouth(u8 var)
{
- if(var == MB_WALK_SOUTH)
+ if (var == MB_WALK_SOUTH)
return TRUE;
else
return FALSE;
@@ -253,7 +497,7 @@ bool8 MetatileBehavior_IsWalkSouth(u8 var)
bool8 MetatileBehavior_IsWalkWest(u8 var)
{
- if(var == MB_WALK_WEST)
+ if (var == MB_WALK_WEST)
return TRUE;
else
return FALSE;
@@ -261,7 +505,7 @@ bool8 MetatileBehavior_IsWalkWest(u8 var)
bool8 MetatileBehavior_IsWalkEast(u8 var)
{
- if(var == MB_WALK_EAST)
+ if (var == MB_WALK_EAST)
return TRUE;
else
return FALSE;
@@ -269,7 +513,7 @@ bool8 MetatileBehavior_IsWalkEast(u8 var)
bool8 MetatileBehavior_IsNorthwardCurrent(u8 var)
{
- if(var == MB_NORTHWARD_CURRENT)
+ if (var == MB_NORTHWARD_CURRENT)
return TRUE;
else
return FALSE;
@@ -277,7 +521,7 @@ bool8 MetatileBehavior_IsNorthwardCurrent(u8 var)
bool8 MetatileBehavior_IsSouthwardCurrent(u8 var)
{
- if(var == MB_SOUTHWARD_CURRENT)
+ if (var == MB_SOUTHWARD_CURRENT)
return TRUE;
else
return FALSE;
@@ -285,7 +529,7 @@ bool8 MetatileBehavior_IsSouthwardCurrent(u8 var)
bool8 MetatileBehavior_IsWestwardCurrent(u8 var)
{
- if(var == MB_WESTWARD_CURRENT)
+ if (var == MB_WESTWARD_CURRENT)
return TRUE;
else
return FALSE;
@@ -293,7 +537,7 @@ bool8 MetatileBehavior_IsWestwardCurrent(u8 var)
bool8 MetatileBehavior_IsEastwardCurrent(u8 var)
{
- if(var == MB_EASTWARD_CURRENT)
+ if (var == MB_EASTWARD_CURRENT)
return TRUE;
else
return FALSE;
@@ -301,7 +545,7 @@ bool8 MetatileBehavior_IsEastwardCurrent(u8 var)
bool8 MetatileBehavior_IsSlideNorth(u8 var)
{
- if(var == MB_SLIDE_NORTH)
+ if (var == MB_SLIDE_NORTH)
return TRUE;
else
return FALSE;
@@ -309,7 +553,7 @@ bool8 MetatileBehavior_IsSlideNorth(u8 var)
bool8 MetatileBehavior_IsSlideSouth(u8 var)
{
- if(var == MB_SLIDE_SOUTH)
+ if (var == MB_SLIDE_SOUTH)
return TRUE;
else
return FALSE;
@@ -317,7 +561,7 @@ bool8 MetatileBehavior_IsSlideSouth(u8 var)
bool8 MetatileBehavior_IsSlideWest(u8 var)
{
- if(var == MB_SLIDE_WEST)
+ if (var == MB_SLIDE_WEST)
return TRUE;
else
return FALSE;
@@ -325,7 +569,7 @@ bool8 MetatileBehavior_IsSlideWest(u8 var)
bool8 MetatileBehavior_IsSlideEast(u8 var)
{
- if(var == MB_SLIDE_EAST)
+ if (var == MB_SLIDE_EAST)
return TRUE;
else
return FALSE;
@@ -333,7 +577,7 @@ bool8 MetatileBehavior_IsSlideEast(u8 var)
bool8 MetatileBehavior_IsCounter(u8 var)
{
- if(var == MB_COUNTER)
+ if (var == MB_COUNTER)
return TRUE;
else
return FALSE;
@@ -341,9 +585,9 @@ bool8 MetatileBehavior_IsCounter(u8 var)
bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 tile, u8 playerDir)
{
- if(playerDir != CONNECTION_NORTH) // if the player isn't facing north, forget about it.
+ if (playerDir != CONNECTION_NORTH) // if the player isn't facing north, forget about it.
return FALSE;
- else if(tile == MB_TELEVISION) // is the player's north tile a TV?
+ else if (tile == MB_TELEVISION) // is the player's north tile a TV?
return TRUE;
else
return FALSE;
@@ -351,7 +595,7 @@ bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 tile, u8 playerDir)
bool8 MetatileBehavior_IsPC(u8 var)
{
- if(var == MB_PC)
+ if (var == MB_PC)
return TRUE;
else
return FALSE;
@@ -359,7 +603,7 @@ bool8 MetatileBehavior_IsPC(u8 var)
bool8 is_tile_x84(u8 var)
{
- if(var == MB_84)
+ if (var == MB_84)
return TRUE;
else
return FALSE;
@@ -367,7 +611,7 @@ bool8 is_tile_x84(u8 var)
bool8 sub_80571C0(u8 var)
{
- if(var == MB_91 || var == MB_93 || var == MB_95 || var == MB_97
+ if (var == MB_91 || var == MB_93 || var == MB_95 || var == MB_97
|| var == MB_99 || var == MB_9B || var == MB_9D)
return TRUE;
else
@@ -376,7 +620,7 @@ bool8 sub_80571C0(u8 var)
bool8 MetatileBehavior_IsSecretBaseCave(u8 var)
{
- if(var == MB_SECRET_BASE_SPOT_RED_CAVE || var == MB_SECRET_BASE_SPOT_BROWN_CAVE || var == MB_SECRET_BASE_SPOT_YELLOW_CAVE || var == MB_SECRET_BASE_SPOT_BLUE_CAVE)
+ if (var == MB_SECRET_BASE_SPOT_RED_CAVE || var == MB_SECRET_BASE_SPOT_BROWN_CAVE || var == MB_SECRET_BASE_SPOT_YELLOW_CAVE || var == MB_SECRET_BASE_SPOT_BLUE_CAVE)
return TRUE;
else
return FALSE;
@@ -384,7 +628,7 @@ bool8 MetatileBehavior_IsSecretBaseCave(u8 var)
bool8 MetatileBehavior_IsSecretBaseTree(u8 var)
{
- if(var == MB_SECRET_BASE_SPOT_TREE_1 || var == MB_SECRET_BASE_SPOT_TREE_2)
+ if (var == MB_SECRET_BASE_SPOT_TREE_1 || var == MB_SECRET_BASE_SPOT_TREE_2)
return TRUE;
else
return FALSE;
@@ -392,7 +636,7 @@ bool8 MetatileBehavior_IsSecretBaseTree(u8 var)
bool8 MetatileBehavior_IsSecretBaseShrub(u8 var)
{
- if(var == MB_SECRET_BASE_SPOT_SHRUB)
+ if (var == MB_SECRET_BASE_SPOT_SHRUB)
return TRUE;
else
return FALSE;
@@ -400,7 +644,7 @@ bool8 MetatileBehavior_IsSecretBaseShrub(u8 var)
bool8 MetatileBehavior_IsSecretBasePC(u8 var)
{
- if(var == MB_SECRET_BASE_PC)
+ if (var == MB_SECRET_BASE_PC)
return TRUE;
else
return FALSE;
@@ -408,7 +652,7 @@ bool8 MetatileBehavior_IsSecretBasePC(u8 var)
bool8 sub_805724C(u8 var)
{
- if(var == MB_B1)
+ if (var == MB_B1)
return TRUE;
else
return FALSE;
@@ -416,7 +660,7 @@ bool8 sub_805724C(u8 var)
bool8 unref_sub_8057260(u8 var)
{
- if(var == MB_B2)
+ if (var == MB_B2)
return TRUE;
else
return FALSE;
@@ -424,7 +668,7 @@ bool8 unref_sub_8057260(u8 var)
bool8 sub_8057274(u8 var)
{
- if(var == MB_B3)
+ if (var == MB_B3)
return TRUE;
else
return FALSE;
@@ -432,7 +676,7 @@ bool8 sub_8057274(u8 var)
bool8 sub_8057288(u8 var)
{
- if(var == MB_B9)
+ if (var == MB_B9)
return TRUE;
else
return FALSE;
@@ -440,7 +684,7 @@ bool8 sub_8057288(u8 var)
bool8 sub_805729C(u8 var)
{
- if(var == MB_NORMAL)
+ if (var == MB_NORMAL)
return TRUE;
else
return FALSE;
@@ -448,7 +692,7 @@ bool8 sub_805729C(u8 var)
bool8 sub_80572B0(u8 var)
{
- if(var == MB_B7)
+ if (var == MB_B7)
return TRUE;
else
return FALSE;
@@ -456,7 +700,7 @@ bool8 sub_80572B0(u8 var)
bool8 unref_sub_80572C4(u8 var)
{
- if(var == MB_B2)
+ if (var == MB_B2)
return TRUE;
else
return FALSE;
@@ -464,7 +708,7 @@ bool8 unref_sub_80572C4(u8 var)
bool8 sub_80572D8(u8 var)
{
- if(var == MB_B5)
+ if (var == MB_B5)
return TRUE;
else
return FALSE;
@@ -472,7 +716,7 @@ bool8 sub_80572D8(u8 var)
bool8 sub_80572EC(u8 var)
{
- if(var == MB_C3)
+ if (var == MB_C3)
return TRUE;
else
return FALSE;
@@ -480,7 +724,7 @@ bool8 sub_80572EC(u8 var)
bool8 sub_8057300(u8 var)
{
- if(var == MB_C2)
+ if (var == MB_C2)
return TRUE;
else
return FALSE;
@@ -488,7 +732,7 @@ bool8 sub_8057300(u8 var)
bool8 sub_8057314(u8 var)
{
- if(var == MB_B8)
+ if (var == MB_B8)
return TRUE;
else
return FALSE;
@@ -496,7 +740,7 @@ bool8 sub_8057314(u8 var)
bool8 sub_8057328(u8 var)
{
- if(var == MB_BE)
+ if (var == MB_BE)
return TRUE;
else
return FALSE;
@@ -504,7 +748,7 @@ bool8 sub_8057328(u8 var)
bool8 sub_805733C(u8 var)
{
- if(var == MB_BD)
+ if (var == MB_BD)
return TRUE;
else
return FALSE;
@@ -512,7 +756,7 @@ bool8 sub_805733C(u8 var)
bool8 sub_8057350(u8 var)
{
- if(var == MB_BA)
+ if (var == MB_BA)
return TRUE;
else
return FALSE;
@@ -520,7 +764,7 @@ bool8 sub_8057350(u8 var)
bool8 sub_8057364(u8 var)
{
- if(var == MB_BF)
+ if (var == MB_BF)
return TRUE;
else
return FALSE;
@@ -528,7 +772,7 @@ bool8 sub_8057364(u8 var)
bool8 sub_8057378(u8 var)
{
- if(var == MB_C4)
+ if (var == MB_C4)
return TRUE;
else
return FALSE;
@@ -536,7 +780,7 @@ bool8 sub_8057378(u8 var)
bool8 sub_805738C(u8 var)
{
- if(var == MB_C5)
+ if (var == MB_C5)
return TRUE;
else
return FALSE;
@@ -544,7 +788,7 @@ bool8 sub_805738C(u8 var)
bool8 MetatileBehavior_HasRipples(u8 var)
{
- if(var == MB_POND_WATER || var == MB_PUDDLE || var == MB_SOOTOPOLIS_DEEP_WATER)
+ if (var == MB_POND_WATER || var == MB_PUDDLE || var == MB_SOOTOPOLIS_DEEP_WATER)
return TRUE;
else
return FALSE;
@@ -552,7 +796,7 @@ bool8 MetatileBehavior_HasRipples(u8 var)
bool8 MetatileBehavior_IsPuddle(u8 var)
{
- if(var == MB_PUDDLE)
+ if (var == MB_PUDDLE)
return TRUE;
else
return FALSE;
@@ -560,7 +804,7 @@ bool8 MetatileBehavior_IsPuddle(u8 var)
bool8 MetatileBehavior_IsTallGrass(u8 var)
{
- if(var == MB_TALL_GRASS)
+ if (var == MB_TALL_GRASS)
return TRUE;
else
return FALSE;
@@ -568,7 +812,7 @@ bool8 MetatileBehavior_IsTallGrass(u8 var)
bool8 MetatileBehavior_IsLongGrass(u8 var)
{
- if(var == MB_LONG_GRASS)
+ if (var == MB_LONG_GRASS)
return TRUE;
else
return FALSE;
@@ -576,15 +820,15 @@ bool8 MetatileBehavior_IsLongGrass(u8 var)
bool8 MetatileBehavior_IsBerryTreeSoil(u8 var)
{
- if(var == MB_BERRY_TREE_SOIL)
+ if (var == MB_BERRY_TREE_SOIL)
return TRUE;
else
return FALSE;
}
-bool8 MetatileBehavior_IsAsh(u8 var)
+bool8 MetatileBehavior_IsAshGrass(u8 var)
{
- if(var == MB_ASH)
+ if (var == MB_ASHGRASS)
return TRUE;
else
return FALSE;
@@ -592,7 +836,7 @@ bool8 MetatileBehavior_IsAsh(u8 var)
bool8 MetatileBehavior_IsUnusedFootprintMetatile(u8 var)
{
- if(var == MB_25)
+ if (var == MB_25)
return TRUE;
else
return FALSE;
@@ -600,7 +844,7 @@ bool8 MetatileBehavior_IsUnusedFootprintMetatile(u8 var)
bool8 MetatileBehavior_IsBridge(u8 var)
{
- if(var >= MB_WARP_OR_BRIDGE && var <= MB_ROUTE120_NORTH_BRIDGE_2)
+ if (var >= MB_WARP_OR_BRIDGE && var <= MB_ROUTE120_NORTH_BRIDGE_2)
return TRUE;
else
return FALSE;
@@ -610,7 +854,7 @@ u8 sub_8057450(u8 var)
{
u8 result = var - MB_WARP_OR_BRIDGE;
- if(result > 3)
+ if (result > 3)
result = 0;
return result;
@@ -618,7 +862,7 @@ u8 sub_8057450(u8 var)
bool8 MetatileBehavior_IsLandWildEncounter(u8 var)
{
- if(MetatileBehavior_IsSurfableWaterOrUnderwater(var) == FALSE && MetatileBehavior_IsEncounterTile(var) == TRUE)
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == FALSE && MetatileBehavior_IsEncounterTile(var) == TRUE)
return TRUE;
else
return FALSE;
@@ -626,7 +870,7 @@ bool8 MetatileBehavior_IsLandWildEncounter(u8 var)
bool8 MetatileBehavior_IsWaterWildEncounter(u8 var)
{
- if(MetatileBehavior_IsSurfableWaterOrUnderwater(var) == TRUE && MetatileBehavior_IsEncounterTile(var) == TRUE)
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) == TRUE && MetatileBehavior_IsEncounterTile(var) == TRUE)
return TRUE;
else
return FALSE;
@@ -634,7 +878,7 @@ bool8 MetatileBehavior_IsWaterWildEncounter(u8 var)
bool8 sub_80574C4(u8 var)
{
- if(var == MB_0B)
+ if (var == MB_0B)
return TRUE;
else
return FALSE;
@@ -642,15 +886,15 @@ bool8 sub_80574C4(u8 var)
bool8 sub_80574D8(u8 var)
{
- if(var == MB_MOUNTAIN_TOP)
+ if (var == MB_MOUNTAIN_TOP)
return TRUE;
else
- return FALSE;
+ return FALSE;
}
bool8 sub_80574EC(u8 var)
{
- if(var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER)
+ if (var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER)
return TRUE;
else
return FALSE;
@@ -658,7 +902,7 @@ bool8 sub_80574EC(u8 var)
bool8 sub_805750C(u8 var)
{
- if(var == MB_NO_SURFACING || var == MB_SEAWEED_NO_SURFACING)
+ if (var == MB_NO_SURFACING || var == MB_SEAWEED_NO_SURFACING)
return TRUE;
else
return FALSE;
@@ -666,7 +910,7 @@ bool8 sub_805750C(u8 var)
bool8 MetatileBehavior_IsShallowFlowingWater(u8 var)
{
- if(var == MB_SHALLOW_WATER || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP || var == MB_SHOAL_CAVE_ENTRANCE)
+ if (var == MB_SHALLOW_WATER || var == MB_STAIRS_OUTSIDE_ABANDONED_SHIP || var == MB_SHOAL_CAVE_ENTRANCE)
return TRUE;
else
return FALSE;
@@ -674,7 +918,7 @@ bool8 MetatileBehavior_IsShallowFlowingWater(u8 var)
bool8 MetatileBehavior_IsThinIce(u8 var)
{
- if(var == MB_THIN_ICE)
+ if (var == MB_THIN_ICE)
return TRUE;
else
return FALSE;
@@ -682,7 +926,7 @@ bool8 MetatileBehavior_IsThinIce(u8 var)
bool8 MetatileBehavior_IsCrackedIce(u8 var)
{
- if(var == MB_CRACKED_ICE)
+ if (var == MB_CRACKED_ICE)
return TRUE;
else
return FALSE;
@@ -690,7 +934,7 @@ bool8 MetatileBehavior_IsCrackedIce(u8 var)
bool8 sub_8057568(u8 var)
{
- if(var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER)
+ if (var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER)
return TRUE;
else
return FALSE;
@@ -698,7 +942,7 @@ bool8 sub_8057568(u8 var)
bool8 unref_sub_8057584(u8 var)
{
- if(var == MB_18 || var == MB_1A)
+ if (var == MB_18 || var == MB_1A)
return TRUE;
else
return FALSE;
@@ -706,7 +950,7 @@ bool8 unref_sub_8057584(u8 var)
bool8 sub_805759C(u8 var)
{
- if(MetatileBehavior_IsSurfableWaterOrUnderwater(var) && MetatileBehavior_IsWaterfall(var) == FALSE)
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(var) && MetatileBehavior_IsWaterfall(var) == FALSE)
return TRUE;
else
return FALSE;
@@ -714,7 +958,7 @@ bool8 sub_805759C(u8 var)
bool8 MetatileBehavior_IsEastBlocked(u8 var)
{
- if(var == MB_IMPASSABLE_EAST || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_SOUTHEAST || var == MB_C1 || var == MB_BE)
+ if (var == MB_IMPASSABLE_EAST || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_SOUTHEAST || var == MB_C1 || var == MB_BE)
return TRUE;
else
return FALSE;
@@ -722,7 +966,7 @@ bool8 MetatileBehavior_IsEastBlocked(u8 var)
bool8 MetatileBehavior_IsWestBlocked(u8 var)
{
- if(var == MB_IMPASSABLE_WEST || var == MB_IMPASSABLE_NORTHWEST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_C1 || var == MB_BE)
+ if (var == MB_IMPASSABLE_WEST || var == MB_IMPASSABLE_NORTHWEST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_C1 || var == MB_BE)
return TRUE;
else
return FALSE;
@@ -730,7 +974,7 @@ bool8 MetatileBehavior_IsWestBlocked(u8 var)
bool8 MetatileBehavior_IsNorthBlocked(u8 var)
{
- if(var == MB_IMPASSABLE_NORTH || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_NORTHWEST || var == MB_BED)
+ if (var == MB_IMPASSABLE_NORTH || var == MB_IMPASSABLE_NORTHEAST || var == MB_IMPASSABLE_NORTHWEST || var == MB_BED)
return TRUE;
else
return FALSE;
@@ -738,7 +982,7 @@ bool8 MetatileBehavior_IsNorthBlocked(u8 var)
bool8 MetatileBehavior_IsSouthBlocked(u8 var)
{
- if(var == MB_IMPASSABLE_SOUTH || var == MB_IMPASSABLE_SOUTHEAST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_BED)
+ if (var == MB_IMPASSABLE_SOUTH || var == MB_IMPASSABLE_SOUTHEAST || var == MB_IMPASSABLE_SOUTHWEST || var == MB_BED)
return TRUE;
else
return FALSE;
@@ -746,7 +990,7 @@ bool8 MetatileBehavior_IsSouthBlocked(u8 var)
bool8 MetatileBehavior_IsShortGrass(u8 var)
{
- if(var == MB_SHORT_GRASS)
+ if (var == MB_SHORT_GRASS)
return TRUE;
else
return FALSE;
@@ -754,7 +998,7 @@ bool8 MetatileBehavior_IsShortGrass(u8 var)
bool8 MetatileBehavior_IsHotSprings(u8 var)
{
- if(var == MB_HOT_SPRINGS)
+ if (var == MB_HOT_SPRINGS)
return TRUE;
else
return FALSE;
@@ -762,7 +1006,7 @@ bool8 MetatileBehavior_IsHotSprings(u8 var)
bool8 MetatileBehavior_IsWaterfall(u8 var)
{
- if(var == MB_WATERFALL)
+ if (var == MB_WATERFALL)
return TRUE;
else
return FALSE;
@@ -770,7 +1014,7 @@ bool8 MetatileBehavior_IsWaterfall(u8 var)
bool8 MetatileBehavior_IsFortreeBridge(u8 var)
{
- if(var == MB_FORTREE_BRIDGE)
+ if (var == MB_FORTREE_BRIDGE)
return TRUE;
else
return FALSE;
@@ -778,7 +1022,7 @@ bool8 MetatileBehavior_IsFortreeBridge(u8 var)
bool8 sub_80576A0(u8 var)
{
- if(var == MB_PACIFIDLOG_VERTICAL_LOG_1)
+ if (var == MB_PACIFIDLOG_VERTICAL_LOG_1)
return TRUE;
else
return FALSE;
@@ -786,7 +1030,7 @@ bool8 sub_80576A0(u8 var)
bool8 sub_80576B4(u8 var)
{
- if(var == MB_PACIFIDLOG_VERTICAL_LOG_2)
+ if (var == MB_PACIFIDLOG_VERTICAL_LOG_2)
return TRUE;
else
return FALSE;
@@ -794,7 +1038,7 @@ bool8 sub_80576B4(u8 var)
bool8 sub_80576C8(u8 var)
{
- if(var == MB_PACIFIDLOG_HORIZONTAL_LOG_1)
+ if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_1)
return TRUE;
else
return FALSE;
@@ -802,7 +1046,7 @@ bool8 sub_80576C8(u8 var)
bool8 sub_80576DC(u8 var)
{
- if(var == MB_PACIFIDLOG_HORIZONTAL_LOG_2)
+ if (var == MB_PACIFIDLOG_HORIZONTAL_LOG_2)
return TRUE;
else
return FALSE;
@@ -810,7 +1054,7 @@ bool8 sub_80576DC(u8 var)
bool8 MetatileBehavior_IsPacifidlogLog(u8 var)
{
- if(var >= MB_PACIFIDLOG_VERTICAL_LOG_1 && var <= MB_PACIFIDLOG_HORIZONTAL_LOG_2)
+ if (var >= MB_PACIFIDLOG_VERTICAL_LOG_1 && var <= MB_PACIFIDLOG_HORIZONTAL_LOG_2)
return TRUE;
else
return FALSE;
@@ -818,7 +1062,7 @@ bool8 MetatileBehavior_IsPacifidlogLog(u8 var)
bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8 var)
{
- if(var == MB_TRICK_HOUSE_PUZZLE_DOOR)
+ if (var == MB_TRICK_HOUSE_PUZZLE_DOOR)
return TRUE;
else
return FALSE;
@@ -826,15 +1070,15 @@ bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8 var)
bool8 MetatileBehavior_IsRegionMap(u8 var)
{
- if(var == MB_REGION_MAP)
+ if (var == MB_REGION_MAP)
return TRUE;
else
return FALSE;
}
-bool8 MetatileBehavior_IsClosedSootpolisGymDoor(u8 var)
+bool8 MetatileBehavior_IsClosedSootopolisGymDoor(u8 var)
{
- if(var == MB_CLOSED_SOOTOPOLIS_GYM_DOOR)
+ if (var == MB_CLOSED_SOOTOPOLIS_GYM_DOOR)
return TRUE;
else
return FALSE;
@@ -842,7 +1086,7 @@ bool8 MetatileBehavior_IsClosedSootpolisGymDoor(u8 var)
bool8 MetatileBehavior_IsRoulette(u8 var)
{
- if(var == MB_ROULETTE)
+ if (var == MB_ROULETTE)
return TRUE;
else
return FALSE;
@@ -850,7 +1094,7 @@ bool8 MetatileBehavior_IsRoulette(u8 var)
bool8 MetatileBehavior_IsPokeblockFeeder(u8 var)
{
- if(var == MB_POKEBLOCK_FEEDER)
+ if (var == MB_POKEBLOCK_FEEDER)
return TRUE;
else
return FALSE;
@@ -858,7 +1102,7 @@ bool8 MetatileBehavior_IsPokeblockFeeder(u8 var)
bool8 MetatileBehavior_0xBB(u8 var)
{
- if(var == MB_BB)
+ if (var == MB_BB)
return TRUE;
else
return FALSE;
@@ -866,7 +1110,7 @@ bool8 MetatileBehavior_0xBB(u8 var)
bool8 MetatileBehavior_0xBC(u8 var)
{
- if(var == MB_BC)
+ if (var == MB_BC)
return TRUE;
else
return FALSE;
@@ -874,7 +1118,7 @@ bool8 MetatileBehavior_0xBC(u8 var)
bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 var)
{
- if(var == MB_LAVARIDGE_GYM_B1F_WARP)
+ if (var == MB_LAVARIDGE_GYM_B1F_WARP)
return TRUE;
else
return FALSE;
@@ -882,7 +1126,7 @@ bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 var)
bool8 MetatileBehavior_IsLavaridge1FWarp(u8 var)
{
- if(var == MB_LAVARIDGE_GYM_1F_WARP)
+ if (var == MB_LAVARIDGE_GYM_1F_WARP)
return TRUE;
else
return FALSE;
@@ -890,7 +1134,7 @@ bool8 MetatileBehavior_IsLavaridge1FWarp(u8 var)
bool8 MetatileBehavior_IsAquaHideoutWarp(u8 var)
{
- if(var == MB_AQUA_HIDEOUT_WARP)
+ if (var == MB_AQUA_HIDEOUT_WARP)
return TRUE;
else
return FALSE;
@@ -898,7 +1142,7 @@ bool8 MetatileBehavior_IsAquaHideoutWarp(u8 var)
bool8 MetatileBehavior_IsSurfableFishableWater(u8 var)
{
- if(var == MB_POND_WATER || var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT))
+ if (var == MB_POND_WATER || var == MB_OCEAN_WATER || var == MB_SEMI_DEEP_WATER || var == MB_DEEP_WATER || var == MB_SOOTOPOLIS_DEEP_WATER || (var >= MB_EASTWARD_CURRENT && var <= MB_SOUTHWARD_CURRENT))
return TRUE;
else
return FALSE;
@@ -906,7 +1150,7 @@ bool8 MetatileBehavior_IsSurfableFishableWater(u8 var)
bool8 MetatileBehavior_IsMtPyreHole(u8 var)
{
- if(var == MB_MT_PYRE_HOLE)
+ if (var == MB_MT_PYRE_HOLE)
return TRUE;
else
return FALSE;
@@ -914,7 +1158,7 @@ bool8 MetatileBehavior_IsMtPyreHole(u8 var)
bool8 MetatileBehavior_IsCrackedFloorHole(u8 var)
{
- if(var == MB_CRACKED_FLOOR_HOLE)
+ if (var == MB_CRACKED_FLOOR_HOLE)
return TRUE;
else
return FALSE;
@@ -922,7 +1166,7 @@ bool8 MetatileBehavior_IsCrackedFloorHole(u8 var)
bool8 MetatileBehavior_IsCrackedFloor(u8 var)
{
- if(var == MB_CRACKED_FLOOR)
+ if (var == MB_CRACKED_FLOOR)
return TRUE;
else
return FALSE;
@@ -930,7 +1174,7 @@ bool8 MetatileBehavior_IsCrackedFloor(u8 var)
bool8 MetatileBehavior_IsMuddySlope(u8 var)
{
- if(var == MB_MUDDY_SLOPE)
+ if (var == MB_MUDDY_SLOPE)
return TRUE;
else
return FALSE;
@@ -938,7 +1182,7 @@ bool8 MetatileBehavior_IsMuddySlope(u8 var)
bool8 MetatileBehavior_IsBumpySlope(u8 var)
{
- if(var == MB_BUMPY_SLOPE)
+ if (var == MB_BUMPY_SLOPE)
return TRUE;
else
return FALSE;
@@ -946,7 +1190,7 @@ bool8 MetatileBehavior_IsBumpySlope(u8 var)
bool8 MetatileBehavior_IsIsolatedVerticalRail(u8 var)
{
- if(var == MB_ISOLATED_VERTICAL_RAIL)
+ if (var == MB_ISOLATED_VERTICAL_RAIL)
return TRUE;
else
return FALSE;
@@ -954,7 +1198,7 @@ bool8 MetatileBehavior_IsIsolatedVerticalRail(u8 var)
bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 var)
{
- if(var == MB_ISOLATED_HORIZONTAL_RAIL)
+ if (var == MB_ISOLATED_HORIZONTAL_RAIL)
return TRUE;
else
return FALSE;
@@ -962,7 +1206,7 @@ bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8 var)
bool8 MetatileBehavior_IsVerticalRail(u8 var)
{
- if(var == MB_VERTICAL_RAIL)
+ if (var == MB_VERTICAL_RAIL)
return TRUE;
else
return FALSE;
@@ -970,7 +1214,7 @@ bool8 MetatileBehavior_IsVerticalRail(u8 var)
bool8 MetatileBehavior_IsHorizontalRail(u8 var)
{
- if(var == MB_HORIZONTAL_RAIL)
+ if (var == MB_HORIZONTAL_RAIL)
return TRUE;
else
return FALSE;
@@ -978,7 +1222,7 @@ bool8 MetatileBehavior_IsHorizontalRail(u8 var)
bool8 MetatileBehavior_IsSeaweed(u8 var)
{
- if(var == MB_SEAWEED || var == MB_SEAWEED_NO_SURFACING)
+ if (var == MB_SEAWEED || var == MB_SEAWEED_NO_SURFACING)
return TRUE;
else
return FALSE;
@@ -986,15 +1230,15 @@ bool8 MetatileBehavior_IsSeaweed(u8 var)
bool8 MetatileBehavior_IsRunningDisallowed(u8 var)
{
- if(var == MB_NO_RUNNING || var == MB_LONG_GRASS || var == MB_HOT_SPRINGS || MetatileBehavior_IsPacifidlogLog(var) != FALSE)
+ if (var == MB_NO_RUNNING || var == MB_LONG_GRASS || var == MB_HOT_SPRINGS || MetatileBehavior_IsPacifidlogLog(var) != FALSE)
return TRUE;
else
return FALSE;
}
-bool8 sub_80578F8(u8 var)
+bool8 MetatileBehavior_IsCuttableGrass(u8 var)
{
- if(var == MB_TALL_GRASS || var == MB_LONG_GRASS || var == MB_ASH || var == MB_LONG_GRASS_SOUTH_EDGE)
+ if (var == MB_TALL_GRASS || var == MB_LONG_GRASS || var == MB_ASHGRASS || var == MB_LONG_GRASS_SOUTH_EDGE)
return TRUE;
else
return FALSE;
@@ -1002,7 +1246,7 @@ bool8 sub_80578F8(u8 var)
bool8 sub_805791C(u8 var)
{
- if(var == MB_8E)
+ if (var == MB_8E)
return TRUE;
else
return FALSE;
@@ -1010,7 +1254,7 @@ bool8 sub_805791C(u8 var)
bool8 MetatileBehavior_IsPictureBookShelf(u8 var)
{
- if(var == MB_PICTURE_BOOK_SHELF)
+ if (var == MB_PICTURE_BOOK_SHELF)
return TRUE;
else
return FALSE;
@@ -1018,7 +1262,7 @@ bool8 MetatileBehavior_IsPictureBookShelf(u8 var)
bool8 MetatileBehavior_IsBookShelf(u8 var)
{
- if(var == MB_BOOKSHELF)
+ if (var == MB_BOOKSHELF)
return TRUE;
else
return FALSE;
@@ -1026,7 +1270,7 @@ bool8 MetatileBehavior_IsBookShelf(u8 var)
bool8 MetatileBehavior_IsPokeCenterBookShelf(u8 var)
{
- if(var == MB_POKEMON_CENTER_BOOKSHELF)
+ if (var == MB_POKEMON_CENTER_BOOKSHELF)
return TRUE;
else
return FALSE;
@@ -1034,7 +1278,7 @@ bool8 MetatileBehavior_IsPokeCenterBookShelf(u8 var)
bool8 MetatileBehavior_IsVase(u8 var)
{
- if(var == MB_VASE)
+ if (var == MB_VASE)
return TRUE;
else
return FALSE;
@@ -1042,7 +1286,7 @@ bool8 MetatileBehavior_IsVase(u8 var)
bool8 MetatileBehavior_IsTrashCan(u8 var)
{
- if(var == MB_TRASH_CAN)
+ if (var == MB_TRASH_CAN)
return TRUE;
else
return FALSE;
@@ -1050,7 +1294,7 @@ bool8 MetatileBehavior_IsTrashCan(u8 var)
bool8 MetatileBehavior_IsShopShelf(u8 var)
{
- if(var == MB_SHOP_SHELF)
+ if (var == MB_SHOP_SHELF)
return TRUE;
else
return FALSE;
@@ -1058,7 +1302,7 @@ bool8 MetatileBehavior_IsShopShelf(u8 var)
bool8 MetatileBehavior_IsBlueprint(u8 var)
{
- if(var == MB_BLUEPRINT)
+ if (var == MB_BLUEPRINT)
return TRUE;
else
return FALSE;
diff --git a/src/money.c b/src/money.c
index 2a59cab50..e73ee506a 100644
--- a/src/money.c
+++ b/src/money.c
@@ -14,51 +14,74 @@ extern const struct SpriteSheet gUnknown_083CF584;
extern const struct SpritePalette gUnknown_083CF58C;
extern const struct SpriteTemplate gSpriteTemplate_83CF56C;
-bool8 IsEnoughMoney(u32 budget, u32 cost) {
- if (budget >= cost) {
+bool8 IsEnoughMoney(u32 budget, u32 cost)
+{
+ if (budget >= cost)
+ {
return TRUE;
}
return FALSE;
}
-void sub_80B79B8(u32 *arg0, u32 arg1) {
- if (*arg0 > *arg0 + arg1) {
+void sub_80B79B8(u32 *arg0, u32 arg1)
+{
+ if (*arg0 > *arg0 + arg1)
+ {
*arg0 = 999999;
return;
}
*arg0 = *arg0 + arg1;
- if (*arg0 > 999999) {
+ if (*arg0 > 999999)
+ {
*arg0 = 999999;
}
}
-void sub_80B79E0(u32 *arg0, u32 arg1) {
- if (*arg0 < arg1) {
+void sub_80B79E0(u32 *arg0, u32 arg1)
+{
+ if (*arg0 < arg1)
+ {
*arg0 = 0;
- } else {
+ }
+ else
+ {
*arg0 = *arg0 - arg1;
}
}
-void sub_80B79F8(u8 *buffer, u32 arg1, u8 arg2) {
+void sub_80B79F8(u8 *buffer, u32 arg1, u8 arg2)
+{
u8 width;
u8 i;
- if (arg1 > 999999) {
+ if (arg1 > 999999)
+ {
width = 7;
- } else if (arg1 > 99999) {
+ }
+ else if (arg1 > 99999)
+ {
width = 6;
- } else if (arg1 > 10000) {
+ }
+ else if (arg1 > 10000)
+ {
width = 5;
- } else if (arg1 > 999) {
+ }
+ else if (arg1 > 999)
+ {
width = 4;
- } else if (arg1 > 99) {
+ }
+ else if (arg1 > 99)
+ {
width = 3;
- } else if (arg1 > 9) {
+ }
+ else if (arg1 > 9)
+ {
width = 2;
- } else {
+ }
+ else
+ {
width = 1;
}
@@ -67,7 +90,8 @@ void sub_80B79F8(u8 *buffer, u32 arg1, u8 arg2) {
buffer[2] = 0x06;
buffer += 3;
- for (i = 0; i < arg2 - width; i++) {
+ for (i = 0; i < arg2 - width; i++)
+ {
buffer[0] = CHAR_SPACE;
buffer += 1;
}
@@ -83,7 +107,8 @@ void sub_80B79F8(u8 *buffer, u32 arg1, u8 arg2) {
buffer[3] = EOS;
}
-void sub_80B7A94(u32 arg0, u8 size, u8 x, u8 y) {
+void sub_80B7A94(u32 arg0, u8 size, u8 x, u8 y)
+{
u8 buffer[16];
u8 stringWidth;
@@ -99,7 +124,8 @@ void sub_80B7A94(u32 arg0, u8 size, u8 x, u8 y) {
}
}
-void sub_80B7AEC(u32 arg0, u8 left, u8 top) {
+void sub_80B7AEC(u32 arg0, u8 left, u8 top)
+{
u8 buffer[32];
u8 *ptr;
@@ -119,7 +145,8 @@ void sub_80B7AEC(u32 arg0, u8 left, u8 top) {
}
__attribute__((naked))
-void sub_80B7B34(void) {
+void sub_80B7B34(void)
+{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r9\n\
@@ -211,11 +238,13 @@ _080B7BE8: .4byte 0x0600f840\n\
.syntax divided\n");
}
-void sub_80B7BEC(u32 arg0, u8 x, u8 y) {
+void sub_80B7BEC(u32 arg0, u8 x, u8 y)
+{
sub_80B7A94(arg0, 6, x + 6, y + 1);
}
-void sub_80B7C14(u32 arg0, u8 x, u8 y) {
+void sub_80B7C14(u32 arg0, u8 x, u8 y)
+{
MenuDrawTextWindow(x, y, x + 13, y + 3);
sub_80B7BEC(arg0, x, y);
@@ -225,16 +254,19 @@ void sub_80B7C14(u32 arg0, u8 x, u8 y) {
gUnknown_02038734 = CreateSprite(&gSpriteTemplate_83CF56C, x * 8 + 19, y * 8 + 11, 0);
}
-void RemoveMoneyLabelObject(u8 x, u8 y) {
+void RemoveMoneyLabelObject(u8 x, u8 y)
+{
DestroySpriteAndFreeResources(&gSprites[gUnknown_02038734]);
FreeSpritePaletteByTag(SPRITE_TAG_MONEY);
MenuZeroFillWindowRect(x, y, x + 13, y + 3);
}
-bool8 sub_80B7CE8(void) {
+bool8 sub_80B7CE8(void)
+{
return IsEnoughMoney(gSaveBlock1.money, gSpecialVar_0x8005);
}
-void sub_80B7D0C(void) {
+void sub_80B7D0C(void)
+{
sub_80B79E0(&gSaveBlock1.money, gSpecialVar_0x8005);
}
diff --git a/src/mori_debug_menu.c b/src/mori_debug_menu.c
index 645aecc9e..9f586dcb9 100644
--- a/src/mori_debug_menu.c
+++ b/src/mori_debug_menu.c
@@ -1,11 +1,11 @@
#include "global.h"
#include "mori_debug_menu.h"
#include "asm.h"
-#include "start_menu.h"
-#include "menu.h"
+#include "link.h"
#include "main.h"
+#include "menu.h"
+#include "start_menu.h"
#include "string_util.h"
-#include "link.h"
#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT)
@@ -49,7 +49,7 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr)
u8 localPtr[52];
u16 monData;
u16 var;
-
+
monData = GetMonData(gPlayerParty, 11, ptr);
var = sub_8041870(monData);
StringCopy(localPtr, gSpeciesNames[monData]);
@@ -85,14 +85,14 @@ s8 MoriDebugMenu_1000Steps(void)
{
sub_8041790(1000);
CloseMenu();
- return 1;
+ return 1;
}
s8 MoriDebugMenu_10000Steps(void)
{
sub_8041790(10000);
CloseMenu();
- return 1;
+ return 1;
}
s8 MoriDebugMenu_MoveTutor(void)
@@ -106,7 +106,7 @@ s8 MoriDebugMenu_BreedEgg(void)
{
u8 loopCounter;
- for(loopCounter = 0; loopCounter <= 5; loopCounter++)
+ for (loopCounter = 0; loopCounter <= 5; loopCounter++)
{
//UB: Too few arguments for function 'GetMonData'
if ( GetMonData(&gPlayerParty[loopCounter], MON_DATA_IS_EGG) )
@@ -130,10 +130,10 @@ s8 MoriDebugMenu_LongName(void)
s8 MoriDebugMenu_PokeblockCase(void)
{
s32 loopCounter;
-
- for(loopCounter = 0; loopCounter <= 39; loopCounter++)
+
+ for (loopCounter = 0; loopCounter <= 39; loopCounter++)
sub_810CA6C((u8)loopCounter);
-
+
CloseMenu();
return 1;
}
diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c
index 09523ff40..693b28948 100644
--- a/src/mystery_event_menu.c
+++ b/src/mystery_event_menu.c
@@ -1,17 +1,17 @@
#include "global.h"
-#include "sprite.h"
-#include "menu.h"
+#include "mystery_event_menu.h"
+#include "asm.h"
#include "link.h"
-#include "text.h"
#include "main.h"
+#include "menu.h"
#include "palette.h"
-#include "task.h"
-#include "string_util.h"
+#include "save.h"
#include "songs.h"
#include "sound.h"
-#include "save.h"
-#include "asm.h"
-#include "mystery_event_menu.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
extern u8 unk_2000000[];
extern u8 gUnknown_02039338;
@@ -295,7 +295,7 @@ static void CB2_MysteryEventMenu(void)
unkVal = sub_812613C(unk_2000000);
CpuFill32(0, unk_2000000, 0x7D4);
if (!GetEventLoadMessage(gStringVar4, unkVal))
- sub_8125D44(0);
+ TrySavingData(NORMAL_SAVE);
gMain.state++;
break;
case 12:
diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c
index 4aa3784d7..515a0722f 100644
--- a/src/mystery_event_script.c
+++ b/src/mystery_event_script.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "script.h"
#include "string_util.h"
+#include "text.h"
#ifdef SAPPHIRE
#define UNK_MASK 0x100
diff --git a/src/name_string_util.c b/src/name_string_util.c
new file mode 100644
index 000000000..a1812d5e9
--- /dev/null
+++ b/src/name_string_util.c
@@ -0,0 +1,39 @@
+#include "global.h"
+#include "string_util.h"
+#include "text.h"
+
+void PadNameString(u8 *a1, u8 a2)
+{
+ u8 i;
+
+ StripExtCtrlCodes(a1);
+ i = StringLength(a1);
+
+ if (a2 == 0xFC)
+ {
+ while (i < 6)
+ {
+ a1[i] = 0xFC;
+ a1[i + 1] = 7;
+ i += 2;
+ }
+ }
+ else
+ {
+ while (i < 6)
+ {
+ a1[i] = a2;
+ i++;
+ }
+ }
+
+ a1[i] = EOS;
+}
+
+void SanitizeNameString(u8 *a1)
+{
+ if (StringLength(a1) < 6)
+ ConvertInternationalString(a1, 1);
+ else
+ StripExtCtrlCodes(a1);
+}
diff --git a/src/naming_screen.c b/src/naming_screen.c
new file mode 100644
index 000000000..54a796264
--- /dev/null
+++ b/src/naming_screen.c
@@ -0,0 +1,2008 @@
+#include "global.h"
+#include "asm.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "trig.h"
+#include "naming_screen.h"
+
+extern u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8);
+extern u8 CreateMonIcon();
+extern void sub_809D51C(void);
+extern void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8);
+
+extern u16 gKeyRepeatStartDelay;
+
+extern u8 unk_2000000[];
+
+#define namingScreenData (*(struct NamingScreenData *)(unk_2000000))
+
+const u32 gSpriteImage_83CE094[] = INCBIN_U32("graphics/naming_screen/pc_icon/0.4bpp");
+const u32 gSpriteImage_83CE154[] = INCBIN_U32("graphics/naming_screen/pc_icon/1.4bpp");
+
+//Some unused pointer, perhaps.
+asm(".section .rodata\n\
+@ XXX: what is this?\n\
+ .align 2\n\
+ .4byte 0x2000000\n");
+
+extern u16 *const gUnknown_083CE28C[];
+extern const struct SubspriteTable gSubspriteTables_83CE558[];
+extern const struct SubspriteTable gSubspriteTables_83CE560[];
+extern const struct SubspriteTable gSubspriteTables_83CE578[];
+extern const struct SubspriteTable gSubspriteTables_83CE580[];
+extern const struct SpriteTemplate gSpriteTemplate_83CE5C8;
+extern const struct SpriteTemplate gSpriteTemplate_83CE5E0;
+extern const struct SpriteTemplate gSpriteTemplate_83CE5F8;
+extern const struct SpriteTemplate gSpriteTemplate_83CE610;
+extern const struct SpriteTemplate gSpriteTemplate_83CE628;
+extern const struct SpriteTemplate gSpriteTemplate_83CE640;
+extern const struct SpriteTemplate gSpriteTemplate_83CE658;
+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[];
+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);
+static void StoreNamingScreenParameters(u8, u8 *, u16, u16, u32, MainCallback);
+static void NamingScreen_TurnOffScreen(void);
+static void NamingScreen_Init(void);
+static void NamingScreen_ClearVram(void);
+static void NamingScreen_ClearOam(void);
+static void NamingScreen_SetUpVideoRegs(void);
+static void NamingScreen_SetUpWindow(void);
+static void NamingScreen_ResetObjects(void);
+static void sub_80B5DFC(void);
+static void sub_80B5E20(void);
+static void sub_80B5E3C(void);
+static void NamingScreen_InitDisplayMode(void);
+static void Task_DoNothing(u8);
+static void sub_80B7558(void);
+static void sub_80B753C(void);
+static void sub_80B7680(void);
+static void sub_80B75C4(void);
+static void sub_80B7794(void);
+static void sub_80B78A8(void);
+static void sub_80B7960(void);
+static void CursorInit(void);
+static void sub_80B6A80(void);
+static void sub_80B6CA8(void);
+static void sub_80B6D04(void);
+static void sub_80B6E44(void);
+static void InputInit(void);
+static void sub_80B6438(void);
+static void sub_80B5E50(void);
+static void Task_NamingScreenMain(u8);
+static void SetInputState(u8);
+static void sub_80B68D8(u8);
+static bool8 HandleKeyboardEvent(void);
+static bool8 IsCursorAnimFinished(void);
+static void MoveCursorToOKButton(void);
+static void sub_80B6B14(void);
+static void StartPageSwapAnim(void);
+static void sub_80B6888(u8);
+static void sub_80B6460(u8, u8, u8);
+static bool8 IsPageSwapAnimNotInProgress(void);
+static void sub_80B7614(void);
+static void GetCursorPos(s16 *, s16 *);
+static void SetCursorPos(s16, s16);
+static void sub_80B77F8(void);
+static void sub_80B74B0(void);
+static void DisplaySentToPCMessage(void);
+static u8 GetKeyRoleAtCursorPos(void);
+static u8 sub_80B61C8(void);
+static void DeleteTextCharacter(void);
+static void sub_80B7090(void);
+static u8 GetInputEvent(void);
+static bool8 sub_80B7004(void);
+static void sub_80B6914(void);
+static void Task_HandlePageSwapAnim(u8);
+static void sub_80B6C48(u8, struct Sprite *, struct Sprite *);
+static u8 GetTextCaretPosition(void);
+static u8 GetCharAtKeyboardPos(s16, s16);
+static bool8 sub_80B7104(void);
+static bool8 sub_80B713C(void);
+static void AddTextCharacter(u8);
+static bool8 sub_80B7198(u8);
+static bool8 sub_80B7264(u8);
+static void sub_80B7370(u8, u8);
+static void sub_80B73CC(u8, u8);
+static bool8 sub_80B71E4(u8);
+static void sub_80B7474(u8, u8);
+static void sub_80B72A4(u8, u8);
+static bool8 sub_80B720C(u8);
+static void sub_80B7568(void);
+static void sub_80B75B0(void);
+static void sub_80B7698(u16 *, const u16 *);
+static void sub_80B76E0();
+static void nullsub_20(u8, u8);
+static void PrintKeyboardCharacters(u8);
+
+void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback)
+{
+ StoreNamingScreenParameters(templateNum, destBuffer, c, d, e, returnCallback);
+ SetMainCallback2(C2_NamingScreen);
+}
+
+static void C2_NamingScreen(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ NamingScreen_TurnOffScreen();
+ NamingScreen_Init();
+ gMain.state++;
+ break;
+ case 1:
+ NamingScreen_ClearVram();
+ gMain.state++;
+ break;
+ case 2:
+ NamingScreen_ClearOam();
+ gMain.state++;
+ break;
+ case 3:
+ NamingScreen_SetUpVideoRegs();
+ gMain.state++;
+ break;
+ case 4:
+ NamingScreen_SetUpWindow();
+ gMain.state++;
+ break;
+ case 5:
+ NamingScreen_ResetObjects();
+ gMain.state++;
+ break;
+ case 6:
+ sub_80B5DFC();
+ gMain.state++;
+ break;
+ case 7:
+ sub_80B5E20();
+ sub_80B5E3C();
+ NamingScreen_InitDisplayMode();
+ SetMainCallback2(sub_80B5AA0);
+ break;
+ }
+}
+
+static void sub_80B5AA0(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+static void VBlankCB_NamingScreen(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ REG_BG1VOFS = namingScreenData.bg1vOffset;
+ REG_BG2VOFS = namingScreenData.bg2vOffset;
+ REG_BG1CNT &= 0xFFFC;
+ REG_BG1CNT |= namingScreenData.unk8;
+ REG_BG2CNT &= 0xFFFC;
+ REG_BG2CNT |= namingScreenData.unkA;
+}
+
+static void StoreNamingScreenParameters(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback)
+{
+ struct Task *task;
+
+ //Create a task that does nothing, and use it as a temporary space to store parameters
+ task = &gTasks[CreateTask(Task_DoNothing, 0xFF)];
+ task->data[0] = templateNum;
+ task->data[1] = c;
+ task->data[2] = d;
+ task->data[3] = e >> 16;
+ task->data[4] = e;
+ StoreWordInTwoHalfwords(&task->data[5], (u32)destBuffer);
+ StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback);
+}
+
+static void GetNamingScreenParameters(void)
+{
+ u8 taskId;
+ struct Task *task;
+
+ taskId = FindTaskIdByFunc(Task_DoNothing);
+ task = &gTasks[taskId];
+ namingScreenData.templateNum = task->data[0];
+ namingScreenData.unk3E = task->data[1];
+ namingScreenData.unk40 = task->data[2];
+ namingScreenData.unk42 = (task->data[3] << 16) | (u16)task->data[4];
+ LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenData.destBuffer);
+ LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenData.returnCallback);
+ DestroyTask(taskId);
+}
+
+static void Task_DoNothing(u8 taskId)
+{
+}
+
+static void NamingScreen_TurnOffScreen(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+ REG_DISPCNT = 0;
+}
+
+static void NamingScreen_InitDisplayMode(void)
+{
+ u16 savedIme;
+
+ SetVBlankCallback(VBlankCB_NamingScreen);
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+}
+
+static void NamingScreen_ClearVram(void)
+{
+ u8 *addr = (void *)VRAM;
+ u32 size = 0x10000;
+
+ while (1)
+ {
+ DmaFill16(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill16(3, 0, addr, size);
+ break;
+ }
+ }
+}
+
+static void NamingScreen_ClearOam(void)
+{
+ DmaClear16(3, (void *)OAM, 0x400);
+}
+
+static void NamingScreen_SetUpVideoRegs(void)
+{
+ REG_BG0CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG3CNT = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG0CNT = 0x1F00;
+ REG_BG1CNT = 0x1C01;
+ REG_BG2CNT = 0x1D0A;
+ REG_BG3CNT = 0x1E03;
+ REG_BLDCNT = 0x640;
+ REG_BLDALPHA = 0x80C;
+}
+
+static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; //forward declaration
+
+static void NamingScreen_Init(void)
+{
+ GetNamingScreenParameters();
+ namingScreenData.state = 0;
+ namingScreenData.bg1vOffset = 0;
+ namingScreenData.bg2vOffset = 0;
+ namingScreenData.unk8 = 1;
+ namingScreenData.unkA = 2;
+ namingScreenData.unkC = 0;
+ namingScreenData.unkD = 1;
+ namingScreenData.template = sNamingScreenTemplates[namingScreenData.templateNum];
+ namingScreenData.currentPage = namingScreenData.template->unk4;
+ namingScreenData.unk2 = 14 - namingScreenData.template->maxChars / 2;
+ namingScreenData.unk3C = gKeyRepeatStartDelay;
+ memset(namingScreenData.textBuffer, 0xFF, sizeof(namingScreenData.textBuffer));
+ if (namingScreenData.template->unk0 != 0)
+ StringCopy(namingScreenData.textBuffer, namingScreenData.destBuffer);
+ gKeyRepeatStartDelay = 16;
+}
+
+static void NamingScreen_SetUpWindow(void)
+{
+ SetUpWindowConfig(&gWindowConfig_81E6E88);
+ InitMenuWindow(&gWindowConfig_81E6E88);
+}
+
+static void NamingScreen_ResetObjects(void)
+{
+ ResetPaletteFade();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+}
+
+static void sub_80B5DFC(void)
+{
+ sub_80B7558();
+ sub_80B753C();
+ sub_80B7680();
+ sub_80B75C4();
+ sub_80B7794();
+ sub_80B78A8();
+ sub_80B7960();
+}
+
+static void sub_80B5E20(void)
+{
+ CursorInit();
+ sub_80B6A80();
+ sub_80B6CA8();
+ sub_80B6D04();
+ sub_80B6E44();
+}
+
+static void sub_80B5E3C(void)
+{
+ InputInit();
+ sub_80B6438();
+ sub_80B5E50();
+}
+
+//--------------------------------------------------
+// Naming screen main
+//--------------------------------------------------
+
+static bool8 MainState_BeginFadeIn(struct Task *);
+static bool8 MainState_WaitFadeIn(struct Task *);
+static bool8 MainState_HandleInput(struct Task *);
+static bool8 MainState_MoveToOKButton(struct Task *);
+static bool8 MainState_StartPageSwap(struct Task *);
+static bool8 MainState_WaitPageSwap(struct Task *);
+static bool8 MainState_6(struct Task *);
+static bool8 MainState_UpdateSentToPCMessage(struct Task *);
+static bool8 MainState_BeginFadeInOut(struct Task *);
+static bool8 MainState_WaitFadeOutAndExit(struct Task *);
+
+static bool8 (*const sMainStateFuncs[])(struct Task *) =
+{
+ MainState_BeginFadeIn,
+ MainState_WaitFadeIn,
+ MainState_HandleInput,
+ MainState_MoveToOKButton,
+ MainState_StartPageSwap,
+ MainState_WaitPageSwap,
+ MainState_6,
+ MainState_UpdateSentToPCMessage,
+ MainState_BeginFadeInOut,
+ MainState_WaitFadeOutAndExit,
+};
+
+static void sub_80B5E50(void)
+{
+ u8 taskId;
+
+ taskId = CreateTask(Task_NamingScreenMain, 2);
+ Task_NamingScreenMain(taskId);
+}
+
+static void Task_NamingScreenMain(u8 taskId)
+{
+ while (sMainStateFuncs[namingScreenData.state](&gTasks[taskId]) != 0)
+ ;
+}
+
+static bool8 MainState_BeginFadeIn(struct Task *task)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ namingScreenData.state++;
+ return 0;
+}
+
+static bool8 MainState_WaitFadeIn(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ SetInputState(INPUT_STATE_ENABLED);
+ sub_80B68D8(1);
+ namingScreenData.state++;
+ }
+ return FALSE;
+}
+
+static bool8 MainState_HandleInput(struct Task *task)
+{
+ return HandleKeyboardEvent();
+}
+
+static bool8 MainState_MoveToOKButton(struct Task *task)
+{
+ if (IsCursorAnimFinished())
+ {
+ SetInputState(INPUT_STATE_ENABLED);
+ MoveCursorToOKButton();
+ namingScreenData.state = MAIN_STATE_HANDLE_INPUT;
+ }
+ return FALSE;
+}
+
+static bool8 MainState_StartPageSwap(struct Task *task)
+{
+ SetInputState(INPUT_STATE_DISABLED);
+ sub_80B6B14();
+ StartPageSwapAnim();
+ sub_80B6888(1);
+ sub_80B6460(0, 0, 1);
+ PlaySE(SE_WIN_OPEN);
+ namingScreenData.state = MAIN_STATE_WAIT_PAGE_SWAP;
+ return FALSE;
+}
+
+static bool8 MainState_WaitPageSwap(struct Task *task)
+{
+ s16 cursorX;
+ s16 cursorY;
+
+ if (IsPageSwapAnimNotInProgress())
+ {
+ namingScreenData.state = MAIN_STATE_HANDLE_INPUT;
+ namingScreenData.currentPage++;
+ namingScreenData.currentPage %= 3;
+ sub_80B7614();
+ sub_80B77F8();
+ SetInputState(INPUT_STATE_ENABLED);
+ GetCursorPos(&cursorX, &cursorY);
+ if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7))
+ cursorX = 5;
+ SetCursorPos(cursorX, cursorY);
+ sub_80B6888(0);
+ }
+ return FALSE;
+}
+
+static bool8 MainState_6(struct Task *task)
+{
+ sub_80B74B0();
+ SetInputState(INPUT_STATE_DISABLED);
+ sub_80B68D8(0);
+ sub_80B6460(3, 0, 1);
+ gKeyRepeatStartDelay = namingScreenData.unk3C;
+ if (namingScreenData.templateNum == NAMING_SCREEN_TEMPLATE_MON_NAME
+ && CalculatePlayerPartyCount() >= 6)
+ {
+ DisplaySentToPCMessage();
+ namingScreenData.state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE;
+ return FALSE;
+ }
+ else
+ {
+ namingScreenData.state = MAIN_STATE_BEGIN_FADE_OUT;
+ return TRUE; //Exit the naming screen
+ }
+}
+
+static bool8 MainState_UpdateSentToPCMessage(struct Task *task)
+{
+ if (MenuUpdateWindowText())
+ namingScreenData.state++;
+ return FALSE;
+}
+
+static bool8 MainState_BeginFadeInOut(struct Task *task)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ namingScreenData.state++;
+ return FALSE;
+}
+
+static bool8 MainState_WaitFadeOutAndExit(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ SetMainCallback2(namingScreenData.returnCallback);
+ return FALSE;
+}
+
+//--------------------------------------------------
+// Keyboard handling
+//--------------------------------------------------
+
+enum
+{
+ KEY_ROLE_CHAR,
+ KEY_ROLE_PAGE,
+ KEY_ROLE_BACKSPACE,
+ KEY_ROLE_OK,
+};
+
+
+static bool8 KeyboardKeyHandler_Character(u8);
+static bool8 KeyboardKeyHandler_Page(u8);
+static bool8 KeyboardKeyHandler_Backspace(u8);
+static bool8 KeyboardKeyHandler_OK(u8);
+
+static bool8 (*const sKeyboardKeyHandlers[])(u8) =
+{
+ KeyboardKeyHandler_Character,
+ KeyboardKeyHandler_Page,
+ KeyboardKeyHandler_Backspace,
+ KeyboardKeyHandler_OK,
+};
+
+static bool8 HandleKeyboardEvent(void)
+{
+ u8 event = GetInputEvent();
+ u8 keyRole = GetKeyRoleAtCursorPos();
+
+ if (event == KBEVENT_PRESSED_SELECT)
+ return sub_80B61C8();
+ else if (event == KBEVENT_PRESSED_B)
+ {
+ DeleteTextCharacter();
+ return FALSE;
+ }
+ else if (event == 7)
+ {
+ sub_80B7090();
+ return FALSE;
+ }
+ return sKeyboardKeyHandlers[keyRole](event);
+}
+
+static bool8 KeyboardKeyHandler_Character(u8 event)
+{
+ sub_80B6460(3, 0, 0);
+ if (event == KBEVENT_PRESSED_A)
+ {
+ u8 var = sub_80B7004();
+
+ sub_80B6914();
+ if (var)
+ {
+ SetInputState(INPUT_STATE_DISABLED);
+ namingScreenData.state = MAIN_STATE_MOVE_TO_OK_BUTTON;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_Page(u8 event)
+{
+ sub_80B6460(0, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ return sub_80B61C8();
+ else
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_Backspace(u8 event)
+{
+ sub_80B6460(1, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ DeleteTextCharacter();
+ return FALSE;
+}
+
+static bool8 KeyboardKeyHandler_OK(u8 event)
+{
+ sub_80B6460(2, 1, 0);
+ if (event == KBEVENT_PRESSED_A)
+ {
+ PlaySE(SE_SELECT);
+ namingScreenData.state = MAIN_STATE_6;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static bool8 sub_80B61C8(void)
+{
+ namingScreenData.state = MAIN_STATE_START_PAGE_SWAP;
+ return TRUE;
+}
+
+//--------------------------------------------------
+// Input handling
+//--------------------------------------------------
+
+enum
+{
+ FNKEY_CASE,
+ FNKEY_BACK,
+ FNKEY_OK,
+};
+
+#define tState data[0]
+#define tKeyboardEvent data[1]
+#define tKbFunctionKey data[2]
+
+static void InputState_Disabled(struct Task *);
+static void InputState_Enabled(struct Task *);
+
+static void (*const sInputStateFuncs[])(struct Task *) =
+{
+ InputState_Disabled,
+ InputState_Enabled,
+};
+
+static void Task_HandleInput(u8);
+static void HandleDpadMovement(struct Task *);
+
+static void InputInit(void)
+{
+ CreateTask(Task_HandleInput, 1);
+}
+
+static u8 GetInputEvent(void)
+{
+ u8 taskId = FindTaskIdByFunc(Task_HandleInput);
+
+ return gTasks[taskId].tKeyboardEvent;
+}
+
+static void SetInputState(u8 state)
+{
+ u8 taskId = FindTaskIdByFunc(Task_HandleInput);
+
+ gTasks[taskId].tState = state;
+}
+
+static void Task_HandleInput(u8 taskId)
+{
+ sInputStateFuncs[gTasks[taskId].tState](&gTasks[taskId]);
+}
+
+static void InputState_Disabled(struct Task *task)
+{
+ task->tKeyboardEvent = 0;
+}
+
+static void InputState_Enabled(struct Task *task)
+{
+ task->tKeyboardEvent = 0;
+ if (gMain.newKeys & A_BUTTON)
+ {
+ task->tKeyboardEvent = KBEVENT_PRESSED_A;
+ return;
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ task->tKeyboardEvent = KBEVENT_PRESSED_B;
+ return;
+ }
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ task->tKeyboardEvent = KBEVENT_PRESSED_SELECT;
+ return;
+ }
+ if (gMain.newKeys & START_BUTTON)
+ {
+ task->tKeyboardEvent = KBEVENT_PRESSED_START;
+ MoveCursorToOKButton();
+ return;
+ }
+ HandleDpadMovement(task);
+}
+
+static const s16 sDpadDeltaX[] =
+{
+ 0, //none
+ 0, //up
+ 0, //down
+ -1, //left
+ 1 //right
+};
+
+static const s16 sDpadDeltaY[] =
+{
+ 0, //none
+ -1, //up
+ 1, //down
+ 0, //left
+ 0 //right
+};
+
+static const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2};
+static const s16 gUnknown_083CE274[] = {0, 0, 3, 0};
+
+static void HandleDpadMovement(struct Task *task)
+{
+ s16 cursorX;
+ s16 cursorY;
+ u16 dpadDir;
+ s16 prevCursorX;
+
+ GetCursorPos(&cursorX, &cursorY);
+ dpadDir = 0;
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ dpadDir = 1;
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ dpadDir = 2;
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ dpadDir = 3;
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ dpadDir = 4;
+
+ //Get new cursor position
+ prevCursorX = cursorX;
+ cursorX += sDpadDeltaX[dpadDir];
+ cursorY += sDpadDeltaY[dpadDir];
+
+ //Wrap cursor position in the X direction
+ if (cursorX < 0)
+ cursorX = 8;
+ if (cursorX > 8)
+ cursorX = 0;
+
+ //Handle cursor movement in X direction
+ if (sDpadDeltaX[dpadDir] != 0)
+ {
+ //The "others" page only has 5 columns
+ if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7))
+ {
+ if (sDpadDeltaX[dpadDir] > 0)
+ cursorX = 8;
+ else
+ cursorX = 5;
+ }
+
+ if (cursorX == 8)
+ {
+ //We are now on the last column
+ task->tKbFunctionKey = cursorY;
+ cursorY = s4RowTo3RowTableY[cursorY];
+ }
+ else if (prevCursorX == 8)
+ {
+ if (cursorY == 1)
+ cursorY = task->tKbFunctionKey;
+ else
+ cursorY = gUnknown_083CE274[cursorY];
+ }
+ }
+
+ if (cursorX == 8)
+ {
+ //There are only 3 keys on the last column, unlike the others,
+ //so wrap Y accordingly
+ if (cursorY < 0)
+ cursorY = 2;
+ if (cursorY > 2)
+ cursorY = 0;
+ if (cursorY == 0)
+ task->tKbFunctionKey = FNKEY_BACK;
+ else if (cursorY == 2)
+ task->tKbFunctionKey = FNKEY_OK;
+ }
+ else
+ {
+ if (cursorY < 0)
+ cursorY = 3;
+ if (cursorY > 3)
+ cursorY = 0;
+ }
+ SetCursorPos(cursorX, cursorY);
+}
+
+#undef tState
+#undef tKeyboardEvent
+#undef tKbFunctionKey
+
+//--------------------------------------------------
+//
+//--------------------------------------------------
+
+static void Task_80B64D4(u8);
+static u16 sub_80B654C(u8);
+static void sub_80B65AC(u8);
+static void sub_80B65D4(struct Task *, u8, u8);
+
+static void sub_80B6438(void)
+{
+ u8 taskId;
+
+ taskId = CreateTask(Task_80B64D4, 3);
+ gTasks[taskId].data[0] = 3;
+}
+
+static void sub_80B6460(u8 a, u8 b, u8 c)
+{
+ struct Task *task = &gTasks[FindTaskIdByFunc(Task_80B64D4)];
+
+ if (a == task->data[0] && c == 0)
+ {
+ task->data[1] = b;
+ task->data[2] = 1;
+ return;
+ }
+ if (a == 3 && task->data[1] == 0 && c == 0)
+ return;
+ if (task->data[0] != 3)
+ sub_80B65AC(task->data[0]);
+ sub_80B65D4(task, a, b);
+}
+
+static void Task_80B64D4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ if (task->data[0] == 3 || task->data[2] == 0)
+ return;
+ MultiplyInvertedPaletteRGBComponents(sub_80B654C(task->data[0]), task->data[3], task->data[3], task->data[3]);
+ if (task->data[5] != 0)
+ {
+ task->data[5]--;
+ if (task->data[5] != 0)
+ return;
+ }
+ task->data[5] = 2;
+ task->data[3] += task->data[4];
+ if (task->data[3] == 16)
+ task->data[4] = -task->data[4];
+ else if (task->data[3] == 0)
+ {
+ task->data[2] = task->data[1];
+ task->data[4] = -task->data[4];
+ }
+}
+
+static u16 sub_80B654C(u8 a)
+{
+ const u16 arr[] =
+ {
+ IndexOfSpritePaletteTag(4) * 16 + 0x10E,
+ IndexOfSpritePaletteTag(6) * 16 + 0x10C,
+ IndexOfSpritePaletteTag(6) * 16 + 0x10E,
+ };
+
+ return arr[a];
+}
+
+static void sub_80B65AC(u8 a)
+{
+ u16 index = sub_80B654C(a);
+
+ gPlttBufferFaded[index] = gPlttBufferUnfaded[index];
+}
+
+static void sub_80B65D4(struct Task *task, u8 b, u8 c)
+{
+ task->data[0] = b;
+ task->data[1] = c;
+ task->data[2] = 1;
+ task->data[3] = 15;
+ task->data[4] = 1;
+ task->data[5] = 0;
+}
+
+//--------------------------------------------------
+// Page Swap
+//--------------------------------------------------
+
+#define tState data[0]
+#define tFrameCount data[1]
+
+static bool8 PageSwapAnimState_Init(struct Task *);
+static bool8 PageSwapAnimState_1(struct Task *);
+static bool8 PageSwapAnimState_2(struct Task *);
+static bool8 PageSwapAnimState_Done(struct Task *);
+
+static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) =
+{
+ PageSwapAnimState_Init,
+ PageSwapAnimState_1,
+ PageSwapAnimState_2,
+ PageSwapAnimState_Done,
+};
+
+static void StartPageSwapAnim(void)
+{
+ u8 taskId;
+
+ taskId = CreateTask(Task_HandlePageSwapAnim, 0);
+ Task_HandlePageSwapAnim(taskId);
+}
+
+static bool8 IsPageSwapAnimNotInProgress(void)
+{
+ if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void Task_HandlePageSwapAnim(u8 taskId)
+{
+ while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]) != 0)
+ ;
+}
+
+static bool8 PageSwapAnimState_Init(struct Task *task)
+{
+ namingScreenData.bg1vOffset = 0;
+ namingScreenData.bg2vOffset = 0;
+ task->tState++;
+ return 0;
+}
+
+static bool8 PageSwapAnimState_1(struct Task *task)
+{
+ u16 *const arr[] =
+ {
+ &namingScreenData.bg2vOffset,
+ &namingScreenData.bg1vOffset
+ };
+
+ task->tFrameCount += 4;
+ *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40);
+ *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ if (task->tFrameCount >= 64)
+ {
+ u8 temp = namingScreenData.unk8; //Why u8 and not u16?
+
+ namingScreenData.unk8 = namingScreenData.unkA;
+ namingScreenData.unkA = temp;
+ task->tState++;
+ }
+ return 0;
+}
+
+static bool8 PageSwapAnimState_2(struct Task *task)
+{
+ u16 *const arr[] = {&namingScreenData.bg2vOffset, &namingScreenData.bg1vOffset};
+
+ task->tFrameCount += 4;
+ *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40);
+ *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40);
+ if (task->tFrameCount >= 128)
+ {
+ u8 temp = namingScreenData.unkC;
+
+ namingScreenData.unkC = namingScreenData.unkD;
+ namingScreenData.unkD = temp;
+ task->tState++;
+ }
+ return 0;
+}
+
+static bool8 PageSwapAnimState_Done(struct Task *task)
+{
+ DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim));
+ return 0;
+}
+
+#undef tState
+#undef tFrameCount
+
+//--------------------------------------------------
+// Cursor
+//--------------------------------------------------
+
+static void CursorInit(void)
+{
+ namingScreenData.cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0);
+ gSprites[namingScreenData.cursorSpriteId].oam.priority = 1;
+ gSprites[namingScreenData.cursorSpriteId].oam.objMode = 1;
+ gSprites[namingScreenData.cursorSpriteId].data6 = 1;
+ gSprites[namingScreenData.cursorSpriteId].data6 = 2;
+ SetCursorPos(0, 0);
+}
+
+static const u8 sKeyboardSymbolPositions[][9] =
+{
+ {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Upper page
+ {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Lower page
+ {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page
+};
+
+static u8 CursorColToKeyboardCol(s16 x)
+{
+ return sKeyboardSymbolPositions[namingScreenData.currentPage][x];
+}
+
+static void SetCursorPos(s16 x, s16 y)
+{
+ struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId];
+
+ cursorSprite->pos1.x = CursorColToKeyboardCol(x) * 8 + 27;
+ cursorSprite->pos1.y = y * 16 + 80;
+ cursorSprite->data2 = cursorSprite->data0;
+ cursorSprite->data3 = cursorSprite->data1;
+ cursorSprite->data0 = x;
+ cursorSprite->data1 = y;
+}
+
+static void GetCursorPos(s16 *x, s16 *y)
+{
+ struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId];
+
+ *x = cursorSprite->data0;
+ *y = cursorSprite->data1;
+}
+
+static void MoveCursorToOKButton(void)
+{
+ SetCursorPos(8, 2);
+}
+
+static void sub_80B6888(u8 a)
+{
+ gSprites[namingScreenData.cursorSpriteId].data4 &= -256;
+ gSprites[namingScreenData.cursorSpriteId].data4 |= a;
+ StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 0);
+}
+
+static void sub_80B68D8(u8 a)
+{
+ gSprites[namingScreenData.cursorSpriteId].data4 &= 0xFF;
+ gSprites[namingScreenData.cursorSpriteId].data4 |= a << 8;
+}
+
+static void sub_80B6914(void)
+{
+ StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 1);
+}
+
+static bool8 IsCursorAnimFinished(void)
+{
+ return gSprites[namingScreenData.cursorSpriteId].animEnded;
+}
+
+static u8 GetKeyRoleAtCursorPos(void)
+{
+ const u8 keyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK};
+ s16 cursorX;
+ s16 cursorY;
+
+ GetCursorPos(&cursorX, &cursorY);
+ if (cursorX < 8)
+ return KEY_ROLE_CHAR;
+ else
+ return keyRoles[cursorY];
+}
+
+void sub_80B6998(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ StartSpriteAnim(sprite, 0);
+ sprite->invisible = (sprite->data4 & 0xFF);
+ if (sprite->data0 == 8)
+ sprite->invisible = TRUE;
+ if (sprite->invisible || (sprite->data4 & 0xFF00) == 0
+ || sprite->data0 != sprite->data2 || sprite->data1 != sprite->data3)
+ {
+ sprite->data5 = 0;
+ sprite->data6 = 1;
+ sprite->data7 = 2;
+ }
+ sprite->data7--;
+ if (sprite->data7 == 0)
+ {
+ sprite->data5 += sprite->data6;
+ if (sprite->data5 == 16 || sprite->data5 == 0)
+ sprite->data6 = -sprite->data6;
+ sprite->data7 = 2;
+ }
+ if ((sprite->data4 & 0xFF00) != 0)
+ {
+ s8 gb = sprite->data5;
+ s8 r = sprite->data5 >> 1;
+ u16 index = IndexOfSpritePaletteTag(5) * 16 + 0x0101;
+
+ MultiplyInvertedPaletteRGBComponents(index, r, gb, gb);
+ }
+}
+
+static void sub_80B6A80(void)
+{
+ u8 spriteId1;
+ u8 spriteId2;
+ u8 spriteId3;
+
+ spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0);
+ namingScreenData.unk10 = spriteId1;
+ SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558);
+
+ spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1);
+ gSprites[spriteId1].data6 = spriteId2;
+ SetSubspriteTables(&gSprites[spriteId2], gSubspriteTables_83CE560);
+
+ spriteId3 = CreateSprite(&gSpriteTemplate_83CE5E0, 0xCC, 0x4B, 2);
+ gSprites[spriteId3].oam.priority = 1;
+ gSprites[spriteId1].data7 = spriteId3;
+}
+
+static void sub_80B6B14(void)
+{
+ struct Sprite *sprite = &gSprites[namingScreenData.unk10];
+
+ sprite->data0 = 2;
+ sprite->data1 = namingScreenData.currentPage;
+}
+
+static u8 sub_80B6B5C(struct Sprite *);
+static u8 sub_80B6B98(struct Sprite *);
+static u8 sub_80B6B9C(struct Sprite *);
+static u8 sub_80B6C08(struct Sprite *);
+
+static u8 (*const gUnknown_083CE2B4[])(struct Sprite *) =
+{
+ sub_80B6B5C,
+ sub_80B6B98,
+ sub_80B6B9C,
+ sub_80B6C08,
+};
+
+void sub_80B6B34(struct Sprite *sprite)
+{
+ while (gUnknown_083CE2B4[sprite->data0](sprite) != 0)
+ ;
+}
+
+static u8 sub_80B6B5C(struct Sprite *sprite)
+{
+ struct Sprite *sprite1 = &gSprites[sprite->data6];
+ struct Sprite *sprite2 = &gSprites[sprite->data7];
+
+ sub_80B6C48(namingScreenData.currentPage, sprite1, sprite2);
+ sprite->data0++;
+ return 0;
+}
+
+static u8 sub_80B6B98(struct Sprite *sprite)
+{
+ return 0;
+}
+
+static u8 sub_80B6B9C(struct Sprite *sprite)
+{
+ struct Sprite *r4 = &gSprites[sprite->data6];
+ struct Sprite *r5 = &gSprites[sprite->data7];
+
+ r4->pos2.y++;
+ if (r4->pos2.y > 7)
+ {
+ sprite->data0++;
+ r4->pos2.y = -4;
+ r4->invisible = TRUE;
+ sub_80B6C48(((u8)sprite->data1 + 1) % 3, r4, r5);
+ }
+ return 0;
+}
+
+static u8 sub_80B6C08(struct Sprite *sprite)
+{
+ struct Sprite *r2 = &gSprites[sprite->data6];
+
+ r2->invisible = FALSE;
+ r2->pos2.y++;
+ if (r2->pos2.y >= 0)
+ {
+ r2->pos2.y = 0;
+ sprite->data0 = 1;
+ }
+ return 0;
+}
+
+static const u16 gUnknown_083CE2C4[] = {1, 3, 2};
+static const u16 gUnknown_083CE2CA[] = {4, 6, 5};
+
+static void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c)
+{
+ c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083CE2C4[a]);
+ b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_083CE2CA[a]);
+ b->subspriteTableNum = a;
+}
+
+//
+
+static void sub_80B6CA8(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83CE610, 0xCC, 0x6C, 0);
+ SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578);
+
+ spriteId = CreateSprite(&gSpriteTemplate_83CE628, 0xCC, 0x84, 0);
+ SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578);
+}
+
+static void sub_80B6D04(void)
+{
+ u8 spriteId;
+ s16 r1;
+ u8 i;
+
+ r1 = (namingScreenData.unk2 - 1) * 8 + 4;
+ spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0);
+ gSprites[spriteId].oam.priority = 3;
+ r1 = namingScreenData.unk2 * 8 + 4;
+ for (i = 0; i < namingScreenData.template->maxChars; i++, r1 += 8)
+ {
+ spriteId = CreateSprite(&gSpriteTemplate_83CE670, r1, 0x2C, 0);
+ gSprites[spriteId].oam.priority = 3;
+ gSprites[spriteId].data0 = i;
+ }
+}
+
+void sub_80B6D9C(struct Sprite *sprite)
+{
+ const s16 arr[] = {0, -4, -2, -1};
+
+ if (sprite->data0 == 0 || --sprite->data0 == 0)
+ {
+ sprite->data0 = 8;
+ sprite->data1 = (sprite->data1 + 1) & 3;
+ }
+ sprite->pos2.x = arr[sprite->data1];
+}
+
+void sub_80B6DE8(struct Sprite *sprite)
+{
+ const s16 arr[] = {2, 3, 2, 1};
+ u8 var;
+
+ var = GetTextCaretPosition();
+ if (var != (u8)sprite->data0)
+ {
+ sprite->pos2.y = 0;
+ sprite->data1 = 0;
+ sprite->data2 = 0;
+ }
+ else
+ {
+ sprite->pos2.y = arr[sprite->data1];
+ sprite->data2++;
+ if (sprite->data2 > 8)
+ {
+ sprite->data1 = (sprite->data1 + 1) & 3;
+ sprite->data2 = 0;
+ }
+ }
+}
+
+//
+
+static void nullsub_40(void);
+static void sub_80B6E68(void);
+static void sub_80B6EBC(void);
+static void sub_80B6EFC(void);
+
+static void (*const gUnknown_083CE2E0[])(void) =
+{
+ nullsub_40,
+ sub_80B6E68,
+ sub_80B6EBC,
+ sub_80B6EFC,
+};
+
+static void sub_80B6E44(void)
+{
+ gUnknown_083CE2E0[namingScreenData.template->unk2]();
+}
+
+static void nullsub_40(void)
+{
+}
+
+static void sub_80B6E68(void)
+{
+ u8 rivalGfxId;
+ u8 spriteId;
+
+ rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenData.unk3E);
+ spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0);
+ gSprites[spriteId].oam.priority = 3;
+ StartSpriteAnim(&gSprites[spriteId], 4);
+}
+
+static void sub_80B6EBC(void)
+{
+ u8 spriteId;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83CE688, 0x34, 0x18, 0);
+ SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE580);
+ gSprites[spriteId].oam.priority = 3;
+}
+
+static void sub_80B6EFC(void)
+{
+ u8 spriteId;
+
+ sub_809D51C();
+ spriteId = CreateMonIcon(namingScreenData.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenData.unk42);
+ gSprites[spriteId].oam.priority = 3;
+}
+
+static u8 GetTextCaretPosition(void)
+{
+ u8 i;
+
+ for (i = 0; i < namingScreenData.template->maxChars; i++)
+ {
+ if (namingScreenData.textBuffer[i] == EOS)
+ return i;
+ }
+ return namingScreenData.template->maxChars - 1;
+}
+
+static u8 GetPreviousTextCaretPosition(void)
+{
+ s8 i;
+
+ for (i = namingScreenData.template->maxChars - 1; i > 0; i--)
+ {
+ if (namingScreenData.textBuffer[i] != EOS)
+ return i;
+ }
+ return 0;
+}
+
+static void DeleteTextCharacter(void)
+{
+ u8 index;
+ u8 var2;
+
+ index = GetPreviousTextCaretPosition();
+ namingScreenData.textBuffer[index] = 0;
+ sub_80B7960();
+ namingScreenData.textBuffer[index] = EOS;
+ var2 = GetKeyRoleAtCursorPos();
+ if (var2 == 0 || var2 == 2)
+ sub_80B6460(1, 0, 1);
+ PlaySE(SE_BOWA);
+}
+
+static bool8 sub_80B7004(void)
+{
+ s16 x;
+ s16 y;
+ u8 ch;
+ bool8 r4;
+
+ GetCursorPos(&x, &y);
+ x = CursorColToKeyboardCol(x);
+ ch = GetCharAtKeyboardPos(x, y);
+ r4 = 1;
+ if (ch == 0xFF)
+ r4 = sub_80B7104();
+ else if (ch == 0xFE)
+ r4 = sub_80B713C();
+ else
+ AddTextCharacter(ch);
+ sub_80B7960();
+ PlaySE(SE_SELECT);
+ if (r4)
+ {
+ if (GetPreviousTextCaretPosition() == namingScreenData.template->maxChars - 1)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_80B7090(void) // DoInput?
+{
+ u8 r5;
+ u8 r4;
+
+ r5 = GetPreviousTextCaretPosition();
+ r4 = namingScreenData.textBuffer[r5];
+ if (sub_80B7198(r4))
+ {
+ if (sub_80B7264(r4))
+ sub_80B7370(r4, r5);
+ else
+ sub_80B73CC(r4, r5);
+ }
+ else
+ {
+ if (sub_80B71E4(r4))
+ sub_80B7474(r4, r5);
+ else
+ sub_80B72A4(r4, r5);
+ }
+ sub_80B7960();
+ PlaySE(SE_SELECT);
+}
+
+static bool8 sub_80B7104(void)
+{
+ u8 r5;
+ u8 r4;
+
+ r5 = GetPreviousTextCaretPosition();
+ r4 = namingScreenData.textBuffer[r5];
+ if (sub_80B720C(r4))
+ {
+ sub_80B72A4(r4, r5);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 sub_80B713C(void)
+{
+ u8 r5;
+ u8 r4;
+
+ r5 = GetPreviousTextCaretPosition();
+ r4 = namingScreenData.textBuffer[r5];
+ if (sub_80B7264(r4))
+ {
+ sub_80B7370(r4, r5);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void AddTextCharacter(u8 ch)
+{
+ u8 index = GetTextCaretPosition();
+
+ namingScreenData.textBuffer[index] = ch;
+}
+
+static bool8 sub_80B7198(u8 a)
+{
+ if ((a >= 55 && a <= 74)
+ || (a >= 135 && a <= 139)
+ || (a >= 140 && a <= 144)
+ || (a >= 145 && a <= 149)
+ || (a >= 150 && a <= 154))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 sub_80B71E4(u8 a)
+{
+ if ((a >= 75 && a <= 79)
+ || (a >= 155 && a <= 159))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 sub_80B720C(u8 a)
+{
+ if ((a >= 6 && a <= 20)
+ || (a >= 26 && a <= 30)
+ || (a >= 75 && a <= 79)
+ || (a >= 86 && a <= 100)
+ || (a >= 106 && a <= 110)
+ || (a >= 155 && a <= 159))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static bool8 sub_80B7264(u8 a)
+{
+ if ((a >= 26 && a <= 30)
+ || (a >= 70 && a <= 74)
+ || (a >= 106 && a <= 110)
+ || (a >= 150 && a <= 154))
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void sub_80B72A4(u8 a, u8 b)
+{
+ u8 chr = a;
+
+ if (a >= 6 && a <= 10)
+ chr = a + 0x31;
+ else if (a >= 11 && a <= 15)
+ chr = a + 0x31;
+ else if (a >= 16 && a <= 20)
+ chr = a + 0x31;
+ else if (a >= 26 && a <= 30)
+ chr = a + 0x2C;
+ else if (a >= 75 && a <= 79)
+ chr = a + 0xFB;
+ else if (a >= 86 && a <= 90)
+ chr = a + 0x31;
+ else if (a >= 91 && a <= 95)
+ chr = a + 0x31;
+ else if (a >= 96 && a <= 100)
+ chr = a + 0x31;
+ else if (a >= 106 && a <= 110)
+ chr = a + 0x2C;
+ else if (a >= 155 && a <= 159)
+ chr = a + 0xFB;
+ namingScreenData.textBuffer[b] = chr;
+}
+
+static void sub_80B7370(u8 a, u8 b)
+{
+ u8 chr = a;
+
+ if (a >= 26 && a <= 30)
+ chr = a + 0x31;
+ else if (a >= 70 && a <= 74)
+ chr = a + 5;
+ else if (a >= 106 && a <= 110)
+ chr = a + 0x31;
+ else if (a >= 150 && a <= 154)
+ chr = a + 5;
+ namingScreenData.textBuffer[b] = chr;
+}
+
+static void sub_80B73CC(u8 a, u8 b)
+{
+ u8 chr = a;
+
+ if (a >= 55 && a <= 59)
+ chr = a + 0xCF;
+ else if (a >= 60 && a <= 64)
+ chr = a + 0xCF;
+ else if (a >= 65 && a <= 69)
+ chr = a + 0xCF;
+ else if (a >= 70 && a <= 74)
+ chr = a + 0xD4;
+ else if (a >= 135 && a <= 139)
+ chr = a + 0xCF;
+ else if (a >= 140 && a <= 144)
+ chr = a + 0xCF;
+ else if (a >= 145 && a <= 149)
+ chr = a + 0xCF;
+ else if (a >= 150 && a <= 154)
+ chr = a + 0xD4;
+ namingScreenData.textBuffer[b] = chr;
+}
+
+static void sub_80B7474(u8 a, u8 b)
+{
+ u8 chr = a;
+
+ if (a >= 75 && a <= 79)
+ chr = a + 0xCF;
+ else if (a >= 155 && a <= 159)
+ chr = a + 0xCF;
+ namingScreenData.textBuffer[b] = chr;
+}
+
+static void sub_80B74B0(void)
+{
+ u8 i;
+
+ for (i = 0; i < namingScreenData.template->maxChars; i++)
+ {
+ if (namingScreenData.textBuffer[i] != 0 && namingScreenData.textBuffer[i] != 0xFF)
+ {
+ StringCopyN(namingScreenData.destBuffer, namingScreenData.textBuffer, namingScreenData.template->maxChars + 1);
+ break;
+ }
+ }
+}
+
+static void DisplaySentToPCMessage(void)
+{
+ StringCopy(gStringVar1, namingScreenData.destBuffer);
+ StringExpandPlaceholders(gStringVar4, gOtherText_SentToPC);
+ BasicInitMenuWindow(&gWindowConfig_81E6E88);
+ MenuDisplayMessageBox();
+ sub_8072044(gStringVar4);
+}
+
+static void sub_80B753C(void)
+{
+ LoadSpriteSheets(gUnknown_083CE6A0);
+ LoadSpritePalettes(gUnknown_083CE708);
+}
+
+static void sub_80B7558(void)
+{
+ sub_80B7568();
+ sub_80B75B0();
+}
+
+static void sub_80B7568(void)
+{
+ const void *src;
+ void *dst;
+
+ src = gNamingScreenMenu_Gfx;
+ dst = (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32);
+ DmaCopy16(3, src, dst, 0x800);
+
+ src = gNamingScreenMenu_Gfx;
+ dst = (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32);
+ DmaCopy16(3, src, dst, 0x800);
+}
+
+static void sub_80B75B0(void)
+{
+ LoadPalette(gNamingScreenPalettes, 0, 0x80);
+}
+
+static void sub_80B7650(u16 *);
+static void sub_80B7660(u16 *);
+static void sub_80B7670(u16 *);
+
+static void (*const gUnknown_083CE2F0[][2])(u16 *) =
+{
+ {sub_80B7660, sub_80B7650},
+ {sub_80B7650, sub_80B7670},
+ {sub_80B7670, sub_80B7660},
+};
+
+static void sub_80B75C4(void)
+{
+ u16 *const arr[] =
+ {
+ (u16 *)(VRAM + 0xE000),
+ (u16 *)(VRAM + 0xE800),
+ };
+
+ gUnknown_083CE2F0[namingScreenData.currentPage][0](arr[namingScreenData.unkC]);
+ gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]);
+}
+
+static void sub_80B7614(void)
+{
+ u16 *const arr[] =
+ {
+ (u16 *)(VRAM + 0xE000),
+ (u16 *)(VRAM + 0xE800),
+ };
+
+ gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]);
+}
+
+static void sub_80B7650(u16 *vramBuffer)
+{
+ sub_80B7698(vramBuffer, gUnknown_083CE748);
+}
+
+static void sub_80B7660(u16 *vramBuffer)
+{
+ sub_80B7698(vramBuffer, gUnknown_083CEBF8);
+}
+
+static void sub_80B7670(u16 *vramBuffer)
+{
+ sub_80B7698(vramBuffer, gUnknown_083CF0A8);
+}
+
+static void sub_80B7680(void)
+{
+ sub_80B76E0(VRAM + 0xF000, gUnknown_08E86258);
+}
+
+static void sub_80B7698(u16 *vramBuffer, const u16 *src)
+{
+ s16 i;
+ s16 j;
+
+ for (i = 0; i < 20; i++)
+ {
+ for (j = 0; j < 30; j++, src++)
+ {
+ vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset;
+ }
+ }
+}
+
+static void sub_80B76E0(u16 *vramBuffer, const u16 *src)
+{
+ s16 i;
+ s16 j;
+
+ for (i = 0; i < 20; i++)
+ {
+ for (j = 0; j < 30; j++, src++)
+ {
+ vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset;
+ }
+ src += 2;
+ }
+}
+
+static void sub_80B772C(void)
+{
+ nullsub_20(namingScreenData.currentPage, namingScreenData.unkC);
+}
+
+static void sub_80B7740(void)
+{
+ nullsub_20((namingScreenData.currentPage + 1) % 3, namingScreenData.unkD);
+}
+
+static void nullsub_20(u8 a, u8 b)
+{
+}
+
+static void sub_80B7838(void);
+static void sub_80B7844(void);
+static void sub_80B7850(void);
+
+static void (*const gUnknown_083CE310[][2])(void) =
+{
+ sub_80B7844,
+ sub_80B7838,
+ sub_80B7838,
+ sub_80B7850,
+ sub_80B7850,
+ sub_80B7844,
+};
+
+static const struct WindowConfig *const gUnknown_083CE328[][2][2] =
+{
+ {
+ {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8},
+ {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0},
+ },
+ {
+ {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0},
+ {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30},
+ },
+ {
+ {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30},
+ {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8},
+ },
+};
+
+static void nullsub_61(void);
+static void sub_80B78F8(void);
+
+static void (*const gUnknown_083CE358[])(void) =
+{
+ nullsub_61,
+ nullsub_61,
+ sub_80B78F8,
+ sub_80B78F8,
+};
+
+static void nullsub_62(void);
+static void sub_80B7924(void);
+
+static void (*const gUnknown_083CE368[])(void) =
+{
+ nullsub_62,
+ sub_80B7924,
+};
+
+static const u8 sKeyboardCharacters[][4][20]; //forward declaration
+
+static u8 GetCharAtKeyboardPos(s16 a, s16 b)
+{
+ return sKeyboardCharacters[namingScreenData.currentPage][b][a];
+}
+
+static void sub_80B7794(void)
+{
+ BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][0][namingScreenData.unkC]);
+ gUnknown_083CE310[namingScreenData.currentPage][0]();
+ BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]);
+ gUnknown_083CE310[namingScreenData.currentPage][1]();
+ sub_80B772C();
+ sub_80B7740();
+}
+
+static void sub_80B77F8(void)
+{
+ BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]);
+ gUnknown_083CE310[namingScreenData.currentPage][1]();
+ sub_80B7740();
+}
+
+static void sub_80B7838(void)
+{
+ PrintKeyboardCharacters(1);
+}
+
+static void sub_80B7844(void)
+{
+ PrintKeyboardCharacters(0);
+}
+
+static void sub_80B7850(void)
+{
+ PrintKeyboardCharacters(2);
+}
+
+static void PrintKeyboardCharacters(u8 page) //print letters on page
+{
+ s16 i;
+ s16 r5;
+
+ for (i = 0, r5 = 9; i < 4; i++, r5 += 2)
+ MenuPrint(sKeyboardCharacters[page][i], 3, r5);
+}
+
+static void sub_80B78A8(void)
+{
+ BasicInitMenuWindow(&gWindowConfig_81E6F4C);
+ gUnknown_083CE358[namingScreenData.templateNum]();
+ gUnknown_083CE368[namingScreenData.template->unk3]();
+ MenuPrint(namingScreenData.template->title, 9, 2);
+}
+
+static void nullsub_61(void)
+{
+}
+
+static void sub_80B78F8(void)
+{
+ StringCopy(gStringVar1, gSpeciesNames[(s16)namingScreenData.unk3E]);
+}
+
+static void nullsub_62(void)
+{
+}
+
+static void sub_80B7924(void)
+{
+ u8 genderSymbol[2] = _("♂");
+
+ if ((s16)namingScreenData.unk40 != MON_GENDERLESS)
+ {
+ if ((s16)namingScreenData.unk40 == MON_FEMALE)
+ genderSymbol[0] = 0xB6; //female symbol
+ MenuPrint(genderSymbol, 0x14, 4);
+ }
+}
+
+static void sub_80B7960(void)
+{
+ u8 *string = gStringVar1;
+
+ string[0] = 0xFC;
+ string[1] = 0x14;
+ string[2] = 8;
+ string[3] = 0xFC;
+ string[4] = 0x11;
+ string[5] = 1;
+ string += 6;
+ StringCopy(string, namingScreenData.textBuffer);
+ BasicInitMenuWindow(&gWindowConfig_81E6F4C);
+ MenuPrint(gStringVar1, namingScreenData.unk2, 4);
+}
+
+//--------------------------------------------------
+// Forward-declared variables
+//--------------------------------------------------
+
+static const struct NamingScreenTemplate playerNamingScreenTemplate =
+{
+ .unk0 = 0,
+ .maxChars = 7,
+ .unk2 = 1,
+ .unk3 = 0,
+ .unk4 = 0,
+ .unk5 = 0,
+ .unk6 = 0,
+ .unk7 = 0,
+ .title = OtherText_YourName,
+};
+
+static const struct NamingScreenTemplate pcBoxNamingTemplate =
+{
+ .unk0 = 0,
+ .maxChars = 8,
+ .unk2 = 2,
+ .unk3 = 0,
+ .unk4 = 0,
+ .unk5 = 0,
+ .unk6 = 0,
+ .unk7 = 0,
+ .title = OtherText_BoxName,
+};
+
+static const struct NamingScreenTemplate monNamingScreenTemplate =
+{
+ .unk0 = 0,
+ .maxChars = 10,
+ .unk2 = 3,
+ .unk3 = 1,
+ .unk4 = 0,
+ .unk5 = 0,
+ .unk6 = 0,
+ .unk7 = 0,
+ .title = OtherText_PokeName,
+};
+
+static const struct NamingScreenTemplate *const sNamingScreenTemplates[] =
+{
+ &playerNamingScreenTemplate,
+ &pcBoxNamingTemplate,
+ &monNamingScreenTemplate,
+ &monNamingScreenTemplate,
+};
+
+static const u8 sKeyboardCharacters[][4][20] =
+{
+ {
+ _(" A B C D E F . "),
+ _(" G H I J K L , "),
+ _(" M N O P Q R S "),
+ _(" T U V W X Y Z "),
+ },
+ {
+ _(" a b c d e f . "),
+ _(" g h i j k l , "),
+ _(" m n o p q r s "),
+ _(" t u v w x y z "),
+ },
+ {
+ _(" 0 1 2 3 4 "),
+ _(" 5 6 7 8 9 "),
+ _(" ! ? ♂ ♀ / - "),
+ _(" … “ ” ‘ ’ "),
+ },
+};
+
+const struct OamData gOamData_83CE498 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct OamData gOamData_83CE4A0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct OamData gOamData_83CE4A8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+//TODO: dump sprite data
diff --git a/src/new_game.c b/src/new_game.c
index 4f93e4e3c..82a26b52b 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -2,17 +2,18 @@
#include "new_game.h"
#include "asm.h"
#include "berry.h"
+#include "event_data.h"
+#include "lottery_corner.h"
#include "play_time.h"
-#include "pokemon_size_record.h"
-#include "script.h"
-#include "rom4.h"
#include "pokedex.h"
-#include "lottery_corner.h"
+#include "pokemon_size_record.h"
#include "rng.h"
+#include "rom4.h"
#include "rtc.h"
-#include "event_data.h"
+#include "script.h"
+#include "dewford_trend.h"
-extern u8 gUnknown_020297EC;
+extern u8 gDifferentSaveFile;
extern u8 gPlayerPartyCount;
extern u8 gUnknown_03005CE8;
@@ -22,8 +23,9 @@ extern u8 gUnknown_0819FA81[];
const struct SB1_2EFC_Struct gUnknown_08216604 =
{
- {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
+ 0x0000,
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
}
@@ -70,9 +72,10 @@ void ClearPokedexFlags(void)
void sub_8052DA8(void)
{
s32 i;
+
sub_80B2D1C();
for (i = 0; i < 5; i++)
- gSaveBlock1.sb1_2EFC_struct[i] = gUnknown_08216604;
+ gSaveBlock1.sbStruct.unkSB1.sb1_2EFC_struct[i] = gUnknown_08216604;
}
void sub_8052DE4(void)
@@ -94,7 +97,7 @@ void ClearSav2(void)
void sub_8052E4C(void)
{
- gUnknown_020297EC = 0;
+ gDifferentSaveFile = 0;
sub_808C0A0();
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
@@ -103,9 +106,10 @@ void sub_8052E4C(void)
void NewGameInitData(void)
{
- if (!gSaveFileStatus || gSaveFileStatus == 2)
+ if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
RtcReset();
- gUnknown_020297EC = 1;
+
+ gDifferentSaveFile = 1;
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
sub_808C02C();
@@ -139,7 +143,7 @@ void NewGameInitData(void)
sub_810C994();
sub_8133F80();
sub_80E6764();
- sub_80F7AA4();
+ SetMauvilleOldMan();
sub_80FA17C();
sub_810FA54();
ResetLotteryCorner();
diff --git a/src/option_menu.c b/src/option_menu.c
index f597429c1..613012972 100644
--- a/src/option_menu.c
+++ b/src/option_menu.c
@@ -91,14 +91,14 @@ static void VBlankCB(void)
void CB2_InitOptionMenu(void)
{
- switch(gMain.state)
+ switch (gMain.state)
{
default:
case 0:
{
u8 *addr;
u32 size;
-
+
SetVBlankCallback(NULL);
REG_DISPCNT = 0;
REG_BG2CNT = 0;
@@ -112,12 +112,12 @@ void CB2_InitOptionMenu(void)
REG_BG0VOFS = 0;
addr = (u8 *)VRAM;
size = 0x18000;
- while(1)
+ while (1)
{
DmaFill16(3, 0, addr, 0x1000);
addr += 0x1000;
size -= 0x1000;
- if(size <= 0x1000)
+ if (size <= 0x1000)
{
DmaFill16(3, 0, addr, size);
break;
@@ -144,7 +144,7 @@ void CB2_InitOptionMenu(void)
gMain.state++;
break;
case 4:
- if(!MultistepInitMenuWindowContinue())
+ if (!MultistepInitMenuWindowContinue())
return;
gMain.state++;
break;
@@ -160,7 +160,7 @@ void CB2_InitOptionMenu(void)
case 7:
{
u16 savedIme;
-
+
REG_WIN0H = 0;
REG_WIN0V = 0;
REG_WIN1H = 0;
@@ -184,7 +184,7 @@ void CB2_InitOptionMenu(void)
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;
@@ -192,10 +192,10 @@ void CB2_InitOptionMenu(void)
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);
@@ -204,17 +204,17 @@ void CB2_InitOptionMenu(void)
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;
@@ -227,7 +227,7 @@ void CB2_InitOptionMenu(void)
static void Task_OptionMenuFadeIn(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
gTasks[taskId].func = Task_OptionMenuProcessInput;
}
@@ -235,26 +235,26 @@ static void Task_OptionMenuFadeIn(u8 taskId)
static void Task_OptionMenuProcessInput(u8 taskId)
{
- if(gMain.newKeys & A_BUTTON)
+ if (gMain.newKeys & A_BUTTON)
{
- if(gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL)
+ if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL)
gTasks[taskId].func = Task_OptionMenuSave;
}
- else if(gMain.newKeys & B_BUTTON)
+ else if (gMain.newKeys & B_BUTTON)
{
gTasks[taskId].func = Task_OptionMenuSave;
}
- else if(gMain.newKeys & DPAD_UP)
+ else if (gMain.newKeys & DPAD_UP)
{
- if(gTasks[taskId].data[TD_MENUSELECTION] > 0)
+ if (gTasks[taskId].data[TD_MENUSELECTION] > 0)
gTasks[taskId].data[TD_MENUSELECTION]--;
else
gTasks[taskId].data[TD_MENUSELECTION] = 6;
HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
}
- else if(gMain.newKeys & DPAD_DOWN)
+ else if (gMain.newKeys & DPAD_DOWN)
{
- if(gTasks[taskId].data[TD_MENUSELECTION] <= 5)
+ if (gTasks[taskId].data[TD_MENUSELECTION] <= 5)
gTasks[taskId].data[TD_MENUSELECTION]++;
else
gTasks[taskId].data[TD_MENUSELECTION] = 0;
@@ -262,7 +262,7 @@ static void Task_OptionMenuProcessInput(u8 taskId)
}
else
{
- switch(gTasks[taskId].data[TD_MENUSELECTION])
+ switch (gTasks[taskId].data[TD_MENUSELECTION])
{
case MENUITEM_TEXTSPEED:
gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]);
@@ -300,14 +300,14 @@ static void Task_OptionMenuSave(u8 taskId)
gSaveBlock2.optionsSound = gTasks[taskId].data[TD_SOUND];
gSaveBlock2.optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE];
gSaveBlock2.optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE];
-
+
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].func = Task_OptionMenuFadeOut;
}
static void Task_OptionMenuFadeOut(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
DestroyTask(taskId);
SetMainCallback2(gMain.savedCallback);
@@ -327,10 +327,10 @@ static void DrawOptionMenuChoice(u8 *text, u8 x, u8 y, u8 style)
{
u8 dst[16];
u16 i;
-
- for(i = 0; *text != EOS && i <= 14; i++)
+
+ for (i = 0; *text != EOS && i <= 14; i++)
dst[i] = *(text++);
-
+
dst[2] = style;
dst[i] = EOS;
MenuPrint_PixelCoords(dst, x, y, 1);
@@ -338,16 +338,16 @@ static void DrawOptionMenuChoice(u8 *text, u8 x, u8 y, u8 style)
static u8 TextSpeed_ProcessInput(u8 selection)
{
- if(gMain.newKeys & DPAD_RIGHT)
+ if (gMain.newKeys & DPAD_RIGHT)
{
- if(selection <= 1)
+ if (selection <= 1)
selection++;
else
selection = 0;
}
- if(gMain.newKeys & DPAD_LEFT)
+ if (gMain.newKeys & DPAD_LEFT)
{
- if(selection != 0)
+ if (selection != 0)
selection--;
else
selection = 2;
@@ -358,12 +358,12 @@ static u8 TextSpeed_ProcessInput(u8 selection)
static void TextSpeed_DrawChoices(u8 selection)
{
u8 styles[3];
-
+
styles[0] = 0xF;
styles[1] = 0xF;
styles[2] = 0xF;
styles[selection] = 0x8;
-
+
DrawOptionMenuChoice(gSystemText_Slow, 120, 40, styles[0]);
DrawOptionMenuChoice(gSystemText_Mid, 155, 40, styles[1]);
DrawOptionMenuChoice(gSystemText_Fast, 184, 40, styles[2]);
@@ -371,7 +371,7 @@ static void TextSpeed_DrawChoices(u8 selection)
static u8 BattleScene_ProcessInput(u8 selection)
{
- if(gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
+ if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
selection ^= 1;
return selection;
}
@@ -379,18 +379,18 @@ static u8 BattleScene_ProcessInput(u8 selection)
static void BattleScene_DrawChoices(u8 selection)
{
u8 styles[2];
-
+
styles[0] = 0xF;
styles[1] = 0xF;
styles[selection] = 0x8;
-
+
DrawOptionMenuChoice(gSystemText_On, 120, 56, styles[0]);
DrawOptionMenuChoice(gSystemText_Off, 190, 56, styles[1]);
}
static u8 BattleStyle_ProcessInput(u8 selection)
{
- if(gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
+ if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
selection ^= 1;
return selection;
}
@@ -398,18 +398,18 @@ static u8 BattleStyle_ProcessInput(u8 selection)
static void BattleStyle_DrawChoices(u8 selection)
{
u8 styles[2];
-
+
styles[0] = 0xF;
styles[1] = 0xF;
styles[selection] = 0x8;
-
+
DrawOptionMenuChoice(gSystemText_Shift, 120, 72, styles[0]);
DrawOptionMenuChoice(gSystemText_Set, 190, 72, styles[1]);
}
static u8 Sound_ProcessInput(u8 selection)
{
- if(gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
+ if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
{
selection ^= 1;
SetPokemonCryStereo(selection);
@@ -420,28 +420,28 @@ static u8 Sound_ProcessInput(u8 selection)
static void Sound_DrawChoices(u8 selection)
{
u8 styles[3];
-
+
styles[0] = 0xF;
styles[1] = 0xF;
styles[selection] = 0x8;
-
+
DrawOptionMenuChoice(gSystemText_Mono, 120, 88, styles[0]);
DrawOptionMenuChoice(gSystemText_Stereo, 172, 88, styles[1]);
}
static u8 FrameType_ProcessInput(u8 selection)
{
- if(gMain.newKeys & DPAD_RIGHT)
+ if (gMain.newKeys & DPAD_RIGHT)
{
- if(selection <= 18)
+ if (selection <= 18)
selection++;
else
selection = 0;
MenuLoadTextWindowGraphics_OverrideFrameType(selection);
}
- if(gMain.newKeys & DPAD_LEFT)
+ if (gMain.newKeys & DPAD_LEFT)
{
- if(selection != 0)
+ if (selection != 0)
selection--;
else
selection = 19;
@@ -457,12 +457,12 @@ static void FrameType_DrawChoices(u8 selection)
u8 text[8];
u8 n = selection + 1;
u16 i;
-
- for(i = 0; gSystemText_Terminator[i] != EOS && i <= 5; i++)
+
+ for (i = 0; gSystemText_Terminator[i] != EOS && i <= 5; i++)
text[i] = gSystemText_Terminator[i];
-
+
//Convert number to decimal string
- if(n / 10 != 0)
+ if (n / 10 != 0)
{
text[i] = n / 10 + CHAR_0;
i++;
@@ -476,7 +476,7 @@ static void FrameType_DrawChoices(u8 selection)
text[i] = CHAR_SPACE;
i++;
}
-
+
text[i] = EOS;
MenuPrint(gSystemText_Type, 15, 15);
MenuPrint(text, 18, 15);
@@ -484,16 +484,16 @@ static void FrameType_DrawChoices(u8 selection)
static u8 ButtonMode_ProcessInput(u8 selection)
{
- if(gMain.newKeys & DPAD_RIGHT)
+ if (gMain.newKeys & DPAD_RIGHT)
{
- if(selection <= 1)
+ if (selection <= 1)
selection++;
else
selection = 0;
}
- if(gMain.newKeys & DPAD_LEFT)
+ if (gMain.newKeys & DPAD_LEFT)
{
- if(selection != 0)
+ if (selection != 0)
selection--;
else
selection = 2;
@@ -504,12 +504,12 @@ static u8 ButtonMode_ProcessInput(u8 selection)
static void ButtonMode_DrawChoices(u8 selection)
{
u8 styles[3];
-
+
styles[0] = 0xF;
styles[1] = 0xF;
styles[2] = 0xF;
styles[selection] = 0x8;
-
+
DrawOptionMenuChoice(gSystemText_Normal, 120, 104, styles[0]);
DrawOptionMenuChoice(gSystemText_LR, 166, 104, styles[1]);
DrawOptionMenuChoice(gSystemText_LA, 188, 104, styles[2]);
diff --git a/src/party_menu.c b/src/party_menu.c
index ce1b0f32a..d473eae6d 100644
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -8,28 +8,29 @@
#define DATA_COUNT (6)
-struct Unk201C000 {
- /* 0x00 */ struct Pokemon *pokemon;
- /* 0x04 */ u8 var04;
- /* 0x05 */ u8 var05;
- /* 0x06 */ u16 var06;
- u8 pad_08[10];
- /* 0x12 */ u16 var12;
+struct Unk201C000
+{
+ /*0x00*/ struct Pokemon *pokemon;
+ /*0x04*/ u8 var04;
+ /*0x05*/ u8 var05;
+ /*0x06*/ u16 var06;
+ u8 pad_08[10];
+ /*0x12*/ u16 var12;
};
-struct Unk201B260 {
- /* 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;
+struct Unk201B260
+{
+ /*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;
};
extern struct Unk201B260 unk_201B260;
extern struct Unk201C000 unk_201C000;
-extern u8 gStringVar1[];
extern u8 gUnknown_0202E8F4;
extern u8 gUnknown_0202E8F6;
@@ -45,7 +46,8 @@ void PartyMenuUpdateLevelOrStatus(struct Pokemon *, u8);
u8 ExecuteTableBasedItemEffect__(u8 u8, u16 u16, int i);
void sub_80701DC(u8 taskId);
-u8 sub_806E834(u8 *message, u8 arg1) {
+u8 sub_806E834(u8 *message, u8 arg1)
+{
u8 taskId;
gUnknown_0202E8F6 = 1;
@@ -59,14 +61,17 @@ u8 sub_806E834(u8 *message, u8 arg1) {
return taskId;
}
-static void sub_806E884(u8 taskId) {
- if (MenuUpdateWindowText() == 0) {
+static void sub_806E884(u8 taskId)
+{
+ if (MenuUpdateWindowText() == 0)
+ {
return;
}
gUnknown_0202E8F6 = 0;
- if (gTasks[taskId].data[0] == 0) {
+ if (gTasks[taskId].data[0] == 0)
+ {
MenuZeroFillWindowRect(3, 14, 26, 19);
}
@@ -76,13 +81,15 @@ static void sub_806E884(u8 taskId) {
asm(".section .text_b");
#ifdef NONMATCHING
-void sub_8070088(u8 taskId) {
+void sub_8070088(u8 taskId)
+{
u8 dummyTaskId;
struct Task *task2;
gTasks[taskId].func = TaskDummy;
- if (GetMonData(&gPlayerParty[unk_201C000.var04], MON_DATA_SPECIES) == 0) {
+ if (GetMonData(&gPlayerParty[unk_201C000.var04], MON_DATA_SPECIES) == 0)
+ {
gTasks[taskId].func = sub_80701DC;
return;
}
@@ -93,7 +100,8 @@ void sub_8070088(u8 taskId) {
task2->data[10] = GetMonData(unk_201C000.pokemon, MON_DATA_MAX_HP);
task2->data[11] = GetMonData(unk_201C000.pokemon, MON_DATA_HP);
- if (ExecuteTableBasedItemEffect__(unk_201C000.var05, unk_201C000.var06, 0)) {
+ if (ExecuteTableBasedItemEffect__(unk_201C000.var05, unk_201C000.var06, 0))
+ {
DestroyTask(dummyTaskId);
gTasks[taskId].func = sub_80701DC;
return;
@@ -108,7 +116,7 @@ void sub_8070088(u8 taskId) {
unk_201B260.var01 = 2; // u8
task2->data[12] = GetMonData(unk_201C000.pokemon, MON_DATA_HP) - task2->data[11];
- task2->data[14]= 1;
+ task2->data[14] = 1;
unk_201B260.var1E = 1; // u16
unk_201B260.var20 = 1; // u16
@@ -117,151 +125,152 @@ void sub_8070088(u8 taskId) {
}
#else
__attribute__((naked))
-void sub_8070088(void) {
+void sub_8070088(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\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- ldr r1, _08070120 @ =gTasks\n\
- mov r10, r1\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\
- bl GetMonData\n\
- cmp r0, 0\n\
- beq _08070118\n\
- adds r0, r5, 0\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\
+ 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\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ ldr r1, _08070120 @ =gTasks\n\
+ mov r10, r1\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\
+ bl GetMonData\n\
+ cmp r0, 0\n\
+ beq _08070118\n\
+ adds r0, r5, 0\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\
- .align 2, 0\n\
+ ldr r0, _08070130 @ =sub_80701DC\n\
+ str r0, [r7]\n\
+ b _080701B0\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\
- 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\
+ 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\
+ 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\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\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\
+ .align 2, 0\n\
_080701C0: .4byte gUnknown_0202E8F4\n\
_080701C4: .4byte gUnknown_083769A8\n\
_080701C8: .4byte 0xfffff261\n\
@@ -276,12 +285,14 @@ _080701D8: .4byte sub_806F8AC\n\
asm(".section .text_c");
-void sub_8070848(u8 taskId) {
+void sub_8070848(u8 taskId)
+{
u8 i;
MenuDrawTextWindow(11, 0, 29, 7);
- for (i = 0; i < DATA_COUNT; i++) {
+ for (i = 0; i < DATA_COUNT; i++)
+ {
u8 x;
u8 y;
u32 stat;
@@ -300,9 +311,12 @@ void sub_8070848(u8 taskId) {
MenuPrint_PixelCoords(gUnknown_08376D04[i], (x + 1) * 8, y * 8, 1);
- if (i == 2) {
+ if (i == 2)
+ {
MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0);
- } else {
+ }
+ else
+ {
MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1);
}
diff --git a/src/player_pc.c b/src/player_pc.c
index 822e2108e..6ea169713 100644
--- a/src/player_pc.c
+++ b/src/player_pc.c
@@ -1,14 +1,14 @@
#include "global.h"
+#include "asm.h"
#include "item.h"
-#include "task.h"
-#include "menu.h"
-#include "sound.h"
#include "main.h"
-#include "script.h"
+#include "menu.h"
#include "palette.h"
-#include "weather.h"
-#include "asm.h"
+#include "script.h"
+#include "sound.h"
#include "string_util.h"
+#include "task.h"
+#include "weather.h"
extern void DisplayItemMessageOnField(u8, u8*, TaskFunc, u16);
extern void ItemStorageMenuProcessInput(u8);
@@ -65,7 +65,7 @@ void NewGameInitPCItems(void)
while (gNewGamePCItems[i * 2] && (gNewGamePCItems + 1)[i * 2])
{
- if(AddPCItem(gNewGamePCItems[i * 2], (gNewGamePCItems + 1)[i * 2]) != 1)
+ if (AddPCItem(gNewGamePCItems[i * 2], (gNewGamePCItems + 1)[i * 2]) != 1)
break;
i++;
}
@@ -73,746 +73,746 @@ void NewGameInitPCItems(void)
void BedroomPC(void)
{
- u8 taskId;
-
- gUnknown_02039314 = gUnknown_084062B8;
- gUnknown_030007B4 = 4;
- taskId = CreateTask(TaskDummy, 0);
- DisplayItemMessageOnField(taskId, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0);
+ u8 taskId;
+
+ gUnknown_02039314 = gUnknown_084062B8;
+ gUnknown_030007B4 = 4;
+ taskId = CreateTask(TaskDummy, 0);
+ DisplayItemMessageOnField(taskId, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0);
}
void PlayerPC(void)
{
- u8 taskId;
-
- gUnknown_02039314 = gUnknown_084062BC;
- gUnknown_030007B4 = 3;
- taskId = CreateTask(TaskDummy, 0);
- DisplayItemMessageOnField(taskId, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0);
+ u8 taskId;
+
+ gUnknown_02039314 = gUnknown_084062BC;
+ gUnknown_030007B4 = 3;
+ taskId = CreateTask(TaskDummy, 0);
+ DisplayItemMessageOnField(taskId, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0);
}
void InitPlayerPCMenu(u8 taskId)
{
- MenuDrawTextWindow(0, 0, 10, gUnknown_030007B4 * 2 + 1);
- PrintMenuItemsReordered(1, 1, gUnknown_030007B4, gUnknown_08406298, gUnknown_02039314);
- InitMenu(0, 1, 1, gUnknown_030007B4, 0, 9);
- gTasks[taskId].func = PlayerPCProcessMenuInput;
+ MenuDrawTextWindow(0, 0, 10, gUnknown_030007B4 * 2 + 1);
+ PrintMenuItemsReordered(1, 1, gUnknown_030007B4, gUnknown_08406298, gUnknown_02039314);
+ InitMenu(0, 1, 1, gUnknown_030007B4, 0, 9);
+ gTasks[taskId].func = PlayerPCProcessMenuInput;
}
void PlayerPCProcessMenuInput(u8 taskId)
{
- if(gMain.newAndRepeatedKeys & 0x40)
- {
- PlaySE(5);
- MoveMenuCursor(-1);
- }
- else if(gMain.newAndRepeatedKeys & 0x80)
- {
- PlaySE(5);
- MoveMenuCursor(1);
- }
- else if(gMain.newKeys & 0x1)
- {
- sub_8072DEC();
- PlaySE(5);
- gUnknown_08406298[gUnknown_02039314[GetMenuCursorPos()]].func(taskId);
- }
- else if(gMain.newKeys & 0x2)
- {
- sub_8072DEC();
- PlaySE(5);
- gUnknown_08406298[gUnknown_030007B4[gUnknown_02039314 - 1]].func(taskId);
- }
+ if (gMain.newAndRepeatedKeys & 0x40)
+ {
+ PlaySE(5);
+ MoveMenuCursor(-1);
+ }
+ else if (gMain.newAndRepeatedKeys & 0x80)
+ {
+ PlaySE(5);
+ MoveMenuCursor(1);
+ }
+ else if (gMain.newKeys & 0x1)
+ {
+ sub_8072DEC();
+ PlaySE(5);
+ gUnknown_08406298[gUnknown_02039314[GetMenuCursorPos()]].func(taskId);
+ }
+ else if (gMain.newKeys & 0x2)
+ {
+ sub_8072DEC();
+ PlaySE(5);
+ gUnknown_08406298[gUnknown_030007B4[gUnknown_02039314 - 1]].func(taskId);
+ }
}
void ReshowPlayerPC(u8 var)
{
- DisplayItemMessageOnField(var, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0);
+ DisplayItemMessageOnField(var, gOtherText_WhatWillYouDo, InitPlayerPCMenu, 0);
}
void PlayerPC_ItemStorage(u8 taskId)
{
- InitItemStorageMenu(0);
- gTasks[taskId].func = ItemStorageMenuProcessInput;
+ InitItemStorageMenu(0);
+ gTasks[taskId].func = ItemStorageMenuProcessInput;
}
void PlayerPC_Mailbox(u8 taskId)
{
- MenuZeroFillWindowRect(0, 0, 10, 9);
- unk_201FE00[3] = sub_813AF3C();
- if(!unk_201FE00[3])
- DisplayItemMessageOnField(taskId, gOtherText_NoMailHere, ReshowPlayerPC, 0);
- else
- {
- unk_201FE00[0] = 0;
- unk_201FE00[2] = 0;
- sub_813AF78();
- sub_813A240(taskId);
- sub_813B108(taskId);
- gTasks[taskId].func = sub_813B174;
- }
+ MenuZeroFillWindowRect(0, 0, 10, 9);
+ unk_201FE00[3] = sub_813AF3C();
+ if (!unk_201FE00[3])
+ DisplayItemMessageOnField(taskId, gOtherText_NoMailHere, ReshowPlayerPC, 0);
+ else
+ {
+ unk_201FE00[0] = 0;
+ unk_201FE00[2] = 0;
+ sub_813AF78();
+ sub_813A240(taskId);
+ sub_813B108(taskId);
+ gTasks[taskId].func = sub_813B174;
+ }
}
void PlayerPC_Decoration(u8 var)
{
- MenuZeroFillWindowRect(0, 0, 10, 9);
- DoPlayerPCDecoration(var);
+ MenuZeroFillWindowRect(0, 0, 10, 9);
+ DoPlayerPCDecoration(var);
}
void PlayerPC_TurnOff(u8 taskId)
{
- if(gUnknown_030007B4 == 4)
- {
- MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
- if(!gSaveBlock2.playerGender)
- ScriptContext1_SetupScript(&gUnknown_08152850); // male
- else
- ScriptContext1_SetupScript(&gUnknown_08152C75); // female
- }
- else
- {
- MenuZeroFillWindowRect(0, 0, 10, 9);
- EnableBothScriptContexts();
- }
- DestroyTask(taskId);
+ if (gUnknown_030007B4 == 4)
+ {
+ MenuZeroFillWindowRect(0, 0, 0x1D, 0x13);
+ if (!gSaveBlock2.playerGender)
+ ScriptContext1_SetupScript(&gUnknown_08152850); // male
+ else
+ ScriptContext1_SetupScript(&gUnknown_08152C75); // female
+ }
+ else
+ {
+ MenuZeroFillWindowRect(0, 0, 10, 9);
+ EnableBothScriptContexts();
+ }
+ DestroyTask(taskId);
}
void InitItemStorageMenu(u8 var)
{
- MenuZeroFillWindowRect(0, 0, 10, 9);
- MenuDrawTextWindow(0, 0, 11, 9);
- PrintMenuItems(1, 1, 4, gUnknown_084062C0);
- InitMenu(0, 1, 1, 4, var, 10);
- ItemStorageMenuPrint((u8 *)gUnknown_08406288[var]);
+ MenuZeroFillWindowRect(0, 0, 10, 9);
+ MenuDrawTextWindow(0, 0, 11, 9);
+ PrintMenuItems(1, 1, 4, gUnknown_084062C0);
+ InitMenu(0, 1, 1, 4, var, 10);
+ ItemStorageMenuPrint((u8 *)gUnknown_08406288[var]);
}
void ItemStorageMenuPrint(u8 *textPtr)
{
- MenuFillWindowRectWithBlankTile(2, 15, 27, 18);
- MenuPrint(textPtr, 2, 15);
+ MenuFillWindowRectWithBlankTile(2, 15, 27, 18);
+ MenuPrint(textPtr, 2, 15);
}
void ItemStorageMenuProcessInput(u8 var)
{
- if(gMain.newAndRepeatedKeys & 0x40)
- {
- PlaySE(5);
- MoveMenuCursor(-1);
- ItemStorageMenuPrint((u8 *)gUnknown_08406288[GetMenuCursorPos()]);
- }
- else if(gMain.newAndRepeatedKeys & 0x80)
- {
- PlaySE(5);
- MoveMenuCursor(1);
- ItemStorageMenuPrint((u8 *)gUnknown_08406288[GetMenuCursorPos()]);
- }
- else if(gMain.newKeys & 0x1)
- {
- PlaySE(5);
- gUnknown_084062C0[GetMenuCursorPos()].func(var);
- }
- else if(gMain.newKeys & 0x2)
- {
- sub_8072DEC();
- PlaySE(5);
- gUnknown_084062C0[3].func(var);
- }
+ if (gMain.newAndRepeatedKeys & 0x40)
+ {
+ PlaySE(5);
+ MoveMenuCursor(-1);
+ ItemStorageMenuPrint((u8 *)gUnknown_08406288[GetMenuCursorPos()]);
+ }
+ else if (gMain.newAndRepeatedKeys & 0x80)
+ {
+ PlaySE(5);
+ MoveMenuCursor(1);
+ ItemStorageMenuPrint((u8 *)gUnknown_08406288[GetMenuCursorPos()]);
+ }
+ else if (gMain.newKeys & 0x1)
+ {
+ PlaySE(5);
+ gUnknown_084062C0[GetMenuCursorPos()].func(var);
+ }
+ else if (gMain.newKeys & 0x2)
+ {
+ sub_8072DEC();
+ PlaySE(5);
+ gUnknown_084062C0[3].func(var);
+ }
}
void Task_ItemStorage_Deposit(u8 taskId)
{
- if(!gPaletteFade.active)
- {
- sub_80A6A30();
- DestroyTask(taskId);
- }
+ if (!gPaletteFade.active)
+ {
+ sub_80A6A30();
+ DestroyTask(taskId);
+ }
}
void ItemStorage_Deposit(u8 taskId)
{
- gTasks[taskId].func = Task_ItemStorage_Deposit;
- fade_screen(1, 0);
+ gTasks[taskId].func = Task_ItemStorage_Deposit;
+ fade_screen(1, 0);
}
void sub_813A0C8(u8 taskId)
{
- if(sub_807D770() == 1)
- gTasks[taskId].func = ItemStorageMenuProcessInput;
+ if (sub_807D770() == 1)
+ gTasks[taskId].func = ItemStorageMenuProcessInput;
}
void sub_813A0F8(void)
{
- MenuDisplayMessageBox();
- InitItemStorageMenu(1);
- CreateTask(sub_813A0C8, 0);
- pal_fill_black();
+ MenuDisplayMessageBox();
+ InitItemStorageMenu(1);
+ CreateTask(sub_813A0C8, 0);
+ pal_fill_black();
}
void ItemStorage_Withdraw(u8 taskId)
{
- u8 var;
- u16 * data = gTasks[taskId].data;
-
- sub_8072DEC();
- MenuZeroFillWindowRect(0, 0, 11, 9);
- var = CountUsedPCItemSlots();
- data[2] = var;
-
- if(var)
- {
- MenuZeroFillWindowRect(0, 14, 29, 19);
- data[6] = 0;
- data[0] = 0;
- data[1] = 0;
- sub_813A240(taskId);
- sub_813AE6C(taskId, 0);
- gTasks[taskId].func = sub_813A280;
- }
- else
- DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0);
+ u8 var;
+ u16 * data = gTasks[taskId].data;
+
+ sub_8072DEC();
+ MenuZeroFillWindowRect(0, 0, 11, 9);
+ var = CountUsedPCItemSlots();
+ data[2] = var;
+
+ if (var)
+ {
+ MenuZeroFillWindowRect(0, 14, 29, 19);
+ data[6] = 0;
+ data[0] = 0;
+ data[1] = 0;
+ sub_813A240(taskId);
+ sub_813AE6C(taskId, 0);
+ gTasks[taskId].func = sub_813A280;
+ }
+ else
+ DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0);
}
void ItemStorage_Toss(u8 taskId)
{
- u8 var;
- u16 * data = gTasks[taskId].data;
-
- sub_8072DEC();
- MenuZeroFillWindowRect(0, 0, 11, 9);
- var = CountUsedPCItemSlots();
- data[2] = var;
-
- if(var)
- {
- MenuZeroFillWindowRect(0, 14, 29, 19);
- data[6] = 2;
- data[0] = 0;
- data[1] = 0;
- sub_813A240(taskId);
- sub_813AE6C(taskId, 2);
- gTasks[taskId].func = sub_813A280;
- }
- else
- DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0);
+ u8 var;
+ u16 * data = gTasks[taskId].data;
+
+ sub_8072DEC();
+ MenuZeroFillWindowRect(0, 0, 11, 9);
+ var = CountUsedPCItemSlots();
+ data[2] = var;
+
+ if (var)
+ {
+ MenuZeroFillWindowRect(0, 14, 29, 19);
+ data[6] = 2;
+ data[0] = 0;
+ data[1] = 0;
+ sub_813A240(taskId);
+ sub_813AE6C(taskId, 2);
+ gTasks[taskId].func = sub_813A280;
+ }
+ else
+ DisplayItemMessageOnField(taskId, gOtherText_NoItems, PlayerPC_ItemStorage, 0);
}
void ItemStorage_Exit(u8 var)
{
- sub_8072DEC();
- MenuZeroFillWindowRect(0, 0, 11, 9);
- ReshowPlayerPC(var);
+ sub_8072DEC();
+ MenuZeroFillWindowRect(0, 0, 11, 9);
+ ReshowPlayerPC(var);
}
void sub_813A240(u8 taskId)
{
- s16 *data = gTasks[taskId].data;
+ s16 *data = gTasks[taskId].data;
- if (data[2] > 7)
- data[4] = 8;
- else
- data[4] = data[2] + 1;
+ if (data[2] > 7)
+ data[4] = 8;
+ else
+ data[4] = data[2] + 1;
- if(unk_201FE00[3] > 7)
- unk_201FE00[1] = 8;
- else
- unk_201FE00[1] = unk_201FE00[3] + 1;
+ if (unk_201FE00[3] > 7)
+ unk_201FE00[1] = 8;
+ else
+ unk_201FE00[1] = unk_201FE00[3] + 1;
}
#ifdef NONMATCHING
void sub_813A280(u8 taskId)
{
- s16 *data = gTasks[taskId].data;
-
- if(gMain.newAndRepeatedKeys & 0x40)
- {
- if(data[0])
- {
- PlaySE(5);
- data[0] = MoveMenuCursor(-1);
- if(!data[9])
- {
- if(data[1] + data[0] == data[2])
- {
- sub_813AD58(0xFFFF);
- return;
- }
- sub_813AD58(gSaveBlock1.pcItems[data[1] + data[0]].itemId);
- }
- return;
- }
- if(!data[1])
- return;
- PlaySE(5);
- sub_813AE0C(taskId);
- if(data[9])
- MoveMenuCursor(0);
- return;
- }
- if(!(gMain.newAndRepeatedKeys & 0x80))
- {
- if(gMain.newKeys & 0x4)
- {
- if(!data[9])
- {
- if(data[0] + data[1] != data[2])
- {
- PlaySE(5);
- data[9] = 1;
- data[8] = data[0] + data[1];
- sub_813AD58(0xFFF7);
- }
- sub_813ABE8(taskId);
- return;
- }
- PlaySE(5);
- sub_813AA30(taskId, 0);
- sub_813AE0C(taskId);
- return;
- }
- if(gMain.newKeys & 0x1)
- {
- PlaySE(5);
- if(data[9])
- {
- sub_813AA30(taskId, 0);
- sub_813AE0C(taskId);
- return;
- }
- if(data[1] + data[0] != data[2])
- {
- sub_813A4B4(taskId);
- return;
- }
- }
- else
- {
- if(!(gMain.newKeys & 0x2))
- return;
- PlaySE(5);
- if(data[9])
- {
- sub_813AA30(taskId, 1);
- sub_813AE0C(taskId);
- return;
- }
- sub_8072DEC();
- }
- sub_813A468(taskId);
- return;
- }
- if(data[0] == data[4] - 1)
- {
- if(data[1] + data[0] == data[2])
- return;
- PlaySE(5);
- data[1]++;
- sub_813AE0C(taskId);
- if(data[9])
- MoveMenuCursor(0);
- return;
- }
- PlaySE(5);
- data[0] = MoveMenuCursor(1);
- if(!data[9])
- {
- if(data[1] + data[0] != data[2])
- {
- sub_813AD58(gSaveBlock1.pcItems[data[1] + data[0]].itemId);
- return;
- }
- sub_813AD58(0xFFFF);
- }
+ s16 *data = gTasks[taskId].data;
+
+ if (gMain.newAndRepeatedKeys & 0x40)
+ {
+ if (data[0])
+ {
+ PlaySE(5);
+ data[0] = MoveMenuCursor(-1);
+ if (!data[9])
+ {
+ if (data[1] + data[0] == data[2])
+ {
+ sub_813AD58(0xFFFF);
+ return;
+ }
+ sub_813AD58(gSaveBlock1.pcItems[data[1] + data[0]].itemId);
+ }
+ return;
+ }
+ if (!data[1])
+ return;
+ PlaySE(5);
+ sub_813AE0C(taskId);
+ if (data[9])
+ MoveMenuCursor(0);
+ return;
+ }
+ if (!(gMain.newAndRepeatedKeys & 0x80))
+ {
+ if (gMain.newKeys & 0x4)
+ {
+ if (!data[9])
+ {
+ if (data[0] + data[1] != data[2])
+ {
+ PlaySE(5);
+ data[9] = 1;
+ data[8] = data[0] + data[1];
+ sub_813AD58(0xFFF7);
+ }
+ sub_813ABE8(taskId);
+ return;
+ }
+ PlaySE(5);
+ sub_813AA30(taskId, 0);
+ sub_813AE0C(taskId);
+ return;
+ }
+ if (gMain.newKeys & 0x1)
+ {
+ PlaySE(5);
+ if (data[9])
+ {
+ sub_813AA30(taskId, 0);
+ sub_813AE0C(taskId);
+ return;
+ }
+ if (data[1] + data[0] != data[2])
+ {
+ sub_813A4B4(taskId);
+ return;
+ }
+ }
+ else
+ {
+ if (!(gMain.newKeys & 0x2))
+ return;
+ PlaySE(5);
+ if (data[9])
+ {
+ sub_813AA30(taskId, 1);
+ sub_813AE0C(taskId);
+ return;
+ }
+ sub_8072DEC();
+ }
+ sub_813A468(taskId);
+ return;
+ }
+ if (data[0] == data[4] - 1)
+ {
+ if (data[1] + data[0] == data[2])
+ return;
+ PlaySE(5);
+ data[1]++;
+ sub_813AE0C(taskId);
+ if (data[9])
+ MoveMenuCursor(0);
+ return;
+ }
+ PlaySE(5);
+ data[0] = MoveMenuCursor(1);
+ if (!data[9])
+ {
+ if (data[1] + data[0] != data[2])
+ {
+ sub_813AD58(gSaveBlock1.pcItems[data[1] + data[0]].itemId);
+ return;
+ }
+ sub_813AD58(0xFFFF);
+ }
}
#else
__attribute__((naked))
void sub_813A280(u8 taskId)
{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- adds r6, r5, 0\n\
- lsls r0, r5, 2\n\
- adds r0, r5\n\
- lsls r0, 3\n\
- ldr r1, _0813A2DC @ =gTasks + 0x8\n\
- adds r4, r0, r1\n\
- ldr r2, _0813A2E0 @ =gMain\n\
- ldrh r1, [r2, 0x30]\n\
- movs r0, 0x40\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0813A306\n\
- movs r1, 0\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0\n\
- beq _0813A2E4\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- bl MoveMenuCursor\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- strh r0, [r4]\n\
- ldrh r1, [r4, 0x2]\n\
- adds r1, r0\n\
- lsls r1, 16\n\
- lsrs r1, 16\n\
- movs r2, 0x12\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0\n\
- beq _0813A2CC\n\
- b _0813A460\n\
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ adds r6, r5, 0\n\
+ lsls r0, r5, 2\n\
+ adds r0, r5\n\
+ lsls r0, 3\n\
+ ldr r1, _0813A2DC @ =gTasks + 0x8\n\
+ adds r4, r0, r1\n\
+ ldr r2, _0813A2E0 @ =gMain\n\
+ ldrh r1, [r2, 0x30]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0813A306\n\
+ movs r1, 0\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r0, 0\n\
+ beq _0813A2E4\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ bl MoveMenuCursor\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ strh r0, [r4]\n\
+ ldrh r1, [r4, 0x2]\n\
+ adds r1, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ movs r2, 0x12\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0\n\
+ beq _0813A2CC\n\
+ b _0813A460\n\
_0813A2CC:\n\
- lsls r0, r1, 16\n\
- asrs r1, r0, 16\n\
- movs r2, 0x4\n\
- ldrsh r0, [r4, r2]\n\
- cmp r1, r0\n\
- beq _0813A34C\n\
- b _0813A358\n\
- .align 2, 0\n\
+ lsls r0, r1, 16\n\
+ asrs r1, r0, 16\n\
+ movs r2, 0x4\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r1, r0\n\
+ beq _0813A34C\n\
+ b _0813A358\n\
+ .align 2, 0\n\
_0813A2DC: .4byte gTasks + 0x8\n\
_0813A2E0: .4byte gMain\n\
_0813A2E4:\n\
- movs r1, 0x2\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0\n\
- bne _0813A2EE\n\
- b _0813A460\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r0, 0\n\
+ bne _0813A2EE\n\
+ b _0813A460\n\
_0813A2EE:\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- ldrh r0, [r4, 0x2]\n\
- subs r0, 0x1\n\
- strh r0, [r4, 0x2]\n\
- adds r0, r5, 0\n\
- bl sub_813AE0C\n\
- movs r2, 0x12\n\
- ldrsh r0, [r4, r2]\n\
- b _0813A394\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ ldrh r0, [r4, 0x2]\n\
+ subs r0, 0x1\n\
+ strh r0, [r4, 0x2]\n\
+ adds r0, r5, 0\n\
+ bl sub_813AE0C\n\
+ movs r2, 0x12\n\
+ ldrsh r0, [r4, r2]\n\
+ b _0813A394\n\
_0813A306:\n\
- movs r0, 0x80\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0813A3A0\n\
- movs r0, 0\n\
- ldrsh r1, [r4, r0]\n\
- movs r2, 0x8\n\
- ldrsh r0, [r4, r2]\n\
- subs r0, 0x1\n\
- cmp r1, r0\n\
- beq _0813A370\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- movs r0, 0x1\n\
- bl MoveMenuCursor\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- strh r0, [r4]\n\
- ldrh r1, [r4, 0x2]\n\
- adds r1, r0\n\
- lsls r1, 16\n\
- lsrs r1, 16\n\
- movs r2, 0x12\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0\n\
- beq _0813A340\n\
- b _0813A460\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0813A3A0\n\
+ movs r0, 0\n\
+ ldrsh r1, [r4, r0]\n\
+ movs r2, 0x8\n\
+ ldrsh r0, [r4, r2]\n\
+ subs r0, 0x1\n\
+ cmp r1, r0\n\
+ beq _0813A370\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r0, 0x1\n\
+ bl MoveMenuCursor\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ strh r0, [r4]\n\
+ ldrh r1, [r4, 0x2]\n\
+ adds r1, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ movs r2, 0x12\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0\n\
+ beq _0813A340\n\
+ b _0813A460\n\
_0813A340:\n\
- lsls r0, r1, 16\n\
- asrs r1, r0, 16\n\
- movs r2, 0x4\n\
- ldrsh r0, [r4, r2]\n\
- cmp r1, r0\n\
- bne _0813A358\n\
+ lsls r0, r1, 16\n\
+ asrs r1, r0, 16\n\
+ movs r2, 0x4\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r1, r0\n\
+ bne _0813A358\n\
_0813A34C:\n\
- ldr r0, _0813A354 @ =0x0000ffff\n\
- bl sub_813AD58\n\
- b _0813A460\n\
- .align 2, 0\n\
+ ldr r0, _0813A354 @ =0x0000ffff\n\
+ bl sub_813AD58\n\
+ b _0813A460\n\
+ .align 2, 0\n\
_0813A354: .4byte 0x0000ffff\n\
_0813A358:\n\
- ldr r0, _0813A36C @ =gSaveBlock1\n\
- lsls r1, 2\n\
- adds r1, r0\n\
- movs r0, 0x93\n\
- lsls r0, 3\n\
- adds r1, r0\n\
- ldrh r0, [r1]\n\
- bl sub_813AD58\n\
- b _0813A460\n\
- .align 2, 0\n\
+ ldr r0, _0813A36C @ =gSaveBlock1\n\
+ lsls r1, 2\n\
+ adds r1, r0\n\
+ movs r0, 0x93\n\
+ lsls r0, 3\n\
+ adds r1, r0\n\
+ ldrh r0, [r1]\n\
+ bl sub_813AD58\n\
+ b _0813A460\n\
+ .align 2, 0\n\
_0813A36C: .4byte gSaveBlock1\n\
_0813A370:\n\
- movs r2, 0x2\n\
- ldrsh r0, [r4, r2]\n\
- adds r0, r1\n\
- movs r2, 0x4\n\
- ldrsh r1, [r4, r2]\n\
- cmp r0, r1\n\
- beq _0813A460\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- ldrh r0, [r4, 0x2]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x2]\n\
- adds r0, r5, 0\n\
- bl sub_813AE0C\n\
- movs r1, 0x12\n\
- ldrsh r0, [r4, r1]\n\
+ movs r2, 0x2\n\
+ ldrsh r0, [r4, r2]\n\
+ adds r0, r1\n\
+ movs r2, 0x4\n\
+ ldrsh r1, [r4, r2]\n\
+ cmp r0, r1\n\
+ beq _0813A460\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ ldrh r0, [r4, 0x2]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x2]\n\
+ adds r0, r5, 0\n\
+ bl sub_813AE0C\n\
+ movs r1, 0x12\n\
+ ldrsh r0, [r4, r1]\n\
_0813A394:\n\
- cmp r0, 0\n\
- beq _0813A460\n\
- movs r0, 0\n\
- bl MoveMenuCursor\n\
- b _0813A460\n\
+ cmp r0, 0\n\
+ beq _0813A460\n\
+ movs r0, 0\n\
+ bl MoveMenuCursor\n\
+ b _0813A460\n\
_0813A3A0:\n\
- ldrh r1, [r2, 0x2E]\n\
- movs r0, 0x4\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0813A3F0\n\
- movs r2, 0x12\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0\n\
- bne _0813A3E8\n\
- movs r1, 0\n\
- ldrsh r0, [r4, r1]\n\
- movs r2, 0x2\n\
- ldrsh r1, [r4, r2]\n\
- adds r0, r1\n\
- movs r2, 0x4\n\
- ldrsh r1, [r4, r2]\n\
- cmp r0, r1\n\
- beq _0813A3DC\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- movs r0, 0x1\n\
- strh r0, [r4, 0x12]\n\
- ldrh r0, [r4]\n\
- ldrh r1, [r4, 0x2]\n\
- adds r0, r1\n\
- strh r0, [r4, 0x10]\n\
- ldr r0, _0813A3E4 @ =0x0000fff7\n\
- bl sub_813AD58\n\
+ ldrh r1, [r2, 0x2E]\n\
+ movs r0, 0x4\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0813A3F0\n\
+ movs r2, 0x12\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0\n\
+ bne _0813A3E8\n\
+ movs r1, 0\n\
+ ldrsh r0, [r4, r1]\n\
+ movs r2, 0x2\n\
+ ldrsh r1, [r4, r2]\n\
+ adds r0, r1\n\
+ movs r2, 0x4\n\
+ ldrsh r1, [r4, r2]\n\
+ cmp r0, r1\n\
+ beq _0813A3DC\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r0, 0x1\n\
+ strh r0, [r4, 0x12]\n\
+ ldrh r0, [r4]\n\
+ ldrh r1, [r4, 0x2]\n\
+ adds r0, r1\n\
+ strh r0, [r4, 0x10]\n\
+ ldr r0, _0813A3E4 @ =0x0000fff7\n\
+ bl sub_813AD58\n\
_0813A3DC:\n\
- adds r0, r5, 0\n\
- bl sub_813ABE8\n\
- b _0813A460\n\
- .align 2, 0\n\
+ adds r0, r5, 0\n\
+ bl sub_813ABE8\n\
+ b _0813A460\n\
+ .align 2, 0\n\
_0813A3E4: .4byte 0x0000fff7\n\
_0813A3E8:\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- b _0813A420\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ b _0813A420\n\
_0813A3F0:\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0813A430\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- movs r2, 0x12\n\
- ldrsh r0, [r4, r2]\n\
- cmp r0, 0\n\
- bne _0813A420\n\
- movs r1, 0x2\n\
- ldrsh r0, [r4, r1]\n\
- movs r2, 0\n\
- ldrsh r1, [r4, r2]\n\
- adds r0, r1\n\
- movs r2, 0x4\n\
- ldrsh r1, [r4, r2]\n\
- cmp r0, r1\n\
- beq _0813A44A\n\
- adds r0, r5, 0\n\
- bl sub_813A4B4\n\
- b _0813A460\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0813A430\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r2, 0x12\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r0, 0\n\
+ bne _0813A420\n\
+ movs r1, 0x2\n\
+ ldrsh r0, [r4, r1]\n\
+ movs r2, 0\n\
+ ldrsh r1, [r4, r2]\n\
+ adds r0, r1\n\
+ movs r2, 0x4\n\
+ ldrsh r1, [r4, r2]\n\
+ cmp r0, r1\n\
+ beq _0813A44A\n\
+ adds r0, r5, 0\n\
+ bl sub_813A4B4\n\
+ b _0813A460\n\
_0813A420:\n\
- adds r0, r5, 0\n\
- movs r1, 0\n\
- bl sub_813AA30\n\
- adds r0, r5, 0\n\
- bl sub_813AE0C\n\
- b _0813A460\n\
+ adds r0, r5, 0\n\
+ movs r1, 0\n\
+ bl sub_813AA30\n\
+ adds r0, r5, 0\n\
+ bl sub_813AE0C\n\
+ b _0813A460\n\
_0813A430:\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0813A460\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- movs r1, 0x12\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0\n\
- bne _0813A452\n\
- bl sub_8072DEC\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0813A460\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r1, 0x12\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r0, 0\n\
+ bne _0813A452\n\
+ bl sub_8072DEC\n\
_0813A44A:\n\
- adds r0, r5, 0\n\
- bl sub_813A468\n\
- b _0813A460\n\
+ adds r0, r5, 0\n\
+ bl sub_813A468\n\
+ b _0813A460\n\
_0813A452:\n\
- adds r0, r6, 0\n\
- movs r1, 0x1\n\
- bl sub_813AA30\n\
- adds r0, r6, 0\n\
- bl sub_813AE0C\n\
+ adds r0, r6, 0\n\
+ movs r1, 0x1\n\
+ bl sub_813AA30\n\
+ adds r0, r6, 0\n\
+ bl sub_813AE0C\n\
_0813A460:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .syntax divided");
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided");
}
#endif
void sub_813A468(u8 taskId)
{
- BuyMenuFreeMemory();
- DestroyVerticalScrollIndicator(0);
- DestroyVerticalScrollIndicator(1);
- MenuZeroFillWindowRect(0, 0, 29, 19);
- MenuDisplayMessageBox();
- InitItemStorageMenu(gTasks[taskId].data[6]);
- gTasks[taskId].func = ItemStorageMenuProcessInput;
+ BuyMenuFreeMemory();
+ DestroyVerticalScrollIndicator(0);
+ DestroyVerticalScrollIndicator(1);
+ MenuZeroFillWindowRect(0, 0, 29, 19);
+ MenuDisplayMessageBox();
+ InitItemStorageMenu(gTasks[taskId].data[6]);
+ gTasks[taskId].func = ItemStorageMenuProcessInput;
}
#ifdef NONMATCHING
void sub_813A4B4(u8 taskId)
{
- u16 *data = gTasks[taskId].data;
- u16 var = data[2] + data[0];
-
- sub_80F996C(0);
- sub_80F996C(1);
-
- if(data[6])
- {
- if(gSaveBlock1.pcItems[var].itemId == 1)
- {
- data[3] = 1;
- sub_813A794(taskId);
- return;
- }
- sub_813AD58(0xFFF7);
- data[3] = 1;
- MenuDrawTextWindow(6, 8, 13, 11);
- sub_80A418C(data[3], STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3);
- gTasks[taskId].func = sub_813A584;
- return;
- }
- if(gSaveBlock1.pcItems[var].itemId != 1)
- {
- sub_813AD58(0xFFF7);
- data[3] = 1;
- MenuDrawTextWindow(6, 8, 13, 11);
- sub_80A418C(data[3], STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3);
- gTasks[taskId].func = sub_813A584;
- return;
- }
- data[3] = 1;
- sub_813A6FC(taskId);
+ u16 *data = gTasks[taskId].data;
+ u16 var = data[2] + data[0];
+
+ sub_80F996C(0);
+ sub_80F996C(1);
+
+ if (data[6])
+ {
+ if (gSaveBlock1.pcItems[var].itemId == 1)
+ {
+ data[3] = 1;
+ sub_813A794(taskId);
+ return;
+ }
+ sub_813AD58(0xFFF7);
+ data[3] = 1;
+ MenuDrawTextWindow(6, 8, 13, 11);
+ sub_80A418C(data[3], STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3);
+ gTasks[taskId].func = sub_813A584;
+ return;
+ }
+ if (gSaveBlock1.pcItems[var].itemId != 1)
+ {
+ sub_813AD58(0xFFF7);
+ data[3] = 1;
+ MenuDrawTextWindow(6, 8, 13, 11);
+ sub_80A418C(data[3], STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3);
+ gTasks[taskId].func = sub_813A584;
+ return;
+ }
+ data[3] = 1;
+ sub_813A6FC(taskId);
}
#else
__attribute__((naked))
void sub_813A4B4(u8 taskId)
{
- asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- sub sp, 0x4\n\
- lsls r0, 24\n\
- lsrs r6, r0, 24\n\
- lsls r0, r6, 2\n\
- adds r0, r6\n\
- lsls r0, 3\n\
- ldr r1, _0813A500 @ =gTasks + 0x8\n\
- adds r4, r0, r1\n\
- ldrb r0, [r4, 0x2]\n\
- ldrb r1, [r4]\n\
- adds r0, r1\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
- movs r0, 0\n\
- bl sub_80F996C\n\
- movs r0, 0x1\n\
- bl sub_80F996C\n\
- movs r1, 0xC\n\
- ldrsh r0, [r4, r1]\n\
- cmp r0, 0\n\
- bne _0813A518\n\
- ldr r1, _0813A504 @ =gSaveBlock1\n\
- lsls r0, r5, 2\n\
- adds r0, r1\n\
- ldr r1, _0813A508 @ =0x0000049a\n\
- adds r0, r1\n\
- ldrh r0, [r0]\n\
- cmp r0, 0x1\n\
- bne _0813A50C\n\
- strh r0, [r4, 0x6]\n\
- adds r0, r6, 0\n\
- bl sub_813A6FC\n\
- b _0813A570\n\
- .align 2, 0\n\
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ sub sp, 0x4\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ lsls r0, r6, 2\n\
+ adds r0, r6\n\
+ lsls r0, 3\n\
+ ldr r1, _0813A500 @ =gTasks + 0x8\n\
+ adds r4, r0, r1\n\
+ ldrb r0, [r4, 0x2]\n\
+ ldrb r1, [r4]\n\
+ adds r0, r1\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+ movs r0, 0\n\
+ bl sub_80F996C\n\
+ movs r0, 0x1\n\
+ bl sub_80F996C\n\
+ movs r1, 0xC\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r0, 0\n\
+ bne _0813A518\n\
+ ldr r1, _0813A504 @ =gSaveBlock1\n\
+ lsls r0, r5, 2\n\
+ adds r0, r1\n\
+ ldr r1, _0813A508 @ =0x0000049a\n\
+ adds r0, r1\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0x1\n\
+ bne _0813A50C\n\
+ strh r0, [r4, 0x6]\n\
+ adds r0, r6, 0\n\
+ bl sub_813A6FC\n\
+ b _0813A570\n\
+ .align 2, 0\n\
_0813A500: .4byte gTasks + 0x8\n\
_0813A504: .4byte gSaveBlock1\n\
_0813A508: .4byte 0x0000049a\n\
_0813A50C:\n\
- ldr r0, _0813A514 @ =0x0000fffe\n\
- bl sub_813AD58\n\
- b _0813A542\n\
- .align 2, 0\n\
+ ldr r0, _0813A514 @ =0x0000fffe\n\
+ bl sub_813AD58\n\
+ b _0813A542\n\
+ .align 2, 0\n\
_0813A514: .4byte 0x0000fffe\n\
_0813A518:\n\
- ldr r1, _0813A534 @ =gSaveBlock1\n\
- lsls r0, r5, 2\n\
- adds r0, r1\n\
- ldr r1, _0813A538 @ =0x0000049a\n\
- adds r0, r1\n\
- ldrh r0, [r0]\n\
- cmp r0, 0x1\n\
- bne _0813A53C\n\
- strh r0, [r4, 0x6]\n\
- adds r0, r6, 0\n\
- bl sub_813A794\n\
- b _0813A570\n\
- .align 2, 0\n\
+ ldr r1, _0813A534 @ =gSaveBlock1\n\
+ lsls r0, r5, 2\n\
+ adds r0, r1\n\
+ ldr r1, _0813A538 @ =0x0000049a\n\
+ adds r0, r1\n\
+ ldrh r0, [r0]\n\
+ cmp r0, 0x1\n\
+ bne _0813A53C\n\
+ strh r0, [r4, 0x6]\n\
+ adds r0, r6, 0\n\
+ bl sub_813A794\n\
+ b _0813A570\n\
+ .align 2, 0\n\
_0813A534: .4byte gSaveBlock1\n\
_0813A538: .4byte 0x0000049a\n\
_0813A53C:\n\
- ldr r0, _0813A578 @ =0x0000fffc\n\
- bl sub_813AD58\n\
+ ldr r0, _0813A578 @ =0x0000fffc\n\
+ bl sub_813AD58\n\
_0813A542:\n\
- movs r0, 0x1\n\
- strh r0, [r4, 0x6]\n\
- movs r0, 0x6\n\
- movs r1, 0x8\n\
- movs r2, 0xD\n\
- movs r3, 0xB\n\
- bl MenuDrawTextWindow\n\
- ldrh r0, [r4, 0x6]\n\
- movs r1, 0x3\n\
- str r1, [sp]\n\
- movs r1, 0x1\n\
- movs r2, 0x8\n\
- movs r3, 0x9\n\
- bl sub_80A418C\n\
- ldr r1, _0813A57C @ =gTasks\n\
- lsls r0, r6, 2\n\
- adds r0, r6\n\
- lsls r0, 3\n\
- adds r0, r1\n\
- ldr r1, _0813A580 @ =sub_813A584\n\
- str r1, [r0]\n\
+ movs r0, 0x1\n\
+ strh r0, [r4, 0x6]\n\
+ movs r0, 0x6\n\
+ movs r1, 0x8\n\
+ movs r2, 0xD\n\
+ movs r3, 0xB\n\
+ bl MenuDrawTextWindow\n\
+ ldrh r0, [r4, 0x6]\n\
+ movs r1, 0x3\n\
+ str r1, [sp]\n\
+ movs r1, 0x1\n\
+ movs r2, 0x8\n\
+ movs r3, 0x9\n\
+ bl sub_80A418C\n\
+ ldr r1, _0813A57C @ =gTasks\n\
+ lsls r0, r6, 2\n\
+ adds r0, r6\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ ldr r1, _0813A580 @ =sub_813A584\n\
+ str r1, [r0]\n\
_0813A570:\n\
- add sp, 0x4\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ add sp, 0x4\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_0813A578: .4byte 0x0000fffc\n\
_0813A57C: .4byte gTasks\n\
_0813A580: .4byte sub_813A584\n\
- .syntax divided");
+ .syntax divided");
}
#endif
diff --git a/src/pokedex.c b/src/pokedex.c
index 48e3a57aa..bd6125f7c 100644
--- a/src/pokedex.c
+++ b/src/pokedex.c
@@ -1,18 +1,18 @@
#include "global.h"
#include "pokedex.h"
#include "asm.h"
+#include "decompress.h"
+#include "event_data.h"
#include "gba/m4a_internal.h"
-#include "string_util.h"
#include "m4a.h"
-#include "decompress.h"
#include "main.h"
#include "menu.h"
#include "palette.h"
#include "rng.h"
#include "songs.h"
#include "sound.h"
+#include "string_util.h"
#include "task.h"
-#include "event_data.h"
// I'm #define-ing these just for now so I can keep using the old unkXXX member names
#define unk60E selectedPokemon
@@ -134,7 +134,7 @@ void DestroyCryMeterNeedleSprite();
void sub_808C02C(void)
{
u16 i;
-
+
gUnknown_0202FFB8 = 0;
gUnknown_0202FFBA = 0x40;
gUnknown_03005CE8 = 0;
@@ -146,7 +146,7 @@ void sub_808C02C(void)
gSaveBlock2.pokedex.spindaPersonality = 0;
gSaveBlock2.pokedex.unknown3 = 0;
DisableNationalPokedex();
- for(i = 0; i <= 51; i++)
+ for (i = 0; i <= 51; i++)
{
gSaveBlock2.pokedex.owned[i] = 0;
gSaveBlock2.pokedex.seen[i] = 0;
@@ -171,8 +171,8 @@ void sub_808C0B8(void)
void ClearPokedexView(struct PokedexView *pokedexView)
{
u16 i;
-
- for(i = 0; i <= 385; i++)
+
+ for (i = 0; i <= 385; i++)
{
pokedexView->unk0[i].dexNum |= 0xFFFF;
pokedexView->unk0[i].seen = 0;
@@ -190,7 +190,7 @@ void ClearPokedexView(struct PokedexView *pokedexView)
pokedexView->unk618 = 0;
pokedexView->unk61A = 0;
pokedexView->unk61C = 0;
- for(i = 0; i <= 3; i++)
+ for (i = 0; i <= 3; i++)
pokedexView->unk61E[i] |= 0xFFFF;
pokedexView->unk628 = 0;
pokedexView->unk62A = 0;
@@ -203,7 +203,7 @@ void ClearPokedexView(struct PokedexView *pokedexView)
pokedexView->unk634 = 0;
pokedexView->unk636 = 0;
pokedexView->unk638 = 0;
- for(i = 0; i <= 3; i++)
+ for (i = 0; i <= 3; i++)
pokedexView->unk63A[i] = 0;
pokedexView->unk64A = 0;
pokedexView->unk64B = 0;
@@ -213,32 +213,32 @@ void ClearPokedexView(struct PokedexView *pokedexView)
pokedexView->menuIsOpen = 0;
pokedexView->menuCursorPos = 0;
pokedexView->menuY = 0;
- for(i = 0; i <= 7; i++)
+ for (i = 0; i <= 7; i++)
pokedexView->unk656[i] = 0;
- for(i = 0; i <= 7; i++)
+ for (i = 0; i <= 7; i++)
pokedexView->unk65E[i] = 0;
}
void CB2_InitPokedex(void)
{
- switch(gMain.state)
+ switch (gMain.state)
{
case 0:
default:
{
u8 *addr;
u32 size;
-
+
SetVBlankCallback(NULL);
sub_8091060(0);
addr = (u8 *)VRAM;
size = VRAM_SIZE;
- while(1)
+ while (1)
{
DmaFill16(3, 0, addr, 0x1000);
addr += 0x1000;
size -= 0x1000;
- if(size <= 0x1000)
+ if (size <= 0x1000)
{
DmaFill16(3, 0, addr, size);
break;
@@ -261,7 +261,7 @@ void CB2_InitPokedex(void)
gMain.state++;
break;
case 2:
- switch(Random() & 3)
+ switch (Random() & 3)
{
case 0:
default:
@@ -280,14 +280,14 @@ void CB2_InitPokedex(void)
ClearPokedexView(gPokedexView);
CreateTask(Task_PokedexShowMainScreen, 0);
gPokedexView->dexMode = gSaveBlock2.pokedex.unknown1;
- if(!IsNationalPokedexEnabled())
+ 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())
+ if (!IsNationalPokedexEnabled())
{
gPokedexView->unk61A = GetHoennPokedexCount(0);
gPokedexView->unk61C = GetHoennPokedexCount(1);
@@ -303,7 +303,7 @@ void CB2_InitPokedex(void)
case 3:
{
u16 savedIme;
-
+
savedIme = REG_IME;
REG_IME = 0;
REG_IE |= 1;
@@ -321,7 +321,7 @@ u8 unref_sub_808C540(void (*func)(u8))
{
u16 savedIme;
u8 taskId;
-
+
SetVBlankCallback(NULL);
sub_8091060(0x200);
remove_some_task();
@@ -334,7 +334,7 @@ u8 unref_sub_808C540(void (*func)(u8))
REG_DISPSTAT |= 0x8;
SetVBlankCallback(sub_808C0B8);
SetMainCallback2(MainCB);
- if(!gPokedexView->unk64B)
+ if (!gPokedexView->unk64B)
taskId = CreateTask(sub_808CAE4, 0);
else
taskId = CreateTask(sub_808D198, 0);
@@ -353,7 +353,7 @@ void MainCB(void)
void Task_PokedexShowMainScreen(u8 taskId)
{
gPokedexView->unk64C_1 = 0;
- if(sub_808D344(0))
+ if (sub_808D344(0))
{
gTasks[taskId].func = Task_PokedexMainScreen;
}
@@ -363,13 +363,13 @@ void Task_PokedexShowMainScreen(u8 taskId)
void Task_PokedexMainScreen(u8 taskId)
{
REG_BG0VOFS = gPokedexView->menuY;
-
+
//If menu is open, slide it down, off screen
- if(gPokedexView->menuY)
+ if (gPokedexView->menuY)
gPokedexView->menuY -= 8;
else
{
- if((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen)
+ if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen)
{
sub_808E6BC();
BeginNormalPaletteFade(
@@ -379,7 +379,7 @@ void Task_PokedexMainScreen(u8 taskId)
gTasks[taskId].func = sub_808CA64;
PlaySE(SE_PIN);
}
- else if(gMain.newKeys & START_BUTTON)
+ else if (gMain.newKeys & START_BUTTON)
{
//Open menu
gPokedexView->menuY = 0;
@@ -388,7 +388,7 @@ void Task_PokedexMainScreen(u8 taskId)
gTasks[taskId].func = Task_PokedexMainScreenMenu;
PlaySE(SE_SELECT);
}
- else if(gMain.newKeys & SELECT_BUTTON)
+ else if (gMain.newKeys & SELECT_BUTTON)
{
PlaySE(SE_SELECT);
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
@@ -401,7 +401,7 @@ void Task_PokedexMainScreen(u8 taskId)
gTasks[taskId].func = sub_808CB8C;
PlaySE(SE_PC_LOGON);
}
- else if(gMain.newKeys & B_BUTTON)
+ else if (gMain.newKeys & B_BUTTON)
{
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].func = Task_ClosePokedex;
@@ -411,7 +411,7 @@ void Task_PokedexMainScreen(u8 taskId)
{
//Handle D-pad
gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE);
- if(gPokedexView->unk62E)
+ if (gPokedexView->unk62E)
gTasks[taskId].func = sub_808C898;
}
}
@@ -419,7 +419,7 @@ void Task_PokedexMainScreen(u8 taskId)
void sub_808C898(u8 taskId)
{
- if(sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636))
+ if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636))
{
gTasks[taskId].func = Task_PokedexMainScreen;
}
@@ -429,15 +429,15 @@ void sub_808C898(u8 taskId)
void Task_PokedexMainScreenMenu(u8 taskId)
{
REG_BG0VOFS = gPokedexView->menuY;
-
+
//If menu is not open, slide it up, on screen
- if(gPokedexView->menuY != 80)
+ if (gPokedexView->menuY != 80)
gPokedexView->menuY += 8;
else
{
- if(gMain.newKeys & A_BUTTON)
+ if (gMain.newKeys & A_BUTTON)
{
- switch(gPokedexView->menuCursorPos)
+ switch (gPokedexView->menuCursorPos)
{
case 0: //BACK TO LIST
default:
@@ -464,20 +464,20 @@ void Task_PokedexMainScreenMenu(u8 taskId)
break;
}
}
-
+
//Exit menu when Start or B is pressed
- if(gMain.newKeys & (START_BUTTON | B_BUTTON))
+ if (gMain.newKeys & (START_BUTTON | B_BUTTON))
{
gPokedexView->menuIsOpen = 0;
gTasks[taskId].func = Task_PokedexMainScreen;
PlaySE(SE_SELECT);
}
- else if((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos != 0)
+ else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos != 0)
{
gPokedexView->menuCursorPos--;
PlaySE(SE_SELECT);
}
- else if((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 2)
+ else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 2)
{
gPokedexView->menuCursorPos++;
PlaySE(SE_SELECT);
@@ -487,7 +487,7 @@ void Task_PokedexMainScreenMenu(u8 taskId)
void sub_808CA64(u8 taskId)
{
- if(gSprites[gPokedexView->unk626].pos1.x == 0x30 &&
+ if (gSprites[gPokedexView->unk626].pos1.x == 0x30 &&
gSprites[gPokedexView->unk626].pos1.y == 0x38)
{
gPokedexView->unk64B = gPokedexView->unk64A;
@@ -498,9 +498,9 @@ void sub_808CA64(u8 taskId)
void sub_808CAE4(u8 taskId)
{
- if(gTasks[gTasks[taskId].data[0]].isActive)
+ if (gTasks[gTasks[taskId].data[0]].isActive)
{
- if(gPokedexView->unk64A == 1 &&
+ if (gPokedexView->unk64A == 1 &&
!sub_808F250(gTasks[taskId].data[0]) &&
sub_808E71C())
{
@@ -518,10 +518,10 @@ void sub_808CAE4(u8 taskId)
void sub_808CB8C(u8 taskId)
{
bool8 isActive = gTasks[gTasks[taskId].data[0]].isActive;
-
- if(!isActive)
+
+ if (!isActive)
{
- if(gPokedexView->unk64F)
+ if (gPokedexView->unk64F)
{
gPokedexView->selectedPokemon = isActive;
gPokedexView->unk62C = 0x40;
@@ -532,7 +532,7 @@ void sub_808CB8C(u8 taskId)
gPokedexView->unk62C = gPokedexView->unk62A;
gPokedexView->selectedPokemon = gPokedexView->unk610;
gPokedexView->dexMode = gPokedexView->unk614;
- if(!IsNationalPokedexEnabled())
+ if (!IsNationalPokedexEnabled())
gPokedexView->dexMode = DEX_MODE_HOENN;
gPokedexView->dexOrder = gPokedexView->unk618;
gTasks[taskId].func = Task_PokedexShowMainScreen;
@@ -542,10 +542,10 @@ void sub_808CB8C(u8 taskId)
void Task_ClosePokedex(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
gSaveBlock2.pokedex.unknown1 = gPokedexView->dexMode;
- if(!IsNationalPokedexEnabled())
+ if (!IsNationalPokedexEnabled())
gSaveBlock2.pokedex.unknown1 = 0;
gSaveBlock2.pokedex.order = gPokedexView->dexOrder;
DestroyTask(taskId);
@@ -557,22 +557,22 @@ void Task_ClosePokedex(u8 taskId)
void sub_808CCC4(u8 taskId)
{
gPokedexView->unk64C_1 = 1;
- if(sub_808D344(3))
+ if (sub_808D344(3))
gTasks[taskId].func = Task_PokedexResultsScreen;
}
void Task_PokedexResultsScreen(u8 taskId)
{
REG_BG0VOFS = gPokedexView->menuY;
-
- if(gPokedexView->menuY)
+
+ if (gPokedexView->menuY)
gPokedexView->menuY -= 8;
else
{
- if((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen)
+ if ((gMain.newKeys & A_BUTTON) && gPokedexView->unk0[gPokedexView->selectedPokemon].seen)
{
u32 a;
-
+
sub_808E6BC();
a = (1 << (gSprites[gPokedexView->unk626].oam.paletteNum + 16));
gSprites[gPokedexView->unk626].callback = sub_808EDB8;
@@ -580,7 +580,7 @@ void Task_PokedexResultsScreen(u8 taskId)
gTasks[taskId].func = sub_808D118;
PlaySE(SE_PIN);
}
- else if(gMain.newKeys & START_BUTTON)
+ else if (gMain.newKeys & START_BUTTON)
{
gPokedexView->menuY = 0;
gPokedexView->menuIsOpen = 1;
@@ -588,7 +588,7 @@ void Task_PokedexResultsScreen(u8 taskId)
gTasks[taskId].func = Task_PokedexResultsScreenMenu;
PlaySE(SE_SELECT);
}
- else if(gMain.newKeys & SELECT_BUTTON)
+ else if (gMain.newKeys & SELECT_BUTTON)
{
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].data[0] = sub_8091E3C();
@@ -596,7 +596,7 @@ void Task_PokedexResultsScreen(u8 taskId)
gTasks[taskId].func = sub_808CB8C;
PlaySE(SE_PC_LOGON);
}
- else if(gMain.newKeys & B_BUTTON)
+ else if (gMain.newKeys & B_BUTTON)
{
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].func = Task_PokedexResultsScreenReturnToMainScreen;
@@ -604,9 +604,9 @@ void Task_PokedexResultsScreen(u8 taskId)
}
else
{
- //Handle D-pad
+ //Handle D-pad
gPokedexView->selectedPokemon = sub_808E48C(gPokedexView->selectedPokemon, 0xE);
- if(gPokedexView->unk62E)
+ if (gPokedexView->unk62E)
gTasks[taskId].func = sub_808CEF8;
}
}
@@ -614,21 +614,21 @@ void Task_PokedexResultsScreen(u8 taskId)
void sub_808CEF8(u8 taskId)
{
- if(sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636))
+ if (sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636))
gTasks[taskId].func = Task_PokedexResultsScreen;
}
void Task_PokedexResultsScreenMenu(u8 taskId)
{
REG_BG0VOFS = gPokedexView->menuY;
-
- if(gPokedexView->menuY != 0x60)
+
+ if (gPokedexView->menuY != 0x60)
gPokedexView->menuY += 8;
else
{
- if(gMain.newKeys & A_BUTTON)
+ if (gMain.newKeys & A_BUTTON)
{
- switch(gPokedexView->menuCursorPos)
+ switch (gPokedexView->menuCursorPos)
{
case 0: //BACK TO LIST
default:
@@ -660,20 +660,20 @@ void Task_PokedexResultsScreenMenu(u8 taskId)
break;
}
}
-
+
//Exit menu when Start or B is pressed
- if(gMain.newKeys & (START_BUTTON | B_BUTTON))
+ if (gMain.newKeys & (START_BUTTON | B_BUTTON))
{
gPokedexView->menuIsOpen = 0;
gTasks[taskId].func = Task_PokedexResultsScreen;
PlaySE(SE_SELECT);
}
- else if((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos)
+ else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gPokedexView->menuCursorPos)
{
gPokedexView->menuCursorPos--;
PlaySE(SE_SELECT);
}
- else if((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 3)
+ else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gPokedexView->menuCursorPos <= 3)
{
gPokedexView->menuCursorPos++;
PlaySE(SE_SELECT);
@@ -683,7 +683,7 @@ void Task_PokedexResultsScreenMenu(u8 taskId)
void sub_808D118(u8 taskId)
{
- if(gSprites[gPokedexView->unk626].pos1.x == 0x30 &&
+ if (gSprites[gPokedexView->unk626].pos1.x == 0x30 &&
gSprites[gPokedexView->unk626].pos1.y == 0x38)
{
gPokedexView->unk64B = gPokedexView->unk64A;
@@ -694,9 +694,9 @@ void sub_808D118(u8 taskId)
void sub_808D198(u8 taskId)
{
- if(gTasks[gTasks[taskId].data[0]].isActive)
+ if (gTasks[gTasks[taskId].data[0]].isActive)
{
- if(gPokedexView->unk64A == 1 &&
+ if (gPokedexView->unk64A == 1 &&
!sub_808F250(gTasks[taskId].data[0]) &&
sub_808E71C())
{
@@ -711,12 +711,12 @@ void sub_808D198(u8 taskId)
void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
gPokedexView->unk62C = gPokedexView->unk62A;
gPokedexView->selectedPokemon = gPokedexView->unk610;
gPokedexView->dexMode = gPokedexView->unk614;
- if(!IsNationalPokedexEnabled())
+ if (!IsNationalPokedexEnabled())
gPokedexView->dexMode = DEX_MODE_HOENN;
gPokedexView->dexOrder = gPokedexView->unk618;
gTasks[taskId].func = Task_PokedexShowMainScreen;
@@ -725,12 +725,12 @@ void Task_PokedexResultsScreenReturnToMainScreen(u8 taskId)
void Task_PokedexResultsScreenExitPokedex(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
gPokedexView->unk62C = gPokedexView->unk62A;
gPokedexView->selectedPokemon = gPokedexView->unk610;
gPokedexView->dexMode = gPokedexView->unk614;
- if(!IsNationalPokedexEnabled())
+ if (!IsNationalPokedexEnabled())
gPokedexView->dexMode = DEX_MODE_HOENN;
gPokedexView->dexOrder = gPokedexView->unk618;
gTasks[taskId].func = Task_ClosePokedex;
@@ -740,11 +740,11 @@ void Task_PokedexResultsScreenExitPokedex(u8 taskId)
bool8 sub_808D344(u8 a)
{
- switch(gMain.state)
+ switch (gMain.state)
{
case 0:
default:
- if(gPaletteFade.active)
+ if (gPaletteFade.active)
return 0;
//_0808D39E
SetVBlankCallback(NULL);
@@ -755,12 +755,12 @@ bool8 sub_808D344(u8 a)
LZ77UnCompVram(gUnknown_08E96738, (void *)(VRAM + 0x6800));
LZ77UnCompVram(gUnknown_08E9C6DC, (void *)(VRAM + 0x7800));
DmaClear16(3, VRAM + 0x6000, 0x500);
- if(a == 0)
+ if (a == 0)
LZ77UnCompVram(gUnknown_08E96888, (void *)(VRAM + 0x6500));
else
LZ77UnCompVram(gUnknown_08E96994, (void *)(VRAM + 0x6500));
ResetPaletteFade();
- if(a == 0)
+ if (a == 0)
gPokedexView->unk64C_1 = 0;
else
gPokedexView->unk64C_1 = 1;
@@ -783,7 +783,7 @@ bool8 sub_808D344(u8 a)
gMain.state++;
break;
case 3:
- if(a == 0)
+ if (a == 0)
SortPokedex(gPokedexView->dexMode, gPokedexView->dexOrder);
sub_808E0CC(gPokedexView->selectedPokemon, 0xE);
gPokedexView->menuIsOpen = 0;
@@ -812,7 +812,7 @@ bool8 sub_808D344(u8 a)
gMain.state++;
break;
case 6:
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
gMain.state = 0;
return 1;
@@ -825,9 +825,9 @@ bool8 sub_808D344(u8 a)
void sub_808D640(void)
{
- if(gPokedexView->unk64C_1)
+ if (gPokedexView->unk64C_1)
LoadPalette(gUnknown_0839F67C + 0x2, 1, 0xBE);
- else if(!IsNationalPokedexEnabled())
+ else if (!IsNationalPokedexEnabled())
LoadPalette(gPokedexMenu_Pal + 0x2, 1, 0xBE);
else
LoadPalette(gUnknown_0839F73C + 0x2, 1, 0xBE);
@@ -837,10 +837,10 @@ void SortPokedex(u8 dexMode, u8 sortMode)
{
u16 vars[3]; //I have no idea why three regular variables are stored in an array, but whatever.
s16 i;
-
+
gPokedexView->unk60C = 0;
-
- switch(dexMode)
+
+ switch (dexMode)
{
default:
case DEX_MODE_HOENN:
@@ -848,7 +848,7 @@ void SortPokedex(u8 dexMode, u8 sortMode)
vars[1] = 1;
break;
case DEX_MODE_NATIONAL:
- if(IsNationalPokedexEnabled())
+ if (IsNationalPokedexEnabled())
{
vars[0] = 386;
vars[1] = 0;
@@ -860,20 +860,20 @@ void SortPokedex(u8 dexMode, u8 sortMode)
}
break;
}
-
- switch(sortMode)
+
+ switch (sortMode)
{
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 = sub_8090D90(vars[2], 0);
gPokedexView->unk0[i].owned = sub_8090D90(vars[2], 1);
- if(gPokedexView->unk0[i].seen)
+ if (gPokedexView->unk0[i].seen)
gPokedexView->unk60C = i + 1;
}
}
@@ -883,18 +883,18 @@ void SortPokedex(u8 dexMode, u8 sortMode)
s16 r5;
r10 = r5 = i = 0;
- for(i = 0; i < vars[0]; i++)
+ for (i = 0; i < vars[0]; i++)
{
vars[2] = i + 1;
- if(sub_8090D90(vars[2], 0))
+ if (sub_8090D90(vars[2], 0))
r10 = 1;
- if(r10)
+ if (r10)
{
asm(""); //Needed to match for some reason
gPokedexView->unk0[r5].dexNum = vars[2];
gPokedexView->unk0[r5].seen = sub_8090D90(vars[2], 0);
gPokedexView->unk0[r5].owned = sub_8090D90(vars[2], 1);
- if(gPokedexView->unk0[r5].seen)
+ if (gPokedexView->unk0[r5].seen)
gPokedexView->unk60C = r5 + 1;
r5++;
}
@@ -903,11 +903,11 @@ void SortPokedex(u8 dexMode, u8 sortMode)
break;
}
case 1:
- for(i = 0; i < 411; i++)
+ for (i = 0; i < 411; i++)
{
vars[2] = gPokedexOrder_Alphabetical[i];
-
- if(NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 0))
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 0))
{
gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
@@ -917,11 +917,11 @@ void SortPokedex(u8 dexMode, u8 sortMode)
}
break;
case 2:
- for(i = 385; i >= 0; i--)
+ for (i = 385; i >= 0; i--)
{
vars[2] = gPokedexOrder_Weight[i];
-
- if(NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 1))
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 1))
{
gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
@@ -931,11 +931,11 @@ void SortPokedex(u8 dexMode, u8 sortMode)
}
break;
case 3:
- for(i = 0; i < 386; i++)
+ for (i = 0; i < 386; i++)
{
vars[2] = gPokedexOrder_Weight[i];
-
- if(NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 1))
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 1))
{
gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
@@ -945,11 +945,11 @@ void SortPokedex(u8 dexMode, u8 sortMode)
}
break;
case 4:
- for(i = 385; i >=0; i--)
+ for (i = 385; i >=0; i--)
{
vars[2] = gPokedexOrder_Height[i];
-
- if(NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 1))
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 1))
{
gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
@@ -959,11 +959,11 @@ void SortPokedex(u8 dexMode, u8 sortMode)
}
break;
case 5:
- for(i = 0; i < 386; i++)
+ for (i = 0; i < 386; i++)
{
vars[2] = gPokedexOrder_Height[i];
-
- if(NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 1))
+
+ if (NationalToHoennOrder(vars[2]) <= vars[0] && sub_8090D90(vars[2], 1))
{
gPokedexView->unk0[gPokedexView->unk60C].dexNum = vars[2];
gPokedexView->unk0[gPokedexView->unk60C].seen = 1;
@@ -971,9 +971,9 @@ void SortPokedex(u8 dexMode, u8 sortMode)
gPokedexView->unk60C++;
}
}
- break;
+ break;
}
- for(i = gPokedexView->unk60C; i < 386; i++)
+ for (i = gPokedexView->unk60C; i < 386; i++)
{
gPokedexView->unk0[i].dexNum |= 0xFFFF;
gPokedexView->unk0[i].seen = 0;
@@ -983,22 +983,22 @@ void SortPokedex(u8 dexMode, u8 sortMode)
void sub_808DBE8(u8 a, u16 b, u16 c)
{
- switch(a)
+ switch (a)
{
case 0:
default:
{
u16 i;
s16 _b = b - 5;
-
- for(i = 0; i <= 10; i++)
+
+ for (i = 0; i <= 10; i++)
{
- if((u16)_b > 385 || gPokedexView->unk0[_b].dexNum == 0xFFFF)
+ 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)
+ if (gPokedexView->unk0[_b].seen)
{
sub_808DEB0(_b, 0x12, i * 2, c);
sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, i * 2, c);
@@ -1018,13 +1018,13 @@ void sub_808DBE8(u8 a, u16 b, u16 c)
case 1:
{
s16 _b = b - 5;
-
- if((u16)_b > 385 || gPokedexView->unk0[_b].dexNum == 0xFFFF)
+
+ if ((u16)_b > 385 || gPokedexView->unk0[_b].dexNum == 0xFFFF)
sub_808E090(0x11, gPokedexView->unk630 * 2, c);
else
{
sub_808E090(0x11, gPokedexView->unk630 * 2, c);
- if(gPokedexView->unk0[_b].seen)
+ if (gPokedexView->unk0[_b].seen)
{
sub_808DEB0(_b, 0x12, gPokedexView->unk630 * 2, c);
sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, gPokedexView->unk630 * 2, c);
@@ -1043,15 +1043,15 @@ void sub_808DBE8(u8 a, u16 b, u16 c)
{
s16 _b = b + 5;
u16 r2 = gPokedexView->unk630 + 10;
-
- if(r2 > 15)
+
+ if (r2 > 15)
r2 -= 16;
- if((u16)_b > 385 || gPokedexView->unk0[_b].dexNum == 0xFFFF)
+ 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)
+ if (gPokedexView->unk0[_b].seen)
{
sub_808DEB0(_b, 0x12, r2 * 2, c);
sub_808DF88(gPokedexView->unk0[_b].owned, 0x11, r2 * 2, c);
@@ -1074,8 +1074,8 @@ void sub_808DEB0(u16 a, u8 b, u8 c, u16 d)
u8 text[4];
u16 unk[2];
u16 r7 = gPokedexView->unk0[a].dexNum;
-
- if(gPokedexView->dexMode == DEX_MODE_HOENN)
+
+ if (gPokedexView->dexMode == DEX_MODE_HOENN)
r7 = NationalToHoennOrder(r7);
unk[0] = 0x3FC;
unk[1] = 0x3FD;
@@ -1091,8 +1091,8 @@ void sub_808DEB0(u16 a, u8 b, u8 c, u16 d)
void sub_808DF88(u16 a, u8 b, u8 c, u16 d)
{
u16 unk[2];
-
- if(a)
+
+ if (a)
{
unk[0] = 0x3FE;
unk[1] = 0x3FF;
@@ -1113,19 +1113,19 @@ u8 sub_808DFE4(u16 a, u8 b, u8 c)
u8 text[10];
u8 i;
u32 species;
-
- for(i = 0; i < 10; i++)
+
+ for (i = 0; i < 10; i++)
text[i] = 0;
text[i] = EOS;
species = NationalPokedexNumToSpecies(a);
- if(species)
+ if (species)
{
- for(i = 0; gSpeciesNames[species][i] != EOS && i < 10; i++)
+ for (i = 0; gSpeciesNames[species][i] != EOS && i < 10; i++)
text[i] = gSpeciesNames[species][i];
}
else
{
- for(i = 0; i < 10; i++)
+ for (i = 0; i < 10; i++)
text[i] = 0xAE;
}
MenuPrint_PixelCoords(text, (b - 0x11) * 8 + 0xFC, c * 8, 0);
@@ -1230,8 +1230,8 @@ _0808E070:\n\
void sub_808E090(u8 a, u8 b, u16 c)
{
u8 i;
-
- for(i = 0; i < 12; i++)
+
+ for (i = 0; i < 12; i++)
{
*(u16 *)(VRAM + c * 0x800 + b * 64 + (a + i) * 2) = 0;
*(u16 *)(VRAM + 0x40 + c * 0x800 + b * 64 + (a + i) * 2) = 0;
@@ -1243,28 +1243,28 @@ void sub_808E0CC(u16 a, u16 b)
u8 i;
u16 unk;
u8 spriteId;
-
- for(i = 0; i < 4; i++)
+
+ for (i = 0; i < 4; i++)
gPokedexView->unk61E[i] |= 0xFFFF;
gPokedexView->unk626 = 0xFFFF;
sub_808DBE8(0, a, b);
REG_BG2VOFS = gPokedexView->unk62D;
unk = sub_808E888(a - 1);
- if(unk != 0xFFFF)
+ if (unk != 0xFFFF)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
gSprites[spriteId].data5 = -32;
}
unk = sub_808E888(a);
- if(unk != 0xFFFF)
+ if (unk != 0xFFFF)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
gSprites[spriteId].data5 = 0;
}
unk = sub_808E888(a + 1);
- if(unk != 0xFFFF)
+ if (unk != 0xFFFF)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
@@ -1278,16 +1278,16 @@ bool8 sub_808E208(u8 a, u8 b, u8 c)
{
u16 i;
u8 foo;
-
- if(gPokedexView->unk62E)
+
+ if (gPokedexView->unk62E)
{
gPokedexView->unk62E--;
- switch(a)
+ switch (a)
{
case 1:
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
{
- if(gPokedexView->unk61E[i] != 0xFFFF)
+ if (gPokedexView->unk61E[i] != 0xFFFF)
gSprites[gPokedexView->unk61E[i]].data5 += b;
}
foo = 16 * (c - gPokedexView->unk62E) / c;
@@ -1295,9 +1295,9 @@ bool8 sub_808E208(u8 a, u8 b, u8 c)
gPokedexView->unk62C -= gPokedexView->unk628;
break;
case 2:
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
{
- if(gPokedexView->unk61E[i] != 0xFFFF)
+ if (gPokedexView->unk61E[i] != 0xFFFF)
gSprites[gPokedexView->unk61E[i]].data5 -= b;
}
foo = 16 * (c - gPokedexView->unk62E) / c;
@@ -1319,20 +1319,20 @@ void sub_808E398(u8 a, u16 b)
{
u16 unk;
u8 spriteId;
-
+
gPokedexView->unk632 = gPokedexView->unk630;
- switch(a)
+ switch (a)
{
case 1:
{
unk = sub_808E888(b - 1);
- if(unk != 0xFFFF)
+ if (unk != 0xFFFF)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
gSprites[spriteId].data5 = 0xFFC0;
}
- if(gPokedexView->unk630 > 0)
+ if (gPokedexView->unk630 > 0)
gPokedexView->unk630--;
else
gPokedexView->unk630 = 0xF;
@@ -1341,13 +1341,13 @@ void sub_808E398(u8 a, u16 b)
case 2:
{
unk = sub_808E888(b + 1);
- if(unk != 0xFFFF)
+ if (unk != 0xFFFF)
{
spriteId = sub_808E8C8(unk, 0x60, 0x50);
gSprites[spriteId].callback = sub_808EE28;
gSprites[spriteId].data5 = 0x40;
}
- if(gPokedexView->unk630 <= 0xE)
+ if (gPokedexView->unk630 <= 0xE)
gPokedexView->unk630++;
else
gPokedexView->unk630 = 0;
@@ -1362,28 +1362,28 @@ u16 sub_808E48C(u16 a, u16 b)
u8 r3;
u8 r5;
u32 r10 = 0;
- if(!(gMain.heldKeys & 0x40) || a == 0)
+ if (!(gMain.heldKeys & 0x40) || a == 0)
{
u8 i;
u16 r6;
-
+
//_0808E4B6
- if(gMain.heldKeys & 0x80)
+ if (gMain.heldKeys & 0x80)
{
- if(a < gPokedexView->unk60C - 1)
+ if (a < gPokedexView->unk60C - 1)
goto _0808E5C4;
}
//_0808E4CE
-
- if((gMain.newKeys & 0x20) && a != 0)
+
+ if ((gMain.newKeys & 0x20) && a != 0)
{
r6 = a;
//_0808E4E0
- for(i = 0; i < 7; i++)
+ for (i = 0; i < 7; i++)
{
a = sub_8091818(1, a, 0, gPokedexView->unk60C - 1);
}
-
+
gPokedexView->unk62C += (a - r6) * 16;
sub_808E82C();
sub_808E0CC(a, 0xE);
@@ -1391,27 +1391,27 @@ u16 sub_808E48C(u16 a, u16 b)
goto _0808E5A2;
}
//_0808E53C
- if(!(gMain.newKeys & 0x10) || a >= gPokedexView->unk60C - 1)
+ if (!(gMain.newKeys & 0x10) || a >= gPokedexView->unk60C - 1)
goto _0808E5A2;
-
+
r6 = a;
- for(i = 0; i < 7; i++)
+ for (i = 0; i < 7; i++)
{
a = sub_8091818(0, a, 0, gPokedexView->unk60C - 1);
}
-
+
gPokedexView->unk62C += (a - r6) * 16;
sub_808E82C();
sub_808E0CC(a, 0xE);
PlaySE(SE_Z_PAGE);
goto _0808E5A2;
-
+
_0808E5A2:
- if(r10 != 0)
+ if (r10 != 0)
goto _0808E628;
gPokedexView->unk638 = r10;
return a;
-
+
_0808E5C4:
r10 = 2;
a = sub_8091818(0, a, 0, gPokedexView->unk60C - 1);
@@ -1432,7 +1432,7 @@ u16 sub_808E48C(u16 a, u16 b)
}
//_0808E60E
goto _0808E5A2;
-
+
_0808E628:
r5 = gUnknown_083A05EC[gPokedexView->unk638 / 4];
r3 = gUnknown_083A05F1[gPokedexView->unk638 / 4];
@@ -1442,7 +1442,7 @@ u16 sub_808E48C(u16 a, u16 b)
gPokedexView->unk62F = r10;
gPokedexView->unk628 = r5;
sub_808E208(gPokedexView->unk62F, gPokedexView->unk634, gPokedexView->unk636);
- if(gPokedexView->unk638 <= 0xB)
+ if (gPokedexView->unk638 <= 0xB)
gPokedexView->unk638++;
return a;
}
@@ -1719,12 +1719,12 @@ _0808E6B8: .4byte 0x0000062f\n\
void sub_808E6BC(void)
{
u16 i;
-
- for(i = 0; i < 4; i++)
+
+ for (i = 0; i < 4; i++)
{
u16 spriteId = gPokedexView->unk61E[i];
-
- if(gSprites[spriteId].pos2.x == 0 && gSprites[spriteId].pos2.y == 0 && spriteId != 0xFFFF)
+
+ if (gSprites[spriteId].pos2.x == 0 && gSprites[spriteId].pos2.y == 0 && spriteId != 0xFFFF)
gPokedexView->unk626 = spriteId;
}
}
@@ -1733,22 +1733,22 @@ u8 sub_808E71C(void)
{
u16 r2;
u16 r4 = gPokedexView->selectedPokemon;
-
- if((gMain.newKeys & DPAD_UP) && r4)
+
+ if ((gMain.newKeys & DPAD_UP) && r4)
{
r2 = r4;
- while(r2 != 0)
+ while (r2 != 0)
{
r2 = sub_8091818(1, r2, 0, gPokedexView->unk60C - 1);
-
- if(gPokedexView->unk0[r2].seen)
+
+ if (gPokedexView->unk0[r2].seen)
{
r4 = r2;
break;
}
}
-
- if(gPokedexView->selectedPokemon == r4)
+
+ if (gPokedexView->selectedPokemon == r4)
return 0;
else
{
@@ -1757,21 +1757,21 @@ u8 sub_808E71C(void)
return 1;
}
}
- else if((gMain.newKeys & DPAD_DOWN) && r4 < gPokedexView->unk60C - 1)
+ else if ((gMain.newKeys & DPAD_DOWN) && r4 < gPokedexView->unk60C - 1)
{
r2 = r4;
- while(r2 < gPokedexView->unk60C - 1)
+ while (r2 < gPokedexView->unk60C - 1)
{
r2 = sub_8091818(0, r2, 0, gPokedexView->unk60C - 1);
-
- if(gPokedexView->unk0[r2].seen)
+
+ if (gPokedexView->unk0[r2].seen)
{
r4 = r2;
break;
}
}
-
- if(gPokedexView->selectedPokemon == r4)
+
+ if (gPokedexView->selectedPokemon == r4)
return 0;
else
{
@@ -1786,10 +1786,10 @@ u8 sub_808E71C(void)
u8 sub_808E82C(void)
{
u16 i;
-
- for(i = 0; i < 4; i++)
+
+ for (i = 0; i < 4; i++)
{
- if(gPokedexView->unk61E[i] != 0xFFFF)
+ if (gPokedexView->unk61E[i] != 0xFFFF)
{
DestroySprite(&gSprites[gPokedexView->unk61E[i]]);
gPokedexView->unk61E[i] |= 0xFFFF;
@@ -1800,9 +1800,9 @@ u8 sub_808E82C(void)
u16 sub_808E888(u16 a1)
{
- if(a1 > 385 || gPokedexView->unk0[a1].dexNum == 0xFFFF)
+ if (a1 > 385 || gPokedexView->unk0[a1].dexNum == 0xFFFF)
return 0xFFFF;
- else if(gPokedexView->unk0[a1].seen)
+ else if (gPokedexView->unk0[a1].seen)
return gPokedexView->unk0[a1].dexNum;
else
return 0;
@@ -1811,13 +1811,13 @@ u16 sub_808E888(u16 a1)
u32 sub_808E8C8(u16 a, u16 b, u16 c)
{
u8 i;
-
- for(i = 0; i < 4; i++)
+
+ for (i = 0; i < 4; i++)
{
- if(gPokedexView->unk61E[i] == 0xFFFF)
+ if (gPokedexView->unk61E[i] == 0xFFFF)
{
u8 spriteId = sub_80918EC(a, (s16)b, (s16)c, i);
-
+
gSprites[spriteId].oam.affineMode = 1;
gSprites[spriteId].oam.priority = 3;
gSprites[spriteId].data0 = 0;
@@ -1834,88 +1834,88 @@ void sub_808E978(u8 a)
{
u8 spriteId;
u16 r5;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A053C, 0xB8, 4, 0);
gSprites[spriteId].data1 = 0;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A053C, 0xB8, 0x9C, 0);
gSprites[spriteId].data1 = 1;
gSprites[spriteId].vFlip = 1;
-
+
CreateSprite(&gSpriteTemplate_83A0524, 0xEA, 0x14, 0);
CreateSprite(&gSpriteTemplate_83A0554, 0x10, 0x8A, 0);
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A0554, 0x30, 0x8A, 0);
StartSpriteAnim(&gSprites[spriteId], 3);
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A0554, 0x10, 0x9E, 0);
StartSpriteAnim(&gSprites[spriteId], 2);
gSprites[spriteId].data2 = 0x80;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A0554, 0x30, 0x9E, 0);
StartSpriteAnim(&gSprites[spriteId], 1);
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 0x50, 2);
gSprites[spriteId].oam.affineMode = 1;
gSprites[spriteId].oam.matrixNum = 30;
gSprites[spriteId].data0 = 0x1E;
gSprites[spriteId].data1 = 0;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A056C, 0, 0x50, 2);
gSprites[spriteId].oam.affineMode = 1;
gSprites[spriteId].oam.matrixNum = 31;
gSprites[spriteId].data0 = 0x1F;
gSprites[spriteId].data1 = 0x80;
-
- if(a == 0)
+
+ if (a == 0)
{
u32 _a;
-
+
CreateSprite(&gSpriteTemplate_83A0584, 0x20, 0x28, 1);
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A0584, 0x20, 0x48, 1);
StartSpriteAnim(&gSprites[spriteId], 1);
_a = 0;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A059C, 0x1C, 0x30, 1);
r5 = gPokedexView->unk61A / 100;
StartSpriteAnim(&gSprites[spriteId], r5);
- if(r5 != 0)
+ if (r5 != 0)
_a = 1;
else
gSprites[spriteId].invisible = 1;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A059C, 0x22, 0x30, 1);
r5 = (gPokedexView->unk61A % 100) / 10;
- if(r5 != 0 || _a != 0)
+ if (r5 != 0 || _a != 0)
StartSpriteAnim(&gSprites[spriteId], r5);
else
gSprites[spriteId].invisible = 1;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A059C, 0x28, 0x30, 1);
r5 = (gPokedexView->unk61A % 100) % 10;
StartSpriteAnim(&gSprites[spriteId], r5);
_a = 0;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A059C, 0x1C, 0x50, 1);
r5 = gPokedexView->unk61C / 100;
StartSpriteAnim(&gSprites[spriteId], r5);
- if(r5 != 0)
+ if (r5 != 0)
_a = 1;
else
gSprites[spriteId].invisible = 1;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A059C, 0x22, 0x50, 1);
r5 = (gPokedexView->unk61C % 100) / 10;
- if(r5 != 0 || _a != 0)
+ if (r5 != 0 || _a != 0)
StartSpriteAnim(&gSprites[spriteId], r5);
else
gSprites[spriteId].invisible = 1;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A059C, 0x28, 0x50, 1);
r5 = (gPokedexView->unk61C % 100) % 10;
StartSpriteAnim(&gSprites[spriteId], r5);
-
+
spriteId = CreateSprite(&gSpriteTemplate_83A05B4, 0x8C, 0x60, 1);
gSprites[spriteId].invisible = 1;
}
@@ -1932,7 +1932,7 @@ void nullsub_58(struct Sprite *sprite)
void sub_808ED94(struct Sprite *sprite)
{
- if(gPokedexView->unk64A != 0)
+ if (gPokedexView->unk64A != 0)
DestroySprite(sprite);
}
@@ -1943,15 +1943,15 @@ void sub_808EDB8(struct Sprite *sprite)
sprite->oam.affineMode = 0;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
- if(sprite->pos1.x != 0x30 || sprite->pos1.y != 0x38)
+ if (sprite->pos1.x != 0x30 || sprite->pos1.y != 0x38)
{
- if(sprite->pos1.x > 0x30)
+ if (sprite->pos1.x > 0x30)
sprite->pos1.x--;
- if(sprite->pos1.x < 0x30)
+ if (sprite->pos1.x < 0x30)
sprite->pos1.x++;
- if(sprite->pos1.y > 0x38)
+ if (sprite->pos1.y > 0x38)
sprite->pos1.y--;
- if(sprite->pos1.y <0x38)
+ if (sprite->pos1.y <0x38)
sprite->pos1.y++;
}
//_0808EE1C
@@ -1962,8 +1962,8 @@ void sub_808EDB8(struct Sprite *sprite)
void sub_808EE28(struct Sprite *sprite)
{
u8 data1 = sprite->data1;
-
- if(gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
+
+ if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
{
DestroySprite(sprite);
gPokedexView->unk61E[data1] = 0xFFFF;
@@ -1972,16 +1972,16 @@ void sub_808EE28(struct Sprite *sprite)
{
//_0808EE58
s32 var;
-
+
sprite->pos2.y = gSineTable[(u8)sprite->data5] * 76 / 256;
var = 0x10000 / gSineTable[sprite->data5 + 0x40];
- if((u32)var > 0xFFFF)
+ if ((u32)var > 0xFFFF)
var = 0xFFFF;
SetOamMatrix(sprite->data1 + 1, 0x100, 0, 0, var);
sprite->oam.matrixNum = data1 + 1;
-
+
//ToDo: clean up these inequalities
- if((u16)(sprite->data5 + 0x3F) <= 0x7E)
+ if ((u16)(sprite->data5 + 0x3F) <= 0x7E)
{
sprite->invisible = 0;
sprite->data0 = 1;
@@ -1991,7 +1991,7 @@ void sub_808EE28(struct Sprite *sprite)
sprite->invisible = 1;
}
//_0808EEF8
- if((u16)(sprite->data5 + 0x3F) > 0x7E && sprite->data0 != 0)
+ if ((u16)(sprite->data5 + 0x3F) > 0x7E && sprite->data0 != 0)
{
DestroySprite(sprite);
gPokedexView->unk61E[data1] = 0xFFFF;
@@ -2002,7 +2002,7 @@ void sub_808EE28(struct Sprite *sprite)
void sub_808EF38(struct Sprite *sprite)
{
- if(gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
+ if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
DestroySprite(sprite);
else
sprite->pos2.y = gPokedexView->selectedPokemon * 120 / (gPokedexView->unk60C - 1);
@@ -2010,15 +2010,15 @@ void sub_808EF38(struct Sprite *sprite)
void sub_808EF8C(struct Sprite *sprite)
{
- if(gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
+ if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
DestroySprite(sprite);
else
{
u8 r0;
-
- if(sprite->data1 != 0)
- {
- if(gPokedexView->selectedPokemon == gPokedexView->unk60C - 1)
+
+ if (sprite->data1 != 0)
+ {
+ if (gPokedexView->selectedPokemon == gPokedexView->unk60C - 1)
sprite->invisible = 1;
else
sprite->invisible = 0;
@@ -2026,7 +2026,7 @@ void sub_808EF8C(struct Sprite *sprite)
}
else
{
- if(gPokedexView->selectedPokemon == 0)
+ if (gPokedexView->selectedPokemon == 0)
sprite->invisible = 1;
else
sprite->invisible = 0;
@@ -2034,7 +2034,7 @@ void sub_808EF8C(struct Sprite *sprite)
}
sprite->pos2.y = gSineTable[r0] / 64;
sprite->data2 = sprite->data2 + 8;
- if(gPokedexView->menuIsOpen == 0 && gPokedexView->menuY == 0 && sprite->invisible == 0)
+ if (gPokedexView->menuIsOpen == 0 && gPokedexView->menuY == 0 && sprite->invisible == 0)
sprite->invisible = 0;
else
sprite->invisible = 1;
@@ -2043,26 +2043,26 @@ void sub_808EF8C(struct Sprite *sprite)
void sub_808F08C(struct Sprite *sprite)
{
- if(gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
+ if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
DestroySprite(sprite);
}
#ifdef NONMATCHING
void sub_808F0B4(struct Sprite *sprite)
{
- if(gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
+ if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
DestroySprite(sprite);
else
{
s16 r3;
-
+
u8 unk = gPokedexView->unk62C + sprite->data1;
u16 foo = gSineTable[unk];
//u8 unk2 = sprite->data0;
//u16 bar = gSineTable[unk + 0x40];
-
+
SetOamMatrix(sprite->data0, foo, gSineTable[unk + 0x40], (-(u16)foo) >> 16, gSineTable[unk + 0x40]);
-
+
r3 = gSineTable[sprite->data1 + gPokedexView->unk62C];
sprite->pos2.x = gSineTable[sprite->data1 + gPokedexView->unk62C + 0x40] * 5 / 256;
sprite->pos2.y = r3 * 40 / 256;
@@ -2168,13 +2168,13 @@ _0808F164: .4byte gSineTable\n\
void sub_808F168(struct Sprite *sprite)
{
- if(gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
+ if (gPokedexView->unk64A != 0 && gPokedexView->unk64A != 3)
DestroySprite(sprite);
else
{
u16 r1 = gPokedexView->unk64A == 0 ? 0x50 : 0x60;
-
- if(gPokedexView->menuIsOpen != 0 && gPokedexView->menuY == r1)
+
+ if (gPokedexView->menuIsOpen != 0 && gPokedexView->menuY == r1)
{
sprite->invisible = 0;
sprite->pos2.y = gPokedexView->menuCursorPos * 16;
@@ -2189,7 +2189,7 @@ void sub_808F168(struct Sprite *sprite)
u8 sub_808F210(struct PokedexListItem *item, u8 b)
{
u8 taskId;
-
+
gUnknown_0202FFBC = item;
taskId = CreateTask(Task_InitPageScreenMultistep, 0);
gTasks[taskId].data[0] = 0;
@@ -2202,7 +2202,7 @@ u8 sub_808F210(struct PokedexListItem *item, u8 b)
bool8 sub_808F250(u8 taskId)
{
- if(gTasks[taskId].data[0] == 0 && gTasks[taskId].func == Task_PageScreenProcessInput)
+ if (gTasks[taskId].data[0] == 0 && gTasks[taskId].func == Task_PageScreenProcessInput)
return 0;
else
return 1;
@@ -2220,22 +2220,22 @@ u8 sub_808F284(struct PokedexListItem *item, u8 b)
void Task_InitPageScreenMultistep(u8 taskId)
{
- switch(gMain.state)
+ switch (gMain.state)
{
case 0:
default:
- if(!gPaletteFade.active)
+ 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)
+ if (gTasks[taskId].data[1] != 0)
r2 += 0x1000;
- if(gTasks[taskId].data[2] != 0)
+ if (gTasks[taskId].data[2] != 0)
r2 |= 0x200;
sub_8091060(r2);
gMain.state = 1;
@@ -2259,7 +2259,7 @@ void Task_InitPageScreenMultistep(u8 taskId)
gMain.state++;
break;
case 4:
- if(gPokedexView->dexMode == DEX_MODE_HOENN)
+ if (gPokedexView->dexMode == DEX_MODE_HOENN)
sub_8091154(NationalToHoennOrder(gUnknown_0202FFBC->dexNum), 0xD, 3);
else
sub_8091154(gUnknown_0202FFBC->dexNum, 0xD, 3);
@@ -2268,7 +2268,7 @@ void Task_InitPageScreenMultistep(u8 taskId)
MenuPrint(gDexText_UnknownPoke, 11, 5);
MenuPrint(gDexText_UnknownHeight, 16, 7);
MenuPrint(gDexText_UnknownWeight, 16, 9);
- if(gUnknown_0202FFBC->owned)
+ if (gUnknown_0202FFBC->owned)
{
sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, 11, 5);
sub_8091458(gPokedexEntries[gUnknown_0202FFBC->dexNum].height, 16, 7);
@@ -2285,7 +2285,7 @@ void Task_InitPageScreenMultistep(u8 taskId)
gMain.state++;
break;
case 5:
- if(gTasks[taskId].data[1] == 0)
+ if (gTasks[taskId].data[1] == 0)
{
//_0808F540
gTasks[taskId].data[4] = (u16)sub_80918EC(gUnknown_0202FFBC->dexNum, 0x30, 0x38, 0);
@@ -2296,10 +2296,10 @@ void Task_InitPageScreenMultistep(u8 taskId)
case 6:
{
u32 r3 = 0;
-
- if(gTasks[taskId].data[2] != 0)
+
+ if (gTasks[taskId].data[2] != 0)
r3 = 0x14;
- if(gTasks[taskId].data[1] != 0)
+ if (gTasks[taskId].data[1] != 0)
{
r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 0x10));
}
@@ -2318,10 +2318,10 @@ void Task_InitPageScreenMultistep(u8 taskId)
gMain.state++;
break;
case 8:
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
gMain.state++;
- if(gTasks[taskId].data[3] == 0)
+ if (gTasks[taskId].data[3] == 0)
{
StopCryAndClearCrySongs();
PlayCry2(NationalPokedexNumToSpecies(gUnknown_0202FFBC->dexNum), 0, 0x7D, 0xA);
@@ -2331,7 +2331,7 @@ void Task_InitPageScreenMultistep(u8 taskId)
}
break;
case 9:
- if(!IsCryPlayingOrClearCrySongs())
+ if (!IsCryPlayingOrClearCrySongs())
gMain.state++;
break;
case 10:
@@ -2408,13 +2408,13 @@ void Task_PageScreenProcessInput(u8 taskId)
void sub_808F888(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
gTasks[taskId].func = Task_InitPageScreenMultistep;
}
void Task_ClosePageScreen(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
DestroyTask(taskId);
}
@@ -2453,15 +2453,15 @@ void Task_InitAreaScreenMultistep(u8 taskId)
void Task_AreaScreenProcessInput(u8 taskId)
{
- if(gPokedexView->unk64F != 0)
+ if (gPokedexView->unk64F != 0)
gTasks[taskId].func = sub_808FA00;
}
void sub_808FA00(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
- switch(gPokedexView->unk64F)
+ switch (gPokedexView->unk64F)
{
case 1:
default:
@@ -2476,11 +2476,11 @@ void sub_808FA00(u8 taskId)
void Task_InitCryScreenMultistep(u8 taskId)
{
- switch(gMain.state)
+ switch (gMain.state)
{
case 0:
default:
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
m4aMPlayStop(&gMPlay_BGM);
gPokedexView->unk64A = 6;
@@ -2523,29 +2523,29 @@ void Task_InitCryScreenMultistep(u8 taskId)
case 6:
{
struct CryRelatedStruct sp8;
-
+
sp8.unk0 = 0x4020;
sp8.unk2 = 0x1F;
sp8.unk3 = 8;
sp8.unk5 = 0x1E;
sp8.unk4 = 0xC;
- if(sub_8119E3C(&sp8, 0) != 0)
+ if (sub_8119E3C(&sp8, 0) != 0)
{
gMain.state++;
gUnknown_03005E98 = 0;
}
break;
- }
+ }
case 7:
{
struct CryRelatedStruct sp10;
-
+
sp10.unk0 = 0x3000;
sp10.unk2 = 0xE;
sp10.unk3 = 9;
sp10.unk4 = 0x12;
sp10.unk5 = 3;
- if(ShowPokedexCryScreen(&sp10, 1) != 0)
+ if (ShowPokedexCryScreen(&sp10, 1) != 0)
{
gMain.state++;
}
@@ -2577,12 +2577,12 @@ void Task_InitCryScreenMultistep(u8 taskId)
void Task_CryScreenProcessInput(u8 taskId)
{
sub_8119F88(0);
-
+
if (IsCryPlaying())
sub_8090040(1);
else
sub_8090040(0);
-
+
if (gMain.newKeys & A_BUTTON)
{
sub_8090040(1);
@@ -2627,10 +2627,10 @@ void Task_CryScreenProcessInput(u8 taskId)
void sub_808FFBC(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
DestroyCryMeterNeedleSprite();
- switch(gPokedexView->unk64F)
+ switch (gPokedexView->unk64F)
{
default:
case 1:
@@ -2648,8 +2648,8 @@ void sub_808FFBC(u8 taskId)
void sub_8090040(u8 a)
{
u16 unk;
-
- if(a != 0)
+
+ if (a != 0)
unk = 0x392;
else
unk = 0x2AF;
@@ -2659,12 +2659,12 @@ void sub_8090040(u8 a)
void Task_InitSizeScreenMultistep(u8 taskId)
{
u8 spriteId;
-
- switch(gMain.state)
+
+ switch (gMain.state)
{
default:
case 0:
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
gPokedexView->unk64A = 7;
gUnknown_03005CEC = gMain.vblankCallback;
@@ -2688,7 +2688,7 @@ void Task_InitSizeScreenMultistep(u8 taskId)
case 3:
{
u8 string[40]; //I hope this is the correct size
-
+
SetUpWindowConfig(&gWindowConfig_81E702C);
InitMenuWindow(&gWindowConfig_81E702C);
string[0] = EOS;
@@ -2736,7 +2736,7 @@ void Task_InitSizeScreenMultistep(u8 taskId)
gMain.state++;
break;
case 9:
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
gPokedexView->unk64F = 0;
gMain.state = 0;
@@ -2748,7 +2748,7 @@ void Task_InitSizeScreenMultistep(u8 taskId)
void Task_SizeScreenProcessInput(u8 taskId)
{
- if(gMain.newKeys & B_BUTTON)
+ if (gMain.newKeys & B_BUTTON)
{
BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0);
gPokedexView->unk64F = 1;
@@ -2756,7 +2756,7 @@ void Task_SizeScreenProcessInput(u8 taskId)
PlaySE(SE_PC_OFF);
}
//_08090430
- else if((gMain.newKeys & DPAD_LEFT)
+ else if ((gMain.newKeys & DPAD_LEFT)
|| ((gMain.newKeys & L_BUTTON) && gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR))
{
BeginNormalPaletteFade(-0x15, 0, 0, 0x10, 0);
@@ -2768,9 +2768,9 @@ void Task_SizeScreenProcessInput(u8 taskId)
void sub_8090498(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
- switch(gPokedexView->unk64F)
+ switch (gPokedexView->unk64F)
{
default:
case 1:
@@ -2802,16 +2802,16 @@ void sub_8090584(u8 a, u16 b)
u8 j; //r3
u32 r6;
register u8 r7;
-
- for(i = 0; i < 4; i++)
+
+ for (i = 0; i < 4; i++)
{
r7 = i * 5 + 1;
r6 = 0x4000;
-
- if(i == a)
+
+ if (i == a)
r6 = 0x2000;
-
- for(j = 0; j < 5; j++)
+
+ for (j = 0; j < 5; j++)
{
u32 r0 = b * 0x800 + (r7 + j) * 2;
u8 *ptr;
@@ -2823,11 +2823,11 @@ void sub_8090584(u8 a, u16 b)
}
}
r6 = 0x4000;
- for(j = 0; j < 5; j++)
+ for (j = 0; j < 5; j++)
{
u32 r0 = b * 0x800 + j * 2;
u8 *ptr;
-
+
ptr = VRAM + 0x32;
*(u16 *)(ptr + r0) = *(u16 *)(ptr + r0) & 0xFFF | r6;
ptr = VRAM + 0x72;
@@ -2946,32 +2946,32 @@ void sub_8090644(u8 a, u16 b)
{
u8 i;
u8 j;
-
- for(i = 0; i < 4; i++)
+
+ for (i = 0; i < 4; i++)
{
u8 r8 = i * 5 + 1;
u32 r5;
-
- if(i == a || i == 0)
+
+ if (i == a || i == 0)
r5 = 0x2000;
- else if(a != 0)
+ else if (a != 0)
r5 = 0x4000;
-
- for(j = 0; j < 5; j++)
+
+ for (j = 0; j < 5; j++)
{
u16 (*vramData)[0x400];
-
+
vramData = (u16 (*)[])VRAM;
vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5;
vramData = (u16 (*)[])(VRAM + 0x40);
vramData[b][r8 + j] = vramData[b][r8 + j] & 0xFFF | r5;
}
}
-
- for(j = 0; j < 5; j++)
+
+ for (j = 0; j < 5; j++)
{
u16 (*vramData)[0x400];
-
+
vramData = (u16 (*)[])(VRAM + 0x32);
vramData[b][j] = vramData[b][j] & 0xFFF | 0x4000;
vramData = (u16 (*)[])(VRAM + 0x72);
@@ -3093,7 +3093,7 @@ _08090708: .4byte 0x06000072\n\
u8 sub_809070C(u16 dexNum, u32 b, u32 c)
{
u8 taskId = CreateTask(sub_8090750, 0);
-
+
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = dexNum;
gTasks[taskId].data[12] = b;
@@ -3107,12 +3107,12 @@ u8 sub_809070C(u16 dexNum, u32 b, u32 c)
void sub_8090750(u8 taskId)
{
u16 dexNum = gTasks[taskId].data[1];
-
- switch(gTasks[taskId].data[0])
+
+ switch (gTasks[taskId].data[0])
{
default:
case 0:
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
gUnknown_03005CEC = gMain.vblankCallback;
SetVBlankCallback(NULL);
@@ -3123,10 +3123,10 @@ void sub_8090750(u8 taskId)
case 1:
{
u16 i;
-
+
LZ77UnCompVram(gPokedexMenu_Gfx, (void *)(VRAM + 0x4000));
LZ77UnCompVram(gUnknown_08E96BD4, (void *)(VRAM + 0x7800));
- for(i = 0; i < 0x280; i++)
+ for (i = 0; i < 0x280; i++)
((u16 *)(VRAM + 0x7800))[i] += 0x2000;
sub_8091738(gTasks[taskId].data[1], 2, 0x3FC);
ResetPaletteFade();
@@ -3142,7 +3142,7 @@ void sub_8090750(u8 taskId)
break;
case 3:
sub_8072BD8(gDexText_RegisterComplete, 2, 0, 0xD0);
- if(!IsNationalPokedexEnabled())
+ if (!IsNationalPokedexEnabled())
sub_8091154(NationalToHoennOrder(dexNum), 13, 3);
else
sub_8091154(dexNum, 13, 3);
@@ -3160,7 +3160,7 @@ void sub_8090750(u8 taskId)
case 4:
{
u8 spriteId = sub_80918EC(dexNum, 0x30, 0x38, 0);
-
+
gSprites[spriteId].oam.priority = 0;
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
SetVBlankCallback(gUnknown_03005CEC);
@@ -3177,7 +3177,7 @@ void sub_8090750(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 6:
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
PlayCry1(NationalPokedexNumToSpecies(dexNum), 0);
gTasks[taskId].data[2] = 0;
diff --git a/src/pokemon_1.c b/src/pokemon_1.c
index b8735fbc4..1c11449c3 100644
--- a/src/pokemon_1.c
+++ b/src/pokemon_1.c
@@ -1,14 +1,14 @@
#include "global.h"
#include "asm.h"
-#include "text.h"
-#include "string_util.h"
+#include "items.h"
+#include "main.h"
#include "pokemon.h"
+#include "rng.h"
#include "rom4.h"
#include "species.h"
-#include "main.h"
-#include "rng.h"
#include "sprite.h"
-#include "items.h"
+#include "string_util.h"
+#include "text.h"
//Extracts the upper 16 bits of a 32-bit number
#define HIHALF(n) (((n) & 0xFFFF0000) >> 16)
diff --git a/src/pokemon_2.c b/src/pokemon_2.c
index f6bd432c7..9030fe096 100644
--- a/src/pokemon_2.c
+++ b/src/pokemon_2.c
@@ -1,13 +1,13 @@
#include "global.h"
#include "asm.h"
-#include "text.h"
-#include "string_util.h"
+#include "event_data.h"
+#include "main.h"
#include "pokemon.h"
#include "rng.h"
#include "species.h"
-#include "main.h"
#include "sprite.h"
-#include "event_data.h"
+#include "string_util.h"
+#include "text.h"
extern u8 gPlayerPartyCount;
extern struct Pokemon gPlayerParty[6];
@@ -22,8 +22,8 @@ extern u8 gUnknown_02024A60;
extern struct BattlePokemon gBattleMons[4];
extern u16 gUnknown_02024BE6;
extern u8 byte_2024C06;
-extern u8 gUnknown_02024C07;
-extern u8 gUnknown_02024C08;
+extern u8 gPlayerMonIndex;
+extern u8 gEnemyMonIndex;
extern u8 gUnknown_02024C0C;
extern u8 gXXX_CritRelated;
extern u16 gBattleWeather;
@@ -39,10 +39,11 @@ 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 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[];
@@ -68,14 +69,14 @@ u8 sub_803C348(u8 a1)
case 1:
for (i = 0; i < 4; i++)
{
- if (battle_side_get_owner(i) == battle_side_get_owner(gUnknown_02024C07) && !(gUnknown_02024C0C & gBitTable[i]))
+ if (battle_side_get_owner(i) == battle_side_get_owner(gPlayerMonIndex) && !(gUnknown_02024C0C & gBitTable[i]))
retVal++;
}
break;
case 2:
for (i = 0; i < 4; i++)
{
- if (battle_side_get_owner(i) == battle_side_get_owner(gUnknown_02024C08) && !(gUnknown_02024C0C & gBitTable[i]))
+ if (battle_side_get_owner(i) == battle_side_get_owner(gEnemyMonIndex) && !(gUnknown_02024C0C & gBitTable[i]))
retVal++;
}
break;
@@ -133,72 +134,73 @@ u8 sub_803C434(u8 a1)
}
#else
__attribute__((naked))
-u8 sub_803C434(u8 a1) {
+u8 sub_803C434(u8 a1)
+{
asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- bl battle_get_per_side_status\n\
- movs r1, 0x1\n\
- movs r6, 0x1\n\
- adds r4, r6, 0\n\
- ands r4, r0\n\
- eors r4, r1\n\
- adds r5, r4, 0\n\
- ldr r0, _0803C45C\n\
- ldrh r1, [r0]\n\
- adds r0, r6, 0\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0803C460\n\
- adds r0, r4, 0\n\
- b _0803C4AA\n\
- .align 2, 0\n\
+ push {r4-r6,lr}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ bl battle_get_per_side_status\n\
+ movs r1, 0x1\n\
+ movs r6, 0x1\n\
+ adds r4, r6, 0\n\
+ ands r4, r0\n\
+ eors r4, r1\n\
+ adds r5, r4, 0\n\
+ ldr r0, _0803C45C\n\
+ ldrh r1, [r0]\n\
+ adds r0, r6, 0\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0803C460\n\
+ adds r0, r4, 0\n\
+ b _0803C4AA\n\
+ .align 2, 0\n\
_0803C45C: .4byte gBattleTypeFlags\n\
_0803C460:\n\
- movs r0, 0\n\
- bl sub_803C348\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0x1\n\
- bls _0803C484\n\
- bl Random\n\
- adds r1, r6, 0\n\
- ands r1, r0\n\
- cmp r1, 0\n\
- bne _0803C480\n\
- movs r0, 0x2\n\
- eors r0, r4\n\
- b _0803C4AA\n\
+ movs r0, 0\n\
+ bl sub_803C348\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bls _0803C484\n\
+ bl Random\n\
+ adds r1, r6, 0\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ bne _0803C480\n\
+ movs r0, 0x2\n\
+ eors r0, r4\n\
+ b _0803C4AA\n\
_0803C480:\n\
- adds r0, r4, 0\n\
- b _0803C4AA\n\
+ adds r0, r4, 0\n\
+ b _0803C4AA\n\
_0803C484:\n\
- ldr r0, _0803C49C\n\
- ldrb r1, [r0]\n\
- ldr r2, _0803C4A0\n\
- lsls r0, r4, 2\n\
- adds r0, r2\n\
- ldr r0, [r0]\n\
- ands r1, r0\n\
- cmp r1, 0\n\
- bne _0803C4A4\n\
- adds r0, r4, 0\n\
- b _0803C4AA\n\
- .align 2, 0\n\
+ ldr r0, _0803C49C\n\
+ ldrb r1, [r0]\n\
+ ldr r2, _0803C4A0\n\
+ lsls r0, r4, 2\n\
+ adds r0, r2\n\
+ ldr r0, [r0]\n\
+ ands r1, r0\n\
+ cmp r1, 0\n\
+ bne _0803C4A4\n\
+ adds r0, r4, 0\n\
+ b _0803C4AA\n\
+ .align 2, 0\n\
_0803C49C: .4byte gUnknown_02024C0C\n\
_0803C4A0: .4byte gBitTable\n\
_0803C4A4:\n\
- movs r0, 0x2\n\
- eors r5, r0\n\
- adds r0, r5, 0\n\
+ movs r0, 0x2\n\
+ eors r5, r0\n\
+ adds r0, r5, 0\n\
_0803C4AA:\n\
- bl battle_get_side_with_given_state\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- pop {r4-r6}\n\
- pop {r1}\n\
- bx r1\n\
+ bl battle_get_side_with_given_state\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ pop {r4-r6}\n\
+ pop {r1}\n\
+ bx r1\n\
.syntax divided\n");
}
#endif
@@ -247,7 +249,7 @@ void GetMonSpriteTemplate_803C56C(u16 species, u8 a2)
{
gUnknown_02024E8C = gSpriteTemplate_8208288[a2];
gUnknown_02024E8C.paletteTag = species;
- gUnknown_02024E8C.anims = (union AnimCmd **)gSpriteAnimTable_81E7C64;
+ gUnknown_02024E8C.anims = (const union AnimCmd *const *)gSpriteAnimTable_81E7C64; //Why do I have to cast this?
}
void GetMonSpriteTemplate_803C5A0(u16 species, u8 a2)
diff --git a/src/pokemon_3.c b/src/pokemon_3.c
index cf172b122..5f186292f 100644
--- a/src/pokemon_3.c
+++ b/src/pokemon_3.c
@@ -1,16 +1,16 @@
#include "global.h"
#include "asm.h"
-#include "text.h"
-#include "string_util.h"
+#include "event_data.h"
+#include "item.h"
+#include "items.h"
+#include "main.h"
#include "pokemon.h"
#include "rng.h"
+#include "rtc.h"
#include "species.h"
-#include "main.h"
#include "sprite.h"
-#include "event_data.h"
-#include "rtc.h"
-#include "item.h"
-#include "items.h"
+#include "string_util.h"
+#include "text.h"
#define EVO_FRIENDSHIP 0x0001 // Pokémon levels up with friendship ≥ 220
#define EVO_FRIENDSHIP_DAY 0x0002 // Pokémon levels up during the day with friendship ≥ 220
@@ -58,8 +58,8 @@ extern u16 gSpeciesIdToCryId[];
extern u8 gUnknown_030041C0[];
extern u8 gUnknown_03004290[];
extern u8 gUnknown_020238CC[];
-extern u8 gUnknown_02024C07;
-extern u8 gUnknown_02024C08;
+extern u8 gPlayerMonIndex;
+extern u8 gEnemyMonIndex;
extern u8 gUnknown_02024C0B;
extern u8 gUnknown_02024E6C;
@@ -203,7 +203,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
void sub_803F324(int stat)
{
- gUnknown_02024C08 = gUnknown_02024E6C;
+ gEnemyMonIndex = gUnknown_02024E6C;
StringCopy(gUnknown_030041C0, gUnknown_08400F58[gUnknown_082082F8[stat]]);
StringCopy(gUnknown_03004290, gUnknown_083FFDB3);
get_battle_strings_(gUnknown_083FFDD3);
@@ -244,7 +244,7 @@ u8 *sub_803F378(u16 itemId)
}
else
{
- gUnknown_02024C07 = gUnknown_02024E6C;
+ gPlayerMonIndex = gUnknown_02024E6C;
get_battle_strings_(gUnknown_083FEE92);
}
}
@@ -252,7 +252,7 @@ u8 *sub_803F378(u16 itemId)
if (itemEffect[3] & 0x80)
{
- gUnknown_02024C07 = gUnknown_02024E6C;
+ gPlayerMonIndex = gUnknown_02024E6C;
get_battle_strings_(gUnknown_083FEE5D);
}
diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c
index 6cf3411a9..6540858c1 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
@@ -1,8 +1,9 @@
#include "global.h"
#include "pokemon_size_record.h"
-#include "string_util.h"
-#include "species.h"
#include "event_data.h"
+#include "species.h"
+#include "string_util.h"
+#include "text.h"
extern u16 SpeciesToNationalPokedexNum(u16);
extern u16 GetPokedexHeightWeight(u16, u8);
@@ -60,9 +61,9 @@ static u8 TranslateBigMonSizeTableIndex(u16 a)
{
u8 i;
- for(i = 1; i < 15; i++)
+ for (i = 1; i < 15; i++)
{
- if(a < sBigMonSizeTable[i].unk4)
+ if (a < sBigMonSizeTable[i].unk4)
return i - 1;
}
return i;
@@ -87,7 +88,7 @@ static u32 GetMonSize(u16 species, u16 b)
static void FormatMonSizeRecord(u8 *string, u32 size)
{
- u8 decimalPoint[] = _".";
+ u8 decimalPoint[] = _(".");
//Convert size from centimeters to inches
size = (double)(size * 10) / (CM_PER_INCH * 10);
@@ -98,7 +99,7 @@ static void FormatMonSizeRecord(u8 *string, u32 size)
static u8 CompareMonSize(u16 species, u16 *sizeRecord)
{
- if(gScriptResult == 0xFF)
+ if (gScriptResult == 0xFF)
{
return 0;
}
@@ -107,7 +108,7 @@ static u8 CompareMonSize(u16 species, u16 *sizeRecord)
struct Pokemon *pkmn = &gPlayerParty[gScriptResult];
// UB: Too few arguments for function 'GetMonData'
- if(GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species)
+ if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species)
{
return 1;
}
@@ -121,7 +122,7 @@ static u8 CompareMonSize(u16 species, u16 *sizeRecord)
newSize = GetMonSize(species, sizeParams);
oldSize = GetMonSize(species, *sizeRecord);
FormatMonSizeRecord(gStringVar2, newSize);
- if(newSize <= oldSize)
+ if (newSize <= oldSize)
{
return 2;
}
@@ -141,7 +142,7 @@ static void GetMonSizeRecordInfo(u16 species, u16 *sizeRecord)
FormatMonSizeRecord(gStringVar3, size);
StringCopy(gStringVar1, gSpeciesNames[species]);
- if(*sizeRecord == 0x8100)
+ if (*sizeRecord == 0x8100)
StringCopy(gStringVar2, gOtherText_Marco);
else
StringCopy(gStringVar2, gSaveBlock2.playerName);
@@ -192,20 +193,20 @@ void GiveGiftRibbonToParty(u8 index, u8 ribbonId)
u8 data = 1;
u8 arr[] = { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E };
- if(index < 11 && ribbonId < 65)
+ if (index < 11 && ribbonId < 65)
{
gSaveBlock1.giftRibbons[index] = ribbonId;
- for(i = 0; i < 6; i++)
+ for (i = 0; i < 6; i++)
{
struct Pokemon *pkmn = &gPlayerParty[i];
- if(GetMonData(pkmn, MON_DATA_SPECIES) != 0 && GetMonData(pkmn, MON_DATA_SANITY_BIT3) == 0)
+ if (GetMonData(pkmn, MON_DATA_SPECIES) != 0 && GetMonData(pkmn, MON_DATA_SANITY_BIT3) == 0)
{
SetMonData(pkmn, arr[index], &data);
gotRibbon = TRUE;
}
}
- if(gotRibbon)
+ if (gotRibbon)
FlagSet(SYS_RIBBON_GET);
}
}
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index b6b24b9d7..5f96512f0 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -1,12 +1,9 @@
#include "global.h"
#include "asm.h"
+#include "link.h"
#include "menu.h"
#include "pokemon.h"
#include "string_util.h"
-#include "link.h"
-
-extern u8 gStringVar1[];
-extern u8 gStringVar4[];
extern struct Pokemon *unk_2018000;
@@ -93,7 +90,8 @@ void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 t
MenuPrint(gOtherText_EggDayCare, left, top);
}
-void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 top) {
+void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 top)
+{
u8 locationMet;
u8 gameMet;
u8 *ptr = gStringVar4;
@@ -101,16 +99,19 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14);
- if (nature != NATURE_BOLD && nature != NATURE_GENTLE) {
+ if (nature != NATURE_BOLD && nature != NATURE_GENTLE)
+ {
ptr = StringCopy(ptr, gOtherText_Terminator4);
}
ptr = StringCopy(ptr, gOtherText_Nature);
- if (PokemonSummaryScreen_CheckOT(pokemon) == TRUE) {
+ if (PokemonSummaryScreen_CheckOT(pokemon) == TRUE)
+ {
locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION);
- if (GetMonData(pokemon, MON_DATA_MET_LEVEL) == 0) {
+ if (GetMonData(pokemon, MON_DATA_MET_LEVEL) == 0)
+ {
ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, 5);
*ptr = CHAR_NEWLINE;
ptr++;
@@ -118,12 +119,16 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
CopyLocationName(gStringVar1, locationMet);
ptr = sub_80A1E9C(ptr, gStringVar1, 14);
StringCopy(ptr, gOtherText_Egg2);
- } else if (locationMet >= 88) {
+ }
+ else if (locationMet >= 88)
+ {
*ptr = CHAR_NEWLINE;
ptr++;
StringCopy(ptr, gOtherText_ObtainedInTrade);
- } else {
+ }
+ else
+ {
u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL);
ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
@@ -134,17 +139,23 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
ptr = sub_80A1E9C(ptr, gStringVar1, 14);
StringCopy(ptr, gOtherText_Met);
}
- } else {
+ }
+ else
+ {
gameMet = GetMonData(pokemon, MON_DATA_MET_GAME);
- if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) {
+ if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD))
+ {
*ptr = CHAR_NEWLINE;
ptr++;
StringCopy(ptr, gOtherText_ObtainedInTrade);
- } else {
+ }
+ else
+ {
locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION);
- if (locationMet == 0xFF) {
+ if (locationMet == 0xFF)
+ {
u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL);
ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
@@ -152,12 +163,16 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8
ptr++;
StringCopy(ptr, gOtherText_FatefulEncounter);
- } else if (locationMet >= 88) {
+ }
+ else if (locationMet >= 88)
+ {
*ptr = CHAR_NEWLINE;
ptr++;
StringCopy(ptr, gOtherText_ObtainedInTrade);
- } else {
+ }
+ else
+ {
u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL);
ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet);
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 12b87b2b1..57a6790f1 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "record_mixing.h"
#include "asm.h"
+#include "event_data.h"
#include "link.h"
#include "menu.h"
#include "rom4.h"
@@ -9,7 +10,7 @@
#include "sound.h"
#include "string_util.h"
#include "task.h"
-#include "event_data.h"
+#include "dewford_trend.h"
extern void *recordMixingSecretBases;
extern void *recordMixingTvShows;
@@ -59,7 +60,7 @@ void sub_80B92AC(void)
{
sub_80BC300();
sub_80C045C();
-
+
memcpy(unk_2018000.secretBases, recordMixingSecretBases, sizeof(unk_2018000.secretBases));
memcpy(unk_2018000.tvShows, recordMixingTvShows, sizeof(unk_2018000.tvShows));
memcpy(unk_2018000.filler1004, gUnknown_083D0274, 0x40);
@@ -70,8 +71,8 @@ void sub_80B92AC(void)
sub_8041324(gSaveBlock1.filler_2F9C, gUnknown_02038738);
memcpy(unk_2018000.filler10AC, gUnknown_083D0280, 0x78);
memcpy(unk_2018000.filler1124, gUnknown_083D0284, 0xA4);
-
- if(GetMultiplayerId() == 0)
+
+ if (GetMultiplayerId() == 0)
unk_2018000.filler11C8[0] = sub_8126338();
}
#else
@@ -80,84 +81,84 @@ 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\
+ 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\
+ 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\
@@ -199,7 +200,7 @@ void sub_80B93B0(u32 a)
void sub_80B9450(u8 taskId)
{
gTasks[taskId].data[0]++;
- if(gTasks[taskId].data[0] == 50)
+ if (gTasks[taskId].data[0] == 50)
{
PlaySE(SE_W213);
gTasks[taskId].data[0] = 0;
@@ -211,8 +212,8 @@ void sub_80B9450(u8 taskId)
void sub_80B9484(u8 taskId)
{
s16 *taskData = gTasks[taskId].data;
-
- switch(taskData[TD_STATE])
+
+ switch (taskData[TD_STATE])
{
case 0:
sub_8007270(gSpecialVar_0x8005);
@@ -225,7 +226,7 @@ void sub_80B9484(u8 taskId)
taskData[15] = CreateTask(sub_80B9450, 0x51);
break;
case 1:
- if(!gTasks[taskData[10]].isActive)
+ if (!gTasks[taskData[10]].isActive)
{
taskData[TD_STATE] = 2;
FlagSet(SYS_MIX_RECORD);
@@ -239,7 +240,7 @@ void sub_80B9484(u8 taskId)
PlaySE(SE_W226);
break;
case 3:
- if(!gTasks[taskData[10]].isActive)
+ if (!gTasks[taskData[10]].isActive)
{
taskData[TD_STATE] = 4;
taskData[10] = sub_8083664();
@@ -250,11 +251,11 @@ void sub_80B9484(u8 taskId)
break;
case 4:
taskData[8]++;
- if(taskData[8] > 60)
+ if (taskData[8] > 60)
taskData[TD_STATE] = 5;
break;
case 5:
- if(!gTasks[taskData[10]].isActive)
+ if (!gTasks[taskData[10]].isActive)
{
sub_8055588();
MenuZeroFillScreen();
@@ -268,8 +269,8 @@ void sub_80B9484(u8 taskId)
void sub_80B95F0(u8 taskId)
{
struct Task *task = &gTasks[taskId];
-
- switch(task->data[TD_STATE])
+
+ switch (task->data[TD_STATE])
{
case 0:
sub_80B9A78();
@@ -281,7 +282,7 @@ void sub_80B95F0(u8 taskId)
break;
case 100:
task->data[12]++;
- if(task->data[12] > 20)
+ if (task->data[12] > 20)
{
task->data[12] = 0;
task->data[TD_STATE] = 101;
@@ -290,10 +291,10 @@ void sub_80B95F0(u8 taskId)
case 101:
{
u8 players = GetLinkPlayerCount_2();
-
- if(IsLinkMaster() == 1)
+
+ if (IsLinkMaster() == 1)
{
- if(players == sub_800820C())
+ if (players == sub_800820C())
{
PlaySE(0x15);
task->data[TD_STATE] = 201;
@@ -308,9 +309,9 @@ void sub_80B95F0(u8 taskId)
break;
}
case 201:
- if(sub_800820C() == GetLinkPlayerCount_2())
+ if (sub_800820C() == GetLinkPlayerCount_2())
{
- if(++task->data[12] > GetLinkPlayerCount_2() * 30)
+ if (++task->data[12] > GetLinkPlayerCount_2() * 30)
{
sub_8007F4C();
task->data[TD_STATE] = 1;
@@ -318,19 +319,19 @@ void sub_80B95F0(u8 taskId)
}
break;
case 301:
- if(sub_800820C() == GetLinkPlayerCount_2())
+ if (sub_800820C() == GetLinkPlayerCount_2())
task->data[TD_STATE] = 1;
break;
case 400:
task->data[12]++;
- if(task->data[12] > 20)
+ if (task->data[12] > 20)
{
task->data[TD_STATE] = 1;
task->data[12] = 0;
}
break;
case 1:
- if(gReceivedRemoteLinkPlayers)
+ if (gReceivedRemoteLinkPlayers)
{
ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), 2, 2);
task->data[TD_STATE] = 5;
@@ -339,7 +340,7 @@ void sub_80B95F0(u8 taskId)
case 2:
{
u8 subTaskId;
-
+
task->data[6] = GetLinkPlayerCount_2();
task->data[TD_STATE] = 0;
task->data[5] = GetMultiplayerId_();
@@ -354,7 +355,7 @@ void sub_80B95F0(u8 taskId)
}
case 5:
task->data[10]++;
- if(task->data[10] > 60)
+ if (task->data[10] > 60)
{
task->data[10] = 0;
task->data[TD_STATE] = 2;
@@ -366,19 +367,19 @@ void sub_80B95F0(u8 taskId)
void sub_80B97DC(u8 taskId)
{
struct Task *task = &gTasks[taskId];
-
- switch(task->data[TD_STATE])
+
+ 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];
-
+
memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE);
task->data[TD_STATE]++;
break;
}
case 1:
- if(GetMultiplayerId() == 0)
+ if (GetMultiplayerId() == 0)
sub_8007E9C(1);
task->data[TD_STATE]++;
break;
@@ -386,13 +387,13 @@ void sub_80B97DC(u8 taskId)
break;
case 3:
task->data[4]++;
- if((u16)task->data[4] == 24)
+ 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)
+ if (!gTasks[task->data[10]].isActive)
task->func = sub_80B9A1C;
}
}
@@ -402,31 +403,31 @@ void Task_CopyRecvBuffer(u8 taskId)
struct Task *task = &gTasks[taskId];
s32 recvStatus = GetBlockReceivedStatus();
u32 sp8 = 0;
-
- if(recvStatus == sub_8008198())
+
+ if (recvStatus == sub_8008198())
{
u8 player;
-
- for(player = 0; player < GetLinkPlayerCount(); player++)
+
+ for (player = 0; player < GetLinkPlayerCount(); player++)
{
//_080B98D4
u8 *ptr;
void *src;
u8 *dst;
-
- if((recvStatus >> player) & 1)
+
+ if ((recvStatus >> player) & 1)
{
ptr = LoadPtrFromTaskData(&task->data[5]);
dst = ptr + 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 ((u32)(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)
+ if ((u16)task->data[player + 1] == 0x18)
sp8 = (u8)(sp8 + 1);
}
}
@@ -434,24 +435,24 @@ void Task_CopyRecvBuffer(u8 taskId)
gTasks[task->data[0]].data[0]++;
}
//_080B998A
- if(sp8 == GetLinkPlayerCount())
+ if (sp8 == GetLinkPlayerCount())
DestroyTask(taskId);
}
void sub_80B99B4(u8 taskId)
{
struct Task *task = &gTasks[taskId];
-
- if(!gTasks[task->data[10]].isActive)
+
+ if (!gTasks[task->data[10]].isActive)
DestroyTask(taskId);
}
void sub_80B99E8(u8 taskId)
{
struct Task *task = &gTasks[taskId];
-
+
task->func = sub_80B99B4;
- if(gUnknown_03000718 == 1)
+ if (gUnknown_03000718 == 1)
sub_80B93B0(task->data[5]);
}
@@ -492,21 +493,21 @@ void sub_80B9A88(u8 *a)
u32 i;
u32 id;
u32 players = GetLinkPlayerCount();
-
- switch(players)
+
+ switch (players)
{
case 2:
- for(i = 0; i < 2; i++)
+ for (i = 0; i < 2; i++)
a[i] = gUnknown_083D0288[i];
break;
case 3:
id = GetLinkPlayerTrainerId(0) % 2;
- for(i = 0; i < 3; i++)
+ for (i = 0; i < 3; i++)
a[i] = gUnknown_083D028A[id][i];
break;
case 4:
id = GetLinkPlayerTrainerId(0) % 9;
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
a[i] = gUnknown_083D0290[id][i];
break;
default:
@@ -518,7 +519,7 @@ void sub_80B9B1C(u8 *a, size_t size, u8 index)
{
u8 arr[4];
u8 *ptr;
-
+
sub_80B9A88(arr);
//Probably not how it was originally written, but this matches.
memcpy(a + index * size, (ptr = gUnknown_083D0278), 0x40);
@@ -551,70 +552,70 @@ void sub_80B9BC4(u32 a, u32 b, u32 c, u32 d)
{
asm(".syntax unified\n\
push {r4-r6,lr}\n\
- mov r6, r10\n\
- mov r5, r9\n\
- mov r4, r8\n\
- push {r4-r6}\n\
- sub sp, 0x38\n\
- mov r8, r0\n\
- mov r10, r1\n\
- mov r9, r2\n\
- adds r4, r3, 0\n\
- ldr r5, [sp, 0x54]\n\
- lsls r4, 24\n\
- lsls r5, 24\n\
- lsrs r5, 24\n\
- lsrs r4, 23\n\
- add r4, r9\n\
- ldrb r0, [r4]\n\
- mov r6, r10\n\
- muls r6, r0\n\
- add r6, r8\n\
- ldrb r0, [r4, 0x1]\n\
- lsls r1, r0, 3\n\
- subs r1, r0\n\
- lsls r1, 3\n\
- adds r1, r6, r1\n\
- mov r0, sp\n\
- movs r2, 0x38\n\
- bl memcpy\n\
- lsls r5, 1\n\
- add r5, r9\n\
- ldrb r0, [r5]\n\
- mov r1, r10\n\
- muls r1, r0\n\
- adds r0, r1, 0\n\
- add r8, r0\n\
- ldrb r1, [r4, 0x1]\n\
- lsls r0, r1, 3\n\
- subs r0, r1\n\
- lsls r0, 3\n\
- adds r6, r0\n\
- ldrb r0, [r5, 0x1]\n\
- lsls r1, r0, 3\n\
- subs r1, r0\n\
- lsls r1, 3\n\
- add r1, r8\n\
- adds r0, r6, 0\n\
- movs r2, 0x38\n\
- bl memcpy\n\
- ldrb r1, [r5, 0x1]\n\
- lsls r0, r1, 3\n\
- subs r0, r1\n\
- lsls r0, 3\n\
- add r8, r0\n\
- mov r0, r8\n\
- mov r1, sp\n\
- movs r2, 0x38\n\
- bl memcpy\n\
- add sp, 0x38\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
+ mov r6, r10\n\
+ mov r5, r9\n\
+ mov r4, r8\n\
+ push {r4-r6}\n\
+ sub sp, 0x38\n\
+ mov r8, r0\n\
+ mov r10, r1\n\
+ mov r9, r2\n\
+ adds r4, r3, 0\n\
+ ldr r5, [sp, 0x54]\n\
+ lsls r4, 24\n\
+ lsls r5, 24\n\
+ lsrs r5, 24\n\
+ lsrs r4, 23\n\
+ add r4, r9\n\
+ ldrb r0, [r4]\n\
+ mov r6, r10\n\
+ muls r6, r0\n\
+ add r6, r8\n\
+ ldrb r0, [r4, 0x1]\n\
+ lsls r1, r0, 3\n\
+ subs r1, r0\n\
+ lsls r1, 3\n\
+ adds r1, r6, r1\n\
+ mov r0, sp\n\
+ movs r2, 0x38\n\
+ bl memcpy\n\
+ lsls r5, 1\n\
+ add r5, r9\n\
+ ldrb r0, [r5]\n\
+ mov r1, r10\n\
+ muls r1, r0\n\
+ adds r0, r1, 0\n\
+ add r8, r0\n\
+ ldrb r1, [r4, 0x1]\n\
+ lsls r0, r1, 3\n\
+ subs r0, r1\n\
+ lsls r0, 3\n\
+ adds r6, r0\n\
+ ldrb r0, [r5, 0x1]\n\
+ lsls r1, r0, 3\n\
+ subs r1, r0\n\
+ lsls r1, 3\n\
+ add r1, r8\n\
+ adds r0, r6, 0\n\
+ movs r2, 0x38\n\
+ bl memcpy\n\
+ ldrb r1, [r5, 0x1]\n\
+ lsls r0, r1, 3\n\
+ subs r0, r1\n\
+ lsls r0, 3\n\
+ add r8, r0\n\
+ mov r0, r8\n\
+ mov r1, sp\n\
+ movs r2, 0x38\n\
+ bl memcpy\n\
+ add sp, 0x38\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
.syntax divided\n");
}
#endif
@@ -623,8 +624,8 @@ u8 sub_80B9C4C(u8 *a)
{
int i;
u8 r2 = 0;
-
- for(i = 0; i < 0x100; i++)
+
+ for (i = 0; i < 0x100; i++)
r2 += a[i];
return r2;
}
@@ -647,7 +648,7 @@ struct UnkStruct1
u32 unk48;
u32 unk4C;
u32 unk50;
-
+
};
/*
@@ -657,7 +658,7 @@ extern void sub_80B9C6C(void *a, u32 b, u8 c, void *d)
struct UnkStruct1 s;
u16 r8;
u16 r3;
-
+
s.unk2C = a;
s.unk30 = b;
s.unk38 = d;
@@ -666,15 +667,15 @@ extern void sub_80B9C6C(void *a, u32 b, u8 c, void *d)
SeedRng(gLinkPlayers[0].trainerId);
r8 = GetLinkPlayerCount();
r3 = 0;
-
+
s.unk4C = 12;
-
- while(r3 < 4)
+
+ while (r3 < 4)
{
s.unk4[r3] |= 0xFF;
s.unk8[r3] = 0;
-
+
s.unk1C[r3][0] = 0;
s.unk1C[r3][1] = 0;
r3++;
@@ -683,19 +684,19 @@ extern void sub_80B9C6C(void *a, u32 b, u8 c, void *d)
r3 = 0;
s.unk50 = r8 << 16;
s.unk48 = s.unk30 * s.unk34;
-
- if(s.unk3C < r8)
+
+ if (s.unk3C < r8)
{
do //_080B9D00
{
u32 *r6 = (u32 *)(s.unk2C + s.unk30 * r3);
- if(r6[0x1C] != 0 && r6[0x1C] > 0)
+ if (r6[0x1C] != 0 && r6[0x1C] > 0)
{
-
+
}
//_080B9D3C
}
- while(r3 < r8);
+ while (r3 < r8);
}
//_080B9D46
}
diff --git a/src/rom3.c b/src/rom3.c
new file mode 100644
index 000000000..2d00b647f
--- /dev/null
+++ b/src/rom3.c
@@ -0,0 +1,1408 @@
+#include "global.h"
+#include "asm.h"
+#include "battle.h"
+#include "items.h"
+#include "link.h"
+#include "pokemon.h"
+#include "species.h"
+#include "task.h"
+
+extern u8 unk_2000000[];
+
+#define EWRAM_14000 ((u8 *)(unk_2000000 + 0x14000))
+#define EWRAM_15000 ((u8 *)(unk_2000000 + 0x15000))
+
+extern u16 gBattleTypeFlags;
+extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
+extern const u32 gBitTable[];
+extern u16 gBattleWeather;
+extern const struct BattleMove gBattleMoves[];
+extern struct BattlePokemon gBattleMons[];
+
+extern u8 gUnknown_020238C4;
+extern u8 gUnknown_020238C5;
+extern u8 gUnknown_020238C6;
+extern u32 gUnknown_020239FC;
+extern u8 gUnknown_02023A60[][0x200];
+extern u8 gUnknown_02024260[][0x200];
+extern u8 gUnknown_02024A60;
+extern u32 gUnknown_02024A64;
+extern u8 gUnknown_02024A68;
+extern u16 gUnknown_02024A6A[];
+extern u8 gUnknown_02024A72[];
+extern u16 gUnknown_02024BE6;
+extern u16 gUnknown_02024BE8;
+extern u16 gUnknown_02024C04;
+extern u8 byte_2024C06;
+extern u8 gPlayerMonIndex;
+extern u8 gEnemyMonIndex;
+extern u8 gUnknown_02024C0A;
+extern u8 gUnknown_02024C0B;
+extern u8 gUnknown_02024C0C;
+extern u8 gUnknown_02024C0E;
+extern u8 gUnknown_02024C78;
+extern u8 gUnknown_02024D26;
+extern u8 gUnknown_02024E60[];
+extern u8 gUnknown_02024E64[];
+extern u8 gUnknown_03004040[];
+extern u8 gUnknown_030041C0[];
+extern u8 gUnknown_03004290[];
+extern u8 gUnknown_030042B0[];
+extern void (*gUnknown_030042D4)(void);
+extern void (*gUnknown_03004330[])(void);
+
+extern void sub_800BF28(void);
+extern void sub_8083C50(u8);
+extern void nullsub_41(void);
+extern void nullsub_91(void);
+extern void battle_anim_clear_some_data(void);
+extern void sub_8040710(void);
+extern void BattleAI_HandleItemUseBeforeAISetup(void);
+extern void sub_8094978(u8, int);
+extern void sub_800BA78(void);
+extern void sub_800B9A8(void);
+extern void sub_800BD54(void);
+extern void sub_8010800(void);
+extern void sub_812B468(void);
+extern void sub_8137224(void);
+extern void sub_802BF74(void);
+extern void sub_8032AE0(void);
+extern void sub_8037510(void);
+extern void sub_811DA78(void);
+extern void dp01_prepare_buffer_wireless_probably(u8 a, u16, u8 *c);
+extern void sub_800C1A8(u8);
+extern void sub_800C47C(u8);
+extern void sub_8007F4C(void);
+extern u8 sub_8007ECC(void);
+extern void sub_80155A4();
+extern u8 sub_8018324();
+
+void sub_800B858(void)
+{
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ OpenLink();
+ CreateTask(sub_8083C50, 0);
+ sub_800BF28();
+ }
+}
+
+void setup_poochyena_battle(void)
+{
+ s32 i;
+
+ gUnknown_030042D4 = nullsub_41;
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_03004330[i] = nullsub_91;
+ gUnknown_02024A72[i] = 0xFF;
+ gUnknown_02024E60[i] = 0;
+ gUnknown_02024E64[i] = 0;
+ }
+ sub_800B858();
+ gUnknown_02024A64 = 0;
+ battle_anim_clear_some_data();
+ sub_8040710();
+ BattleAI_HandleItemUseBeforeAISetup();
+ if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
+ {
+ ZeroEnemyPartyMons();
+ CreateMon(&gEnemyParty[0], SPECIES_POOCHYENA, 2, 32, 0, 0, 0, 0);
+ i = ITEM_NONE;
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, (u8 *)&i);
+ }
+ gUnknown_020239FC = 0;
+ gUnknown_02024C78 = 0;
+}
+
+void sub_800B950(void)
+{
+ s32 i;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ sub_800BA78();
+ else
+ sub_800B9A8();
+ sub_800BD54();
+ if (!(gBattleTypeFlags & BATTLE_TYPE_40))
+ {
+ for (i = 0; i < gUnknown_02024A68; i++)
+ sub_8094978(i, 0);
+ }
+}
+
+void sub_800B9A8(void)
+{
+ if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ {
+ gUnknown_030042D4 = sub_8010800;
+ if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
+ gUnknown_03004330[0] = sub_812B468;
+ else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
+ gUnknown_03004330[0] = sub_8137224;
+ else
+ gUnknown_03004330[0] = sub_802BF74;
+ gUnknown_02024A72[0] = 0;
+ gUnknown_03004330[1] = sub_8032AE0;
+ gUnknown_02024A72[1] = 1;
+ gUnknown_02024A68 = 2;
+ }
+ else
+ {
+ gUnknown_030042D4 = sub_8010800;
+ gUnknown_03004330[0] = sub_802BF74;
+ gUnknown_02024A72[0] = 0;
+ gUnknown_03004330[1] = sub_8032AE0;
+ gUnknown_02024A72[1] = 1;
+ gUnknown_03004330[2] = sub_802BF74;
+ gUnknown_02024A72[2] = 2;
+ gUnknown_03004330[3] = sub_8032AE0;
+ gUnknown_02024A72[3] = 3;
+ gUnknown_02024A68 = 4;
+ }
+}
+
+void sub_800BA78(void)
+{
+ u8 multiplayerId;
+ int i;
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_WILD)
+ {
+ gUnknown_030042D4 = sub_8010800;
+ gUnknown_03004330[0] = sub_802BF74;
+ gUnknown_02024A72[0] = 0;
+ gUnknown_03004330[1] = sub_8037510;
+ gUnknown_02024A72[1] = 1;
+ gUnknown_02024A68 = 2;
+ }
+ else
+ {
+ gUnknown_03004330[1] = sub_802BF74;
+ gUnknown_02024A72[1] = 0;
+ gUnknown_03004330[0] = sub_8037510;
+ gUnknown_02024A72[0] = 1;
+ gUnknown_02024A68 = 2;
+ }
+ return;
+ }
+ if ((gBattleTypeFlags & (BATTLE_TYPE_40 | BATTLE_TYPE_DOUBLE)) == BATTLE_TYPE_DOUBLE)
+ {
+ if (gBattleTypeFlags & BATTLE_TYPE_WILD)
+ {
+ gUnknown_030042D4 = sub_8010800;
+ gUnknown_03004330[0] = sub_802BF74;
+ gUnknown_02024A72[0] = 0;
+ gUnknown_03004330[1] = sub_8037510;
+ gUnknown_02024A72[1] = 1;
+ gUnknown_03004330[2] = sub_802BF74;
+ gUnknown_02024A72[2] = 2;
+ gUnknown_03004330[3] = sub_8037510;
+ gUnknown_02024A72[3] = 3;
+ gUnknown_02024A68 = 4;
+ }
+ else
+ {
+ gUnknown_03004330[1] = sub_802BF74;
+ gUnknown_02024A72[1] = 0;
+ gUnknown_03004330[0] = sub_8037510;
+ gUnknown_02024A72[0] = 1;
+ gUnknown_03004330[3] = sub_802BF74;
+ gUnknown_02024A72[3] = 2;
+ gUnknown_03004330[2] = sub_8037510;
+ gUnknown_02024A72[2] = 3;
+ gUnknown_02024A68 = 4;
+
+ }
+ return;
+ }
+ multiplayerId = GetMultiplayerId();
+ if (gBattleTypeFlags & BATTLE_TYPE_WILD)
+ gUnknown_030042D4 = sub_8010800;
+ for (i = 0; i < 4; i++)
+ {
+ switch (gLinkPlayers[i].lp_field_18)
+ {
+ case 0:
+ case 3:
+ sub_8094978(gLinkPlayers[i].lp_field_18, 0);
+ break;
+ case 1:
+ case 2:
+ sub_8094978(gLinkPlayers[i].lp_field_18, 1);
+ break;
+ }
+
+ if (i == multiplayerId)
+ {
+ gUnknown_03004330[gLinkPlayers[i].lp_field_18] = sub_802BF74;
+ switch (gLinkPlayers[i].lp_field_18)
+ {
+ case 0:
+ case 3:
+ gUnknown_02024A72[gLinkPlayers[i].lp_field_18] = 0;
+ gUnknown_02024A6A[gLinkPlayers[i].lp_field_18] = 0;
+ break;
+ case 1:
+ case 2:
+ gUnknown_02024A72[gLinkPlayers[i].lp_field_18] = 2;
+ gUnknown_02024A6A[gLinkPlayers[i].lp_field_18] = 3;
+ break;
+ }
+ }
+ else
+ {
+ if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[multiplayerId].lp_field_18 & 1))
+ || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[multiplayerId].lp_field_18 & 1)))
+ {
+ gUnknown_03004330[gLinkPlayers[i].lp_field_18] = sub_811DA78;
+ switch (gLinkPlayers[i].lp_field_18)
+ {
+ case 0:
+ case 3:
+ gUnknown_02024A72[gLinkPlayers[i].lp_field_18] = 0;
+ gUnknown_02024A6A[gLinkPlayers[i].lp_field_18] = 0;
+ break;
+ case 1:
+ case 2:
+ gUnknown_02024A72[gLinkPlayers[i].lp_field_18] = 2;
+ gUnknown_02024A6A[gLinkPlayers[i].lp_field_18] = 3;
+ break;
+ }
+ }
+ else
+ {
+ gUnknown_03004330[gLinkPlayers[i].lp_field_18] = sub_8037510;
+ switch (gLinkPlayers[i].lp_field_18)
+ {
+ case 0:
+ case 3:
+ gUnknown_02024A72[gLinkPlayers[i].lp_field_18] = 1;
+ gUnknown_02024A6A[gLinkPlayers[i].lp_field_18] = 0;
+ break;
+ case 1:
+ case 2:
+ gUnknown_02024A72[gLinkPlayers[i].lp_field_18] = 3;
+ gUnknown_02024A6A[gLinkPlayers[i].lp_field_18] = 3;
+ break;
+ }
+ }
+ }
+ }
+ gUnknown_02024A68 = 4;
+}
+
+void sub_800BD54(void)
+{
+ int i;
+ int j;
+
+ if (!(gBattleTypeFlags & BATTLE_TYPE_40))
+ {
+ for (i = 0; i < gUnknown_02024A68; i++)
+ {
+ for (j = 0; j < 6; j++)
+ {
+ if (i < 2)
+ {
+ if (!(gUnknown_02024A72[i] & 1))
+ {
+ if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0
+ && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0
+ && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
+ && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0)
+ {
+ gUnknown_02024A6A[i] = j;
+ break;
+ }
+ }
+ else
+ {
+ if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0
+ && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0
+ && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
+ && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0)
+ {
+ gUnknown_02024A6A[i] = j;
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (!(gUnknown_02024A72[i] & 1))
+ {
+ if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0
+ && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != 0 //Probably a typo by Game Freak. The rest use SPECIES2
+ && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
+ && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0
+ && gUnknown_02024A6A[i - 2] != j)
+ {
+ gUnknown_02024A6A[i] = j;
+ break;
+ }
+ }
+ else
+ {
+ if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0
+ && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0
+ && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG
+ && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0
+ && gUnknown_02024A6A[i - 2] != j)
+ {
+ gUnknown_02024A6A[i] = j;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void dp01_prepare_buffer(u8 a, u8 *b, u16 c)
+{
+ int i;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_LINK)
+ {
+ dp01_prepare_buffer_wireless_probably(a, c, b);
+ }
+ else
+ {
+ switch (a)
+ {
+ case 0:
+ for (i = 0; i < c; i++)
+ {
+ gUnknown_02023A60[gUnknown_02024A60][i] = *b;
+ b++;
+ }
+ break;
+ case 1:
+ for (i = 0; i < c; i++)
+ {
+ gUnknown_02024260[gUnknown_02024A60][i] = *b;
+ b++;
+ }
+ break;
+ }
+ }
+}
+
+void sub_800BF28(void)
+{
+ gUnknown_020238C4 = CreateTask(sub_800C1A8, 0);
+ gTasks[gUnknown_020238C4].data[11] = 0;
+ gTasks[gUnknown_020238C4].data[12] = 0;
+ gTasks[gUnknown_020238C4].data[13] = 0;
+ gTasks[gUnknown_020238C4].data[14] = 0;
+ gTasks[gUnknown_020238C4].data[15] = 0;
+ gUnknown_020238C5 = CreateTask(sub_800C47C, 0);
+ gTasks[gUnknown_020238C5].data[12] = 0;
+ gTasks[gUnknown_020238C5].data[13] = 0;
+ gTasks[gUnknown_020238C5].data[14] = 0;
+ gTasks[gUnknown_020238C5].data[15] = 0;
+ gUnknown_020238C6 = 0;
+ CpuFill16(0, EWRAM_14000, 0x2000);
+}
+
+void dp01_prepare_buffer_wireless_probably(u8 a, u16 b, u8 *c)
+{
+ s32 r9;
+ int i;
+
+ r9 = b - b % 4 + 4;
+ if (gTasks[gUnknown_020238C4].data[14] + r9 + 9 > 0x1000)
+ {
+ gTasks[gUnknown_020238C4].data[12] = gTasks[gUnknown_020238C4].data[14];
+ gTasks[gUnknown_020238C4].data[14] = 0;
+ }
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14000] = a;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14001] = gUnknown_02024A60;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14002] = gPlayerMonIndex;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14003] = gEnemyMonIndex;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14004] = r9;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14005] = (r9 & 0x0000FF00) >> 8;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14006] = gUnknown_02024C0C;
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14007] = gUnknown_02024C0A;
+ for (i = 0; i < b; i++)
+ unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14008 + i] = c[i];
+ gTasks[gUnknown_020238C4].data[14] = gTasks[gUnknown_020238C4].data[14] + r9 + 8;
+}
+
+void sub_800C1A8(u8 taskId)
+{
+ u16 var;
+
+ switch (gTasks[taskId].data[11])
+ {
+ case 0:
+ gTasks[taskId].data[10] = 100;
+ gTasks[taskId].data[11]++;
+ break;
+ case 1:
+ gTasks[taskId].data[10]--;
+ if (gTasks[taskId].data[10] == 0)
+ gTasks[taskId].data[11]++;
+ break;
+ case 2:
+ GetLinkPlayerCount_2();
+ if (IsLinkMaster())
+ {
+ sub_8007F4C();
+ gTasks[taskId].data[11]++;
+ break;
+ }
+ gTasks[taskId].data[11]++;
+ break;
+ case 3:
+ if (gTasks[taskId].data[15] != gTasks[taskId].data[14])
+ {
+ if (gTasks[taskId].data[13] == 0)
+ {
+ if (gTasks[taskId].data[15] > gTasks[taskId].data[14]
+ && gTasks[taskId].data[15] == gTasks[taskId].data[12])
+ {
+ gTasks[taskId].data[12] = 0;
+ gTasks[taskId].data[15] = 0;
+ }
+ var = (unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8)) + 8;
+ SendBlock(bitmask_all_link_players_but_self(), &unk_2000000[gTasks[taskId].data[15] + 0x14000], var);
+ gTasks[taskId].data[11]++;
+ }
+ else
+ {
+ gTasks[taskId].data[13]--;
+ break;
+ }
+ }
+ break;
+ case 4:
+ if (sub_8007ECC())
+ {
+ var = unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8);
+ gTasks[taskId].data[13] = 1;
+ gTasks[taskId].data[15] = gTasks[taskId].data[15] + var + 8;
+ gTasks[taskId].data[11] = 3;
+ }
+ break;
+ case 5:
+ gTasks[taskId].data[13]--;
+ if (gTasks[taskId].data[13] == 0)
+ {
+ gTasks[taskId].data[13] = 1;
+ gTasks[taskId].data[11] = 3;
+ }
+ break;
+ }
+}
+
+//fix me
+void sub_800C35C(void)
+{
+ u8 i; //r4
+ s32 j; //r2
+ u16 r6; //r6
+ u8 *recvBuffer; //r3
+ u8 *dest; //r5
+ u8 *src; //r4
+
+ if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & 0x20) && gLinkPlayers[0].linkType == 0x2211)
+ {
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ if (GetBlockReceivedStatus() & gBitTable[i])
+ {
+ ResetBlockReceivedFlag(i);
+ recvBuffer = (u8 *)&gBlockRecvBuffer[i];
+#ifndef NONMATCHING
+ asm("");
+ recvBuffer = (u8 *)&gBlockRecvBuffer[i];
+#endif
+ r6 = gBlockRecvBuffer[i][2];
+ if (gTasks[gUnknown_020238C5].data[14] + 9 + r6 > 0x1000)
+ {
+ gTasks[gUnknown_020238C5].data[12] = gTasks[gUnknown_020238C5].data[14];
+ gTasks[gUnknown_020238C5].data[14] = 0;
+ }
+ //_0800C402
+ dest = EWRAM_15000 + gTasks[gUnknown_020238C5].data[14];
+ src = recvBuffer;
+ for (j = 0; j < r6 + 8; j++)
+ dest[j] = src[j];
+ gTasks[gUnknown_020238C5].data[14] = gTasks[gUnknown_020238C5].data[14] + r6 + 8;
+ }
+ //_0800C446
+ }
+ }
+}
+
+void sub_800C47C(u8 taskId)
+{
+ u16 r7;
+ u8 r4;
+ u8 r2;
+
+ if (gTasks[taskId].data[15] != gTasks[taskId].data[14])
+ {
+ if (gTasks[taskId].data[15] > gTasks[taskId].data[14]
+ && gTasks[taskId].data[15] == gTasks[taskId].data[12])
+ {
+ gTasks[taskId].data[12] = 0;
+ gTasks[taskId].data[15] = 0;
+ }
+ r4 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 1];
+ r7 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 4] | (unk_2000000[0x15000 + gTasks[taskId].data[15] + 5] << 8);
+ switch (unk_2000000[0x15000 + gTasks[taskId].data[15] + 0])
+ {
+ case 0:
+ if (gUnknown_02024A64 & gBitTable[r4])
+ return;
+ memcpy(gUnknown_02023A60[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7);
+ sub_80155A4(r4);
+ if (!(gBattleTypeFlags & BATTLE_TYPE_WILD))
+ {
+ gPlayerMonIndex = unk_2000000[0x15000 + gTasks[taskId].data[15] + 2];
+ gEnemyMonIndex = unk_2000000[0x15000 + gTasks[taskId].data[15] + 3];
+ gUnknown_02024C0C = unk_2000000[0x15000 + gTasks[taskId].data[15] + 6];
+ gUnknown_02024C0A = unk_2000000[0x15000 + gTasks[taskId].data[15] + 7];
+ }
+ break;
+ case 1:
+ memcpy(gUnknown_02024260[r4], &unk_2000000[0x15000 + gTasks[taskId].data[15] + 8], r7);
+ break;
+ case 2:
+ r2 = unk_2000000[0x15000 + gTasks[taskId].data[15] + 8];
+ gUnknown_02024A64 &= ~(gBitTable[r4] << (r2 * 4));
+ break;
+ }
+ gTasks[taskId].data[15] = gTasks[taskId].data[15] + r7 + 8;
+ }
+}
+
+void dp01_build_cmdbuf_x00_a_b_0(u8 a, int b, int c)
+{
+ gUnknown_03004040[0] = 0;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x01_a_b_0(u8 a, int b, int c)
+{
+ gUnknown_03004040[0] = 1;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = 0;
+ 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)
+{
+ int i;
+
+ gUnknown_03004040[0] = 2;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ for (i = 0; i < d; i++)
+ gUnknown_03004040[3 + i] = *(e++);
+ dp01_prepare_buffer(a, gUnknown_03004040, d + 3);
+}
+
+void unref_sub_800C6A4(u8 a, int b, u8 c, u8 *d)
+{
+ int i;
+
+ gUnknown_03004040[0] = 3;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ for (i = 0; i < c; i++)
+ gUnknown_03004040[3 + i] = *(d++);
+ dp01_prepare_buffer(a, gUnknown_03004040, c + 3);
+}
+
+void dp01_build_cmdbuf_x04_4_4_4(u8 a)
+{
+ gUnknown_03004040[0] = 4;
+ gUnknown_03004040[1] = 4;
+ gUnknown_03004040[2] = 4;
+ gUnknown_03004040[3] = 4;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void sub_800C704(u8 a, int b, int c)
+{
+ gUnknown_03004040[0] = 5;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = 5;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x06_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 6;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x07_7_7_7(u8 a)
+{
+ gUnknown_03004040[0] = 7;
+ gUnknown_03004040[1] = 7;
+ gUnknown_03004040[2] = 7;
+ gUnknown_03004040[3] = 7;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x08_8_8_8(u8 a)
+{
+ gUnknown_03004040[0] = 8;
+ gUnknown_03004040[1] = 8;
+ gUnknown_03004040[2] = 8;
+ gUnknown_03004040[3] = 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x09_9_9_9(u8 a)
+{
+ gUnknown_03004040[0] = 9;
+ gUnknown_03004040[1] = 9;
+ gUnknown_03004040[2] = 9;
+ gUnknown_03004040[3] = 9;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x0A_A_A_A(u8 a)
+{
+ gUnknown_03004040[0] = 10;
+ gUnknown_03004040[1] = 10;
+ gUnknown_03004040[2] = 10;
+ gUnknown_03004040[3] = 10;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x0B_B_B_B(u8 a)
+{
+ gUnknown_03004040[0] = 11;
+ gUnknown_03004040[1] = 11;
+ gUnknown_03004040[2] = 11;
+ gUnknown_03004040[3] = 11;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x0C_C_C_C(u8 a)
+{
+ gUnknown_03004040[0] = 12;
+ gUnknown_03004040[1] = 12;
+ gUnknown_03004040[2] = 12;
+ gUnknown_03004040[3] = 12;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x0D_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 13;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void unref_sub_800C828(u8 a, u8 b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 14;
+ gUnknown_03004040[1] = b;
+ for (i = 0; i < b * 3; i++)
+ gUnknown_03004040[2 + i] = *(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)
+{
+ gUnknown_03004040[0] = 15;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = c;
+ gUnknown_03004040[4] = d;
+ gUnknown_03004040[5] = (d & 0xFF00) >> 8;
+ gUnknown_03004040[6] = e;
+ gUnknown_03004040[7] = (e & 0x0000FF00) >> 8;
+ gUnknown_03004040[8] = (e & 0x00FF0000) >> 16;
+ gUnknown_03004040[9] = (e & 0xFF000000) >> 24;
+ gUnknown_03004040[10] = f;
+ gUnknown_03004040[11] = gUnknown_02024C0E;
+ if (sub_8018324(14, 0, 13, 0, 0) == 0 && sub_8018324(14, 0, 0x4D, 0, 0) == 0)
+ {
+ gUnknown_03004040[12] = gBattleWeather;
+ gUnknown_03004040[13] = (gBattleWeather & 0xFF00) >> 8;
+ }
+ else
+ {
+ gUnknown_03004040[12] = 0;
+ gUnknown_03004040[13] = 0;
+ }
+ gUnknown_03004040[14] = 0;
+ gUnknown_03004040[15] = 0;
+ memcpy(&gUnknown_03004040[16], g, 0x1C);
+ dp01_prepare_buffer(a, gUnknown_03004040, 0x2C);
+}
+
+#ifdef NONMATCHING
+void dp01_build_cmdbuf_x10_TODO(u8 a, u16 b)
+{
+ int i;
+ //u16 *r12;
+
+ gUnknown_03004040[0] = 16;
+ gUnknown_03004040[1] = gUnknown_02024D26;
+ gUnknown_03004040[2] = b;
+ gUnknown_03004040[3] = (b & 0xFF00) >> 8;
+
+ *((u16 *)&gUnknown_03004040[4]) = gUnknown_02024BE6;
+ *((u16 *)&gUnknown_03004040[6]) = gUnknown_02024BE8;
+ *((u16 *)&gUnknown_03004040[8]) = gUnknown_02024C04;
+
+ gUnknown_03004040[10] = byte_2024C06;
+ gUnknown_03004040[11] = unk_2000000[0x16000 + 3];
+ gUnknown_03004040[12] = unk_2000000[0x16000 + 0x5E];
+ gUnknown_03004040[13] = unk_2000000[0x16000 + 0xC1];
+ gUnknown_03004040[14] = gUnknown_02024C0B;
+ gUnknown_03004040[15] = gBattleMoves[gUnknown_02024BE6].type;
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_03004040[16 + i] = gBattleMons[i].ability;
+ }
+ for (i = 0; i < 16; i++)
+ {
+ gUnknown_03004040[20 + i] = gUnknown_030041C0[i];
+ gUnknown_03004040[36 + i] = gUnknown_03004290[i];
+ gUnknown_03004040[52 + i] = gUnknown_030042B0[i];
+ }
+ dp01_prepare_buffer(a, gUnknown_03004040, 0x44);
+}
+#else
+__attribute__((naked))
+void dp01_build_cmdbuf_x10_TODO(u8 a, u16 b)
+{
+ 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\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ ldr r2, _0800CA2C @ =gUnknown_03004040\n\
+ movs r0, 0x10\n\
+ strb r0, [r2]\n\
+ ldr r0, _0800CA30 @ =gUnknown_02024D26\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2, 0x1]\n\
+ strb r1, [r2, 0x2]\n\
+ lsrs r1, 8\n\
+ strb r1, [r2, 0x3]\n\
+ adds r0, r2, 0x4\n\
+ mov r12, r0\n\
+ ldr r4, _0800CA34 @ =gUnknown_02024BE6\n\
+ ldrh r0, [r4]\n\
+ strh r0, [r2, 0x4]\n\
+ ldr r0, _0800CA38 @ =gUnknown_02024BE8\n\
+ ldrh r0, [r0]\n\
+ mov r1, r12\n\
+ strh r0, [r1, 0x2]\n\
+ ldr r0, _0800CA3C @ =gUnknown_02024C04\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r1, 0x4]\n\
+ ldr r0, _0800CA40 @ =byte_2024C06\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1, 0x6]\n\
+ ldr r1, _0800CA44 @ =0x02000000\n\
+ ldr r3, _0800CA48 @ =0x00016003\n\
+ adds r0, r1, r3\n\
+ ldrb r0, [r0]\n\
+ mov r7, r12\n\
+ strb r0, [r7, 0x7]\n\
+ adds r3, 0x5B\n\
+ adds r0, r1, r3\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r7, 0x8]\n\
+ ldr r7, _0800CA4C @ =0x000160c1\n\
+ adds r1, r7\n\
+ ldrb r0, [r1]\n\
+ mov r1, r12\n\
+ strb r0, [r1, 0x9]\n\
+ ldr r0, _0800CA50 @ =gUnknown_02024C0B\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1, 0xA]\n\
+ ldr r3, _0800CA54 @ =gBattleMoves\n\
+ ldrh r1, [r4]\n\
+ lsls r0, r1, 1\n\
+ adds r0, r1\n\
+ lsls r0, 2\n\
+ adds r0, r3\n\
+ ldrb r0, [r0, 0x2]\n\
+ mov r3, r12\n\
+ strb r0, [r3, 0xB]\n\
+ movs r3, 0\n\
+ mov r9, r2\n\
+ ldr r7, _0800CA58 @ =gUnknown_030042B0\n\
+ mov r8, r7\n\
+ adds r2, 0x10\n\
+ ldr r0, _0800CA5C @ =gBattleMons\n\
+ adds r4, r0, 0\n\
+ adds r4, 0x20\n\
+_0800C9D2:\n\
+ adds r1, r2, r3\n\
+ ldrb r0, [r4]\n\
+ strb r0, [r1]\n\
+ adds r4, 0x58\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x3\n\
+ ble _0800C9D2\n\
+ movs r3, 0\n\
+ mov r5, r12\n\
+ adds r5, 0x10\n\
+ mov r4, r12\n\
+ adds r4, 0x20\n\
+ ldr r6, _0800CA60 @ =gUnknown_03004290\n\
+ mov r2, r12\n\
+ adds r2, 0x30\n\
+_0800C9F0:\n\
+ adds r1, r5, r3\n\
+ ldr r7, _0800CA64 @ =gUnknown_030041C0\n\
+ adds r0, r3, r7\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r1, r4, r3\n\
+ adds r0, r3, r6\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r1, r2, r3\n\
+ mov r7, r8\n\
+ adds r0, r3, r7\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r3, 0x1\n\
+ cmp r3, 0xF\n\
+ ble _0800C9F0\n\
+ mov r0, r10\n\
+ mov r1, r9\n\
+ movs r2, 0x44\n\
+ bl dp01_prepare_buffer\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\
+_0800CA2C: .4byte gUnknown_03004040\n\
+_0800CA30: .4byte gUnknown_02024D26\n\
+_0800CA34: .4byte gUnknown_02024BE6\n\
+_0800CA38: .4byte gUnknown_02024BE8\n\
+_0800CA3C: .4byte gUnknown_02024C04\n\
+_0800CA40: .4byte byte_2024C06\n\
+_0800CA44: .4byte 0x02000000\n\
+_0800CA48: .4byte 0x00016003\n\
+_0800CA4C: .4byte 0x000160c1\n\
+_0800CA50: .4byte gUnknown_02024C0B\n\
+_0800CA54: .4byte gBattleMoves\n\
+_0800CA58: .4byte gUnknown_030042B0\n\
+_0800CA5C: .4byte gBattleMons\n\
+_0800CA60: .4byte gUnknown_03004290\n\
+_0800CA64: .4byte gUnknown_030041C0\n\
+ .syntax divided\n");
+}
+#endif
+
+__attribute__((naked))
+void dp01_build_cmdbuf_x11_TODO()
+{
+ 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\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r10, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ ldr r2, _0800CB28 @ =gUnknown_03004040\n\
+ movs r0, 0x11\n\
+ strb r0, [r2]\n\
+ strb r0, [r2, 0x1]\n\
+ strb r1, [r2, 0x2]\n\
+ lsrs r1, 8\n\
+ strb r1, [r2, 0x3]\n\
+ adds r0, r2, 0x4\n\
+ mov r12, r0\n\
+ ldr r0, _0800CB2C @ =gUnknown_02024BE6\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r2, 0x4]\n\
+ ldr r0, _0800CB30 @ =gUnknown_02024BE8\n\
+ ldrh r0, [r0]\n\
+ mov r1, r12\n\
+ strh r0, [r1, 0x2]\n\
+ ldr r0, _0800CB34 @ =gUnknown_02024C04\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r1, 0x4]\n\
+ ldr r0, _0800CB38 @ =byte_2024C06\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1, 0x6]\n\
+ ldr r0, _0800CB3C @ =0x02000000\n\
+ ldr r3, _0800CB40 @ =0x00016003\n\
+ adds r1, r0, r3\n\
+ ldrb r1, [r1]\n\
+ mov r7, r12\n\
+ strb r1, [r7, 0x7]\n\
+ ldr r1, _0800CB44 @ =0x0001605e\n\
+ adds r0, r1\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r7, 0x8]\n\
+ movs r3, 0\n\
+ mov r9, r2\n\
+ ldr r7, _0800CB48 @ =gUnknown_030042B0\n\
+ mov r8, r7\n\
+ mov r4, r9\n\
+ adds r4, 0x10\n\
+ ldr r0, _0800CB4C @ =gBattleMons\n\
+ adds r2, r0, 0\n\
+ adds r2, 0x20\n\
+_0800CACE:\n\
+ adds r1, r4, r3\n\
+ ldrb r0, [r2]\n\
+ strb r0, [r1]\n\
+ adds r2, 0x58\n\
+ adds r3, 0x1\n\
+ cmp r3, 0x3\n\
+ ble _0800CACE\n\
+ movs r3, 0\n\
+ mov r5, r12\n\
+ adds r5, 0x10\n\
+ mov r4, r12\n\
+ adds r4, 0x20\n\
+ ldr r6, _0800CB50 @ =gUnknown_03004290\n\
+ mov r2, r12\n\
+ adds r2, 0x30\n\
+_0800CAEC:\n\
+ adds r1, r5, r3\n\
+ ldr r7, _0800CB54 @ =gUnknown_030041C0\n\
+ adds r0, r3, r7\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r1, r4, r3\n\
+ adds r0, r3, r6\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r1, r2, r3\n\
+ mov r7, r8\n\
+ adds r0, r3, r7\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r1]\n\
+ adds r3, 0x1\n\
+ cmp r3, 0xF\n\
+ ble _0800CAEC\n\
+ mov r0, r10\n\
+ mov r1, r9\n\
+ movs r2, 0x44\n\
+ bl dp01_prepare_buffer\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\
+_0800CB28: .4byte gUnknown_03004040\n\
+_0800CB2C: .4byte gUnknown_02024BE6\n\
+_0800CB30: .4byte gUnknown_02024BE8\n\
+_0800CB34: .4byte gUnknown_02024C04\n\
+_0800CB38: .4byte byte_2024C06\n\
+_0800CB3C: .4byte 0x02000000\n\
+_0800CB40: .4byte 0x00016003\n\
+_0800CB44: .4byte 0x0001605e\n\
+_0800CB48: .4byte gUnknown_030042B0\n\
+_0800CB4C: .4byte gBattleMons\n\
+_0800CB50: .4byte gUnknown_03004290\n\
+_0800CB54: .4byte gUnknown_030041C0\n\
+ .syntax divided\n");
+}
+
+void dp01_build_cmdbuf_x12_a_bb(u8 a, int b, u16 c)
+{
+ gUnknown_03004040[0] = 18;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void unref_sub_800CB84(u8 a, int 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)
+{
+ u32 i;
+
+ gUnknown_03004040[0] = 20;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = 0;
+ for (i = 0; i < 20; i++)
+ gUnknown_03004040[4 + i] = d[i];
+ dp01_prepare_buffer(a, gUnknown_03004040, 24);
+}
+
+void sub_800CBE0(u8 a, u8 *b)
+{
+ int i;
+
+ gUnknown_03004040[0] = 21;
+ for (i = 0; i < 3; i++)
+ gUnknown_03004040[1 + i] = b[i];
+ 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)
+{
+ int i;
+
+ gUnknown_03004040[0] = 22;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = d;
+ for (i = 0; i < 3; i++)
+ gUnknown_03004040[4 + i] = e[i];
+ dp01_prepare_buffer(a, gUnknown_03004040, 8); //but only 7 bytes were written
+}
+
+void dp01_build_cmdbuf_x17_17_17_17(u8 a)
+{
+ gUnknown_03004040[0] = 23;
+ gUnknown_03004040[1] = 23;
+ gUnknown_03004040[2] = 23;
+ gUnknown_03004040[3] = 23;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x18_0_aa_health_bar_update(u8 a, s16 b)
+{
+ gUnknown_03004040[0] = 24;
+ gUnknown_03004040[1] = 0;
+ gUnknown_03004040[2] = b;
+ gUnknown_03004040[3] = (b & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x19_a_bb(u8 a, int b, s16 c)
+{
+ gUnknown_03004040[0] = 25;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x1A_aaaa_bbbb(u8 a, u32 b, u32 c)
+{
+ gUnknown_03004040[0] = 26;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0x0000FF00) >> 8;
+ gUnknown_03004040[3] = (b & 0x00FF0000) >> 16;
+ gUnknown_03004040[4] = (b & 0xFF000000) >> 24;
+ gUnknown_03004040[5] = c;
+ gUnknown_03004040[6] = (c & 0x0000FF00) >> 8;
+ gUnknown_03004040[7] = (c & 0x00FF0000) >> 16;
+ gUnknown_03004040[8] = (c & 0xFF000000) >> 24;
+ dp01_prepare_buffer(a, gUnknown_03004040, 9);
+}
+
+void dp01_build_cmdbuf_x1B_aaaa_b(u8 a, int b, u32 c)
+{
+ gUnknown_03004040[0] = 27;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0x0000FF00) >> 8;
+ gUnknown_03004040[4] = (c & 0x00FF0000) >> 16;
+ gUnknown_03004040[5] = (c & 0xFF000000) >> 24;
+ dp01_prepare_buffer(a, gUnknown_03004040, 6);
+}
+
+void dp01_build_cmdbuf_x1C_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 28;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x1D_1D_numargs_varargs(u8 a, u16 b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 29;
+ gUnknown_03004040[1] = 29;
+ gUnknown_03004040[2] = b;
+ gUnknown_03004040[3] = (b & 0xFF00) >> 8;
+ for (i = 0; i < b; i++)
+ gUnknown_03004040[4 + i] = *(c++);
+ dp01_prepare_buffer(a, gUnknown_03004040, b + 4);
+}
+
+void unref_sub_800CDD4(u8 a, u32 b, u16 c, u8 *d)
+{
+ int i;
+
+ gUnknown_03004040[0] = 30;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0x0000FF00) >> 8;
+ gUnknown_03004040[3] = (b & 0x00FF0000) >> 16;
+ gUnknown_03004040[4] = (b & 0xFF000000) >> 24;
+ gUnknown_03004040[5] = c;
+ gUnknown_03004040[6] = (c & 0xFF00) >> 8;
+ for (i = 0; i < c; i++)
+ gUnknown_03004040[7 + i] = *(d++);
+ dp01_prepare_buffer(a, gUnknown_03004040, c + 7);
+}
+
+void unref_sub_800CE3C(u8 a, u16 b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 31;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ for (i = 0; i < b; i++)
+ gUnknown_03004040[3 + i] = *(c++);
+ dp01_prepare_buffer(a, gUnknown_03004040, b + 3);
+}
+
+void unref_sub_800CE84(u8 a, u16 b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 32;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ for (i = 0; i < b; i++)
+ gUnknown_03004040[3 + i] = *(c++);
+ dp01_prepare_buffer(a, gUnknown_03004040, b + 3);
+}
+
+void dp01_build_cmdbuf_x21_a_bb(u8 a, int b, u16 c)
+{
+ gUnknown_03004040[0] = 33;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x22_a_three_bytes(u8 a, int b, u8 *c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 34;
+ gUnknown_03004040[1] = b;
+ for (i = 0; i < 3; i++)
+ gUnknown_03004040[2 + i] = c[i];
+ dp01_prepare_buffer(a, gUnknown_03004040, 5);
+}
+
+void dp01_build_cmdbuf_x23_aa_0(u8 a, u16 b)
+{
+ gUnknown_03004040[0] = 35;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x24_aa_0(u8 a, u16 b)
+{
+ gUnknown_03004040[0] = 36;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x25_25_25_25(u8 a)
+{
+ gUnknown_03004040[0] = 37;
+ gUnknown_03004040[1] = 37;
+ gUnknown_03004040[2] = 37;
+ gUnknown_03004040[3] = 37;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x26_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 38;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x27_27_27_27(u8 a)
+{
+ gUnknown_03004040[0] = 39;
+ gUnknown_03004040[1] = 39;
+ gUnknown_03004040[2] = 39;
+ gUnknown_03004040[3] = 39;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x28_28_28_28(u8 a)
+{
+ gUnknown_03004040[0] = 40;
+ gUnknown_03004040[1] = 40;
+ gUnknown_03004040[2] = 40;
+ gUnknown_03004040[3] = 40;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x29_29_29_29(u8 a)
+{
+ gUnknown_03004040[0] = 41;
+ gUnknown_03004040[1] = 41;
+ gUnknown_03004040[2] = 41;
+ gUnknown_03004040[3] = 41;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x2A_2A_2A_2A(u8 a)
+{
+ gUnknown_03004040[0] = 42;
+ gUnknown_03004040[1] = 42;
+ gUnknown_03004040[2] = 42;
+ gUnknown_03004040[3] = 42;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x2B_aa_0(u8 a, u16 b)
+{
+ gUnknown_03004040[0] = 43;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void sub_800D074(u8 a, u16 b)
+{
+ gUnknown_03004040[0] = 44;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = (b & 0xFF00) >> 8;
+ gUnknown_03004040[3] = 0;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x2D_2D_2D_2D(u8 a)
+{
+ gUnknown_03004040[0] = 45;
+ gUnknown_03004040[1] = 45;
+ gUnknown_03004040[2] = 45;
+ gUnknown_03004040[3] = 45;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x2E_a(u8 a, int b)
+{
+ gUnknown_03004040[0] = 46;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
+
+void dp01_build_cmdbuf_x2F_2F_2F_2F(u8 a)
+{
+ gUnknown_03004040[0] = 47;
+ gUnknown_03004040[1] = 47;
+ gUnknown_03004040[2] = 47;
+ gUnknown_03004040[3] = 47;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x30_TODO(u8 a, u8 *b, u8 c)
+{
+ int i;
+
+ gUnknown_03004040[0] = 48;
+ gUnknown_03004040[1] = c & 0x7F;
+ gUnknown_03004040[2] = (c & 0x80) >> 7;
+ gUnknown_03004040[3] = 48;
+ for (i = 0; i < 48; i++)
+ gUnknown_03004040[4 + i] = b[i];
+ dp01_prepare_buffer(a, gUnknown_03004040, 52);
+}
+
+void dp01_build_cmdbuf_x31_31_31_31(u8 a)
+{
+ gUnknown_03004040[0] = 49;
+ gUnknown_03004040[1] = 49;
+ gUnknown_03004040[2] = 49;
+ gUnknown_03004040[3] = 49;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x32_32_32_32(u8 a)
+{
+ gUnknown_03004040[0] = 50;
+ gUnknown_03004040[1] = 50;
+ gUnknown_03004040[2] = 50;
+ gUnknown_03004040[3] = 50;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x33_a_33_33(u8 a, int b)
+{
+ gUnknown_03004040[0] = 51;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = 51;
+ gUnknown_03004040[3] = 51;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void dp01_build_cmdbuf_x34_a_bb_aka_battle_anim(u8 a, int b, u16 c)
+{
+ gUnknown_03004040[0] = 52;
+ gUnknown_03004040[1] = b;
+ gUnknown_03004040[2] = c;
+ gUnknown_03004040[3] = (c & 0xFF00) >> 8;
+ dp01_prepare_buffer(a, gUnknown_03004040, 4);
+}
+
+void sub_800D1D8(u8 a, int 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)
+{
+ 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)
+{
+ gUnknown_03004040[0] = 55;
+ gUnknown_03004040[1] = b;
+ dp01_prepare_buffer(a, gUnknown_03004040, 2);
+}
diff --git a/src/rom4.c b/src/rom4.c
index 3f383b690..9d7fec115 100644
--- a/src/rom4.c
+++ b/src/rom4.c
@@ -4,17 +4,19 @@
#include "asm_fieldmap.h"
#include "battle_setup.h"
#include "berry.h"
+#include "event_data.h"
#include "field_camera.h"
#include "field_effect.h"
#include "field_map_obj.h"
#include "field_message_box.h"
#include "field_player_avatar.h"
-#include "event_data.h"
+#include "field_special_scene.h"
#include "heal_location.h"
#include "link.h"
#include "load_save.h"
#include "main.h"
#include "menu.h"
+#include "metatile_behavior.h"
#include "new_game.h"
#include "palette.h"
#include "play_time.h"
@@ -26,10 +28,12 @@
#include "start_menu.h"
#include "task.h"
#include "tileset_anim.h"
-#include "field_special_scene.h"
#include "weather.h"
#include "wild_encounter.h"
-#include "metatile_behavior.h"
+#include "script_pokemon_80C4.h"
+#include "clock.h"
+#include "field_map_obj_helpers.h"
+#include "field_control_avatar.h"
#ifdef SAPPHIRE
#define LEGENDARY_MUSIC BGM_OOAME // Heavy Rain
@@ -55,7 +59,7 @@ extern struct WarpData gUnknown_02029808;
extern struct UnkPlayerStruct gUnknown_02029810;
extern u16 gUnknown_02029814;
extern bool8 gUnknown_02029816;
-extern struct LinkPlayerMapObject gLinkPlayerMapObjects[];
+extern struct LinkPlayerMapObject gLinkPlayerMapObjects[4];
extern u8 gUnknown_03000580[];
extern u16 (*gUnknown_03000584)(u32);
@@ -104,7 +108,6 @@ extern const struct WarpData gDummyWarpData;
extern s32 gUnknown_0839ACE8;
extern u32 gUnknown_08216694[];
-
void DoWhiteOut(void)
{
ScriptContext2_RunNewScript(EventScript_LeagueWhiteOut);
@@ -391,7 +394,7 @@ void sub_8053588(u8 a1)
warp_set(&gSaveBlock1.warp3, warp->group, warp->map, -1, warp->x, warp->y);
}
-void sub_80535C4(u16 a1, u16 a2)
+void sub_80535C4(s16 a1, s16 a2)
{
u8 v4 = sav1_map_get_light_level();
u8 v5 = get_map_light_level_by_bank_and_number(gUnknown_020297F8.mapGroup, gUnknown_020297F8.mapNum);
@@ -466,16 +469,10 @@ struct MapConnection *sub_8053818(u8 dir)
if (connection == NULL)
return NULL;
-
- i = 0;
-
- while (i < count)
- {
- if (connection->direction == dir)
+
+ for(i = 0; i < count; i++, connection++)
+ if (connection->direction == dir)
return connection;
- i++;
- connection++;
- }
return NULL;
}
@@ -539,7 +536,7 @@ void sub_80538F0(u8 mapGroup, u8 mapNum)
DoCurrentWeather();
ResetFieldTasksArgs();
mapheader_run_script_with_tag_x5();
- AddMapNamePopUpWindowTask();
+ ShowMapNamePopup();
}
void sub_8053994(u32 a1)
@@ -667,15 +664,15 @@ bool32 IsBikingAllowedByMap(void)
return FALSE;
if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)
return FALSE;
-
+
// is player in SeafloorCavern_Room9?
if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 36)
return FALSE;
-
+
// is player in CaveOfOrigin_B4F?
if (gSaveBlock1.location.mapGroup == 24 && gSaveBlock1.location.mapNum == 42)
return FALSE;
-
+
return TRUE;
}
@@ -1020,20 +1017,21 @@ bool32 is_c1_link_related_active(void)
void c1_overworld_normal(u16 newKeys, u16 heldKeys)
{
- struct UnkInputStruct inputStruct;
+ struct FieldInput inputStruct;
+
sub_8059204();
- sub_8067EEC(&inputStruct);
- process_overworld_input(&inputStruct, newKeys, heldKeys);
+ FieldClearPlayerInput(&inputStruct);
+ FieldGetPlayerInput(&inputStruct, newKeys, heldKeys);
if (!ScriptContext2_IsEnabled())
{
if (sub_8068024(&inputStruct) == 1)
{
ScriptContext2_Enable();
- HideMapNamePopUpWindow();
+ HideMapNamePopup();
}
else
{
- player_step(inputStruct.input_field_2, newKeys, heldKeys);
+ player_step(inputStruct.dpadDirection, newKeys, heldKeys);
}
}
}
@@ -1254,7 +1252,7 @@ void sub_80546F0(void)
void sub_805470C(void)
{
if (gMapHeader.flags == 1 && sub_80BBB24() == 1)
- AddMapNamePopUpWindowTask();
+ ShowMapNamePopup();
sub_8080B60();
}
@@ -1449,7 +1447,7 @@ bool32 sub_805493C(u8 *a1, u32 a2)
break;
case 11:
if (gMapHeader.flags == 1 && sub_80BBB24() == 1)
- AddMapNamePopUpWindowTask();
+ ShowMapNamePopup();
(*a1)++;
break;
case 12:
@@ -1572,12 +1570,12 @@ void sub_8054BA8(void)
addr = (void *)VRAM;
size = 0x18000;
- while(1)
+ while (1)
{
DmaFill16(3, 0, addr, 0x1000);
addr += 0x1000;
size -= 0x1000;
- if(size <= 0x1000)
+ if (size <= 0x1000)
{
DmaFill16(3, 0, addr, size);
break;
@@ -2099,7 +2097,7 @@ void sub_80555B0(int linkPlayerId, int a2, struct UnkStruct_8054FF8 *a3)
sub_8055B08(linkPlayerId, &x, &y);
a3->sub.x = x;
a3->sub.y = y;
- a3->sub.field_8 = sub_8055B50(linkPlayerId);
+ a3->sub.height = sub_8055B50(linkPlayerId);
a3->field_C = MapGridGetMetatileBehaviorAt(x, y);
}
@@ -2141,7 +2139,7 @@ bool32 sub_8055660(struct UnkStruct_8054FF8 *a1)
u8 *sub_805568C(struct UnkStruct_8054FF8 *a1)
{
- struct UnkStruct_8054FF8_Substruct unkStruct;
+ struct MapPosition unkStruct;
u8 linkPlayerId;
if (a1->c && a1->c != 2)
@@ -2150,7 +2148,7 @@ u8 *sub_805568C(struct UnkStruct_8054FF8 *a1)
unkStruct = a1->sub;
unkStruct.x += gUnknown_0821664C[a1->d].x;
unkStruct.y += gUnknown_0821664C[a1->d].y;
- unkStruct.field_8 = 0;
+ unkStruct.height = 0;
linkPlayerId = GetLinkPlayerIdAt(unkStruct.x, unkStruct.y);
if (linkPlayerId != 4)
@@ -2161,8 +2159,8 @@ u8 *sub_805568C(struct UnkStruct_8054FF8 *a1)
return TradeRoom_TooBusyToNotice;
if (!sub_8083BF4(linkPlayerId))
return TradeRoom_ReadTrainerCard1;
- else
- return TradeRoom_ReadTrainerCard2;
+ else
+ return TradeRoom_ReadTrainerCard2;
}
return sub_80682A8(&unkStruct, a1->field_C, a1->d);
@@ -2303,7 +2301,7 @@ void ZeroLinkPlayerMapObject(struct LinkPlayerMapObject *linkPlayerMapObj)
void strange_npc_table_clear(void)
{
- memset(gLinkPlayerMapObjects, 0, 16);
+ memset(gLinkPlayerMapObjects, 0, sizeof(gLinkPlayerMapObjects));
}
void ZeroMapObject(struct MapObject *mapObj)
@@ -2541,7 +2539,7 @@ void CreateLinkPlayerSprite(u8 linkPlayerId)
if (linkPlayerMapObj->active)
{
- u8 val = sub_805983C(0, mapObj->mapobj_bit_1);
+ u8 val = GetRivalAvatarGraphicsIdByStateIdAndGender(0, mapObj->mapobj_bit_1);
mapObj->spriteId = AddPseudoFieldObject(val, SpriteCB_LinkPlayer, 0, 0, 0);
sprite = &gSprites[mapObj->spriteId];
sprite->coordOffsetEnabled = TRUE;
diff --git a/src/rom6.c b/src/rom6.c
new file mode 100644
index 000000000..037516489
--- /dev/null
+++ b/src/rom6.c
@@ -0,0 +1,204 @@
+#include "global.h"
+#include "asm.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "rom4.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "task.h"
+#include "rom6.h"
+#include "braille_puzzles.h"
+
+extern u16 gScriptLastTalked;
+extern u32 gUnknown_0202FF84[];
+extern struct MapPosition gUnknown_0203923C;
+extern void (*gUnknown_0300485C)(void);
+extern u8 gLastFieldPokeMenuOpened;
+extern void (*gUnknown_03005CE4)(void);
+extern u8 UseRockSmashScript[];
+
+extern void sub_808AB90(void);
+extern void task08_080A1C44(u8);
+extern u8 sub_80CA1C8(void);
+
+static void task08_080C9820(u8);
+static void sub_810B3DC(u8);
+static void sub_810B428(u8);
+static void sub_810B4CC(u8);
+static void sub_810B53C(void);
+static void sub_810B58C(void);
+static void sub_810B5D8(void);
+static void sub_810B634(void);
+
+bool8 npc_before_player_of_type(u8 a)
+{
+ u8 mapObjId;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ gUnknown_0203923C.height = PlayerGetZCoord();
+ mapObjId = GetFieldObjectIdByXYZ(gUnknown_0203923C.x, gUnknown_0203923C.y, gUnknown_0203923C.height);
+ if (gMapObjects[mapObjId].graphicsId != a)
+ {
+ return FALSE;
+ }
+ else
+ {
+ gScriptLastTalked = gMapObjects[mapObjId].localId;
+ return TRUE;
+ }
+}
+
+u8 oei_task_add(void)
+{
+ GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ return CreateTask(task08_080C9820, 8);
+}
+
+static void task08_080C9820(u8 taskId)
+{
+ u8 mapObjId;
+
+ ScriptContext2_Enable();
+ gPlayerAvatar.unk6 = 1;
+ mapObjId = gPlayerAvatar.mapObjectId;
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(&gMapObjects[mapObjId])
+ || FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[mapObjId]))
+ {
+ if (gMapHeader.mapType == 5)
+ {
+ FieldEffectStart(0x3B);
+ gTasks[taskId].func = sub_810B428;
+ }
+ else
+ {
+ sub_8059BF4();
+ FieldObjectSetSpecialAnim(&gMapObjects[mapObjId], 0x39);
+ gTasks[taskId].func = sub_810B3DC;
+ }
+ }
+}
+
+static void sub_810B3DC(u8 taskId)
+{
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE)
+ {
+ FieldEffectStart(0x3B);
+ gTasks[taskId].func = sub_810B428;
+ }
+}
+
+static void sub_810B428(u8 taskId)
+{
+ if (!FieldEffectActiveListContains(6))
+ {
+ gUnknown_0202FF84[1] = player_get_direction_lower_nybble();
+ if (gUnknown_0202FF84[1] == 1)
+ gUnknown_0202FF84[2] = 0;
+ if (gUnknown_0202FF84[1] == 2)
+ gUnknown_0202FF84[2] = 1;
+ if (gUnknown_0202FF84[1] == 3)
+ gUnknown_0202FF84[2] = 2;
+ if (gUnknown_0202FF84[1] == 4)
+ gUnknown_0202FF84[2] = 3;
+ sub_805B980(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState());
+ StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gUnknown_0202FF84[2]);
+ FieldEffectActiveListRemove(6);
+ gTasks[taskId].func = sub_810B4CC;
+ }
+}
+
+static void sub_810B4CC(u8 taskId)
+{
+ void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]);
+
+ func();
+ gPlayerAvatar.unk6 = 0;
+ DestroyTask(taskId);
+}
+
+bool8 SetUpFieldMove_RockSmash(void)
+{
+ if (npc_before_player_of_type(0x56) == TRUE)
+ {
+ gUnknown_0300485C = sub_808AB90;
+ gUnknown_03005CE4 = sub_810B53C;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void sub_810B53C(void)
+{
+ gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(UseRockSmashScript);
+}
+
+int FldEff_RockSmash(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)sub_810B58C >> 16;
+ gTasks[taskId].data[9] = (u32)sub_810B58C;
+ IncrementGameStat(0x13);
+ return 0;
+}
+
+static void sub_810B58C(void)
+{
+ PlaySE(SE_W088);
+ FieldEffectActiveListRemove(0x25);
+ EnableBothScriptContexts();
+}
+
+int SetUpFieldMove_Dig(void)
+{
+ if (sub_80CA1C8() == TRUE)
+ {
+ gUnknown_0300485C = sub_808AB90;
+ gUnknown_03005CE4 = sub_810B5D8;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+static void sub_810B5D8(void)
+{
+ sub_8053014();
+ FieldEffectStart(0x26);
+ gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened;
+}
+
+int FldEff_UseDig(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (u32)sub_810B634 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_810B634;
+ if (!ShouldDoBrailleDigEffect())
+ SetPlayerAvatarTransitionFlags(1);
+ return 0;
+}
+
+static void sub_810B634(void)
+{
+ u8 taskId;
+
+ FieldEffectActiveListRemove(0x26);
+ if (ShouldDoBrailleDigEffect())
+ {
+ DoBrailleDigEffect();
+ }
+ else
+ {
+ taskId = CreateTask(task08_080A1C44, 8);
+ gTasks[taskId].data[0] = 0;
+ }
+}
diff --git a/src/rom_800D42C.c b/src/rom_800D42C.c
index e9c816818..7b572ba73 100644
--- a/src/rom_800D42C.c
+++ b/src/rom_800D42C.c
@@ -26,42 +26,50 @@ extern u8 BattleText_Tie[];
#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X)
#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X)
-void sub_800DC24(void) {
+void sub_800DC24(void)
+{
- if (gUnknown_02024D26 == 3) {
+ if (gUnknown_02024D26 == 3)
+ {
PRINT_MESSAGE(BattleText_Tie, 160, CENTER_MESSAGE_X);
return;
}
- if (gBattleTypeFlags & BATTLE_TYPE_40) {
+ if (gBattleTypeFlags & BATTLE_TYPE_40)
+ {
// Double battle?
- if (gUnknown_02024D26 == 1) {
+ if (gUnknown_02024D26 == 1)
+ {
// lp_field_18 = player position?
- switch (gLinkPlayers[battle_2000000.linkPlayerIndex].lp_field_18) {
- case 0:
- case 2: PRINT_MESSAGE_LEFT(BattleText_Win, 160);
- PRINT_MESSAGE_RIGHT(BattleText_Loss, 168);
- return;
-
- case 1:
- case 3: PRINT_MESSAGE_RIGHT(BattleText_Win, 160)
- PRINT_MESSAGE_LEFT(BattleText_Loss, 168)
- return;
+ switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18)
+ {
+ case 0:
+ case 2: PRINT_MESSAGE_LEFT(BattleText_Win, 160);
+ PRINT_MESSAGE_RIGHT(BattleText_Loss, 168);
+ return;
+
+ case 1:
+ case 3: PRINT_MESSAGE_RIGHT(BattleText_Win, 160)
+ PRINT_MESSAGE_LEFT(BattleText_Loss, 168)
+ return;
}
- } else {
-
- switch (gLinkPlayers[battle_2000000.linkPlayerIndex].lp_field_18) {
- case 1:
- case 3: PRINT_MESSAGE_LEFT(BattleText_Win, 160);
- PRINT_MESSAGE_RIGHT(BattleText_Loss, 168);
- return;
-
- case 0:
- case 2: PRINT_MESSAGE_RIGHT(BattleText_Win, 160);
- PRINT_MESSAGE_LEFT(BattleText_Loss, 168);
- return;
+ }
+ else
+ {
+
+ switch (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18)
+ {
+ case 1:
+ case 3: PRINT_MESSAGE_LEFT(BattleText_Win, 160);
+ PRINT_MESSAGE_RIGHT(BattleText_Loss, 168);
+ return;
+
+ case 0:
+ case 2: PRINT_MESSAGE_RIGHT(BattleText_Win, 160);
+ PRINT_MESSAGE_LEFT(BattleText_Loss, 168);
+ return;
}
}
@@ -69,19 +77,28 @@ void sub_800DC24(void) {
}
- if (gUnknown_02024D26 == 1) {
- if (gLinkPlayers[battle_2000000.linkPlayerIndex].lp_field_18 != 0) {
+ if (gUnknown_02024D26 == 1)
+ {
+ if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0)
+ {
PRINT_MESSAGE_RIGHT(BattleText_Win, 160);
PRINT_MESSAGE_LEFT(BattleText_Loss, 168);
- } else {
+ }
+ else
+ {
PRINT_MESSAGE_LEFT(BattleText_Win, 160);
PRINT_MESSAGE_RIGHT(BattleText_Loss, 168);
}
- } else {
- if (gLinkPlayers[battle_2000000.linkPlayerIndex].lp_field_18 != 0) {
+ }
+ else
+ {
+ if (gLinkPlayers[BATTLE_STRUCT->linkPlayerIndex].lp_field_18 != 0)
+ {
PRINT_MESSAGE_LEFT(BattleText_Win, 160);
PRINT_MESSAGE_RIGHT(BattleText_Loss, 168);
- } else {
+ }
+ else
+ {
PRINT_MESSAGE_RIGHT(BattleText_Win, 160);
PRINT_MESSAGE_LEFT(BattleText_Loss, 168);
}
diff --git a/src/rom_8080874.c b/src/rom_8080874.c
new file mode 100644
index 000000000..261ed46c9
--- /dev/null
+++ b/src/rom_8080874.c
@@ -0,0 +1,97 @@
+#include "global.h"
+#include "gba/syscall.h"
+#include "global.fieldmap.h"
+#include "script.h"
+#include "task.h"
+#include "weather.h"
+
+void palette_bg_fill_white(void);
+void palette_bg_fill_black(void);
+void pal_fill_black(void);
+void task0A_asap_script_env_2_enable_and_set_ctx_running(u8);
+
+extern u8 get_map_light_from_warp0(void);
+extern u8 sav1_map_get_light_level(void);
+extern u8 fade_type_for_given_maplight_pair(u8, u8);
+extern u16 gPlttBufferFaded[];
+extern struct MapHeader * warp1_get_mapheader(void);
+extern void sub_8059B88(u8);
+extern void sub_8053E90(void);
+
+extern u8 sub_810CDB8(u8, u8);
+extern int sub_8080E70(void);
+
+void palette_bg_fill_white(void)
+{
+ u32 source_color = 0x7fff7fff;
+ CpuFastSet(&source_color, gPlttBufferFaded, 0x100 | (1 << 24));
+}
+
+void palette_bg_fill_black(void)
+{
+ u32 source_color = 0;
+ CpuFastSet(&source_color, gPlttBufferFaded, 0x100 | (1 << 24));
+}
+
+void pal_fill_for_map_transition(void)
+{
+ u8 map_light = get_map_light_from_warp0();
+ switch (fade_type_for_given_maplight_pair(map_light, sav1_map_get_light_level()))
+ {
+ case 0:
+ fade_screen(0, 0);
+ palette_bg_fill_black();
+ break;
+ case 1:
+ fade_screen(2, 0);
+ palette_bg_fill_white();
+ }
+}
+
+void pal_fill_black(void)
+{
+ fade_screen(0, 0);
+ palette_bg_fill_black();
+}
+
+void fade_8080918(void)
+{
+ u8 light_level = sav1_map_get_light_level();
+ switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType))
+ {
+ case 0:
+ fade_screen(1, 0);
+ break;
+ case 1:
+ fade_screen(3, 0);
+ }
+}
+
+void sub_8080958(u8 arg)
+{
+ sub_8059B88(!arg);
+}
+
+void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID)
+{
+ if (sub_8080E70() == 1)
+ {
+ DestroyTask(taskID);
+ EnableBothScriptContexts();
+ }
+}
+
+void sub_8080990(void)
+{
+ ScriptContext2_Enable();
+ sub_8053E90();
+ pal_fill_black();
+ CreateTask(&task0A_asap_script_env_2_enable_and_set_ctx_running, 0x0a);
+}
+
+void sub_80809B0(void)
+{
+ ScriptContext2_Enable();
+ pal_fill_black();
+ CreateTask(&task0A_asap_script_env_2_enable_and_set_ctx_running, 0x0a);
+}
diff --git a/src/rom_8094928.c b/src/rom_8094928.c
new file mode 100644
index 000000000..74daec64d
--- /dev/null
+++ b/src/rom_8094928.c
@@ -0,0 +1,135 @@
+#include "global.h"
+#include "pokemon.h"
+
+#define UNK_201606C_ARRAY (unk_2000000 + 0x1606C) // lazy define but whatever.
+
+extern u8 unk_2000000[];
+
+extern struct PokemonStorage gPokemonStorage;
+extern u8 IsLinkDoubleBattle(void);
+extern u8 IsDoubleBattle(void);
+extern u8 battle_get_side_with_given_state(u8);
+extern u8 battle_side_get_owner(u8);
+void sub_8094998(u8[3], u8);
+void sub_8094A74(u8[3], u8, u32);
+
+extern u8 gUnknown_02038470[3];
+extern u8 sub_803FBBC(void);
+extern u16 gUnknown_02024A6A[];
+
+void unref_sub_8094928(struct PokemonStorage *ptr)
+{
+ *ptr = gPokemonStorage;
+}
+
+void unref_sub_8094940(struct PokemonStorage *ptr)
+{
+ gPokemonStorage = *ptr;
+}
+
+void sub_8094958(void)
+{
+ sub_8094998(gUnknown_02038470, sub_803FBBC());
+}
+
+void sub_8094978(u8 arg1, u8 arg2)
+{
+ sub_8094A74((UNK_201606C_ARRAY) + arg1 * 3, arg2, arg1);
+}
+
+void sub_8094998(u8 arg[3], u8 player_number)
+{
+ int i;
+ u32 pos;
+ u8 temp[6];
+ if (IsLinkDoubleBattle() == TRUE)
+ {
+ if (player_number)
+ {
+ *arg = 0x30;
+ arg[1] = 0x45;
+ arg[2] = 0x12;
+ }
+ else
+ {
+ *arg = 0x03;
+ arg[1] = 0x12;
+ arg[2] = 0x45;
+ }
+ }
+ else
+ {
+ if (!IsDoubleBattle())
+ {
+ pos = 1;
+ *temp = gUnknown_02024A6A[battle_get_side_with_given_state(0)];
+ for (i = 0; i <= 5; i++)
+ if (i != *temp)
+ temp[pos++] = i;
+ }
+ else
+ {
+ pos = 2;
+ *temp = gUnknown_02024A6A[battle_get_side_with_given_state(0)];
+ temp[1] = gUnknown_02024A6A[battle_get_side_with_given_state(2)];
+ for (i = 0; i <= 5; i++)
+ if ((i != *temp) && (i != temp[1]))
+ temp[pos++] = i;
+ }
+ for (i = 0; i <= 2; i++)
+ arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1];
+ }
+}
+
+void sub_8094A74(u8 arg[3], u8 player_number, u32 arg3)
+{
+ int i, j;
+ u8 temp[6];
+ if (!battle_side_get_owner(arg3))
+ {
+ i = battle_get_side_with_given_state(0);
+ j = battle_get_side_with_given_state(2);
+ }
+ else
+ {
+ i = battle_get_side_with_given_state(1);
+ j = battle_get_side_with_given_state(3);
+ }
+ if (IsLinkDoubleBattle() == TRUE)
+ {
+ if (player_number)
+ {
+ *arg = 0x30;
+ arg[1] = 0x45;
+ arg[2] = 0x12;
+ }
+ else
+ {
+ *arg = 0x03;
+ arg[1] = 0x12;
+ arg[2] = 0x45;
+ }
+ }
+ else
+ {
+ if (!IsDoubleBattle())
+ {
+ int pos = 1;
+ *temp = gUnknown_02024A6A[i];
+ for (i = 0; i <= 5; i++)
+ if (i != *temp)
+ temp[pos++] = i;
+ }
+ else
+ {
+ int pos = 2;
+ *temp = gUnknown_02024A6A[i];
+ temp[1] = gUnknown_02024A6A[j];
+ for (i = 0; i <= 5; i++)
+ if ((i != *temp) && (i != temp[1]))
+ temp[pos++] = i;
+ }
+ for (i = 0; i <= 2; i++)
+ arg[i] = (temp[i << 1] << 4) | temp[(i << 1) + 1];
+ }
+}
diff --git a/src/safari_zone.c b/src/safari_zone.c
index 08bfbefbf..8c2b63469 100644
--- a/src/safari_zone.c
+++ b/src/safari_zone.c
@@ -1,12 +1,13 @@
#include "global.h"
#include "safari_zone.h"
#include "asm.h"
-#include "field_player_avatar.h"
#include "event_data.h"
+#include "field_player_avatar.h"
#include "main.h"
+#include "rom4.h"
#include "script.h"
#include "string_util.h"
-#include "rom4.h"
+#include "text.h"
struct PokeblockFeeder
{
diff --git a/src/save.c b/src/save.c
index 49db679f8..b5934e231 100644
--- a/src/save.c
+++ b/src/save.c
@@ -1,60 +1,83 @@
#include "global.h"
+#include "gba/flash_internal.h"
+#include "gba/gba.h"
#include "save.h"
#include "asm.h"
-#include "gba/gba.h"
#include "load_save.h"
#include "rom4.h"
-#include "gba/flash_internal.h"
#include "save_failed_screen.h"
-extern struct SaveSection unk_2000000;
+extern u32 gLastSaveSectorStatus; // used but in an unferenced function, so unused
+extern u16 gLastWrittenSector;
+extern u32 gLastSaveCounter;
+extern u16 gLastKnownGoodSector;
+extern u32 gDamagedSaveSectors;
+extern u32 gSaveCounter;
+extern struct SaveSection unk_2000000; // slow save RAM
+extern struct SaveSection *gFastSaveSection; // the pointer is in fast IWRAM but may sometimes point to the slower EWRAM.
+extern u16 gUnknown_03005EB4;
+extern u16 gSaveFileStatus;
+extern u32 gGameContinueCallback;
-extern u32 gUnknown_02039284;
+extern struct PokemonStorage gPokemonStorage;
+extern struct HallOfFame gHallOfFame;
-extern u32 gUnknown_3004820;
+const struct SaveSectionLocation gSaveSectionLocations[] =
+{
+ {((u8 *) &gSaveBlock2), 0x890},
+ {((u8 *) &gSaveBlock1) + 0xF80 * 0, 0xF80},
+ {((u8 *) &gSaveBlock1) + 0xF80 * 1, 0xF80},
+ {((u8 *) &gSaveBlock1) + 0xF80 * 2, 0xF80},
+ {((u8 *) &gSaveBlock1) + 0xF80 * 3, 0xC40},
+ {((u8 *) &gPokemonStorage) + 0xF80 * 0, 0xF80},
+ {((u8 *) &gPokemonStorage) + 0xF80 * 1, 0xF80},
+ {((u8 *) &gPokemonStorage) + 0xF80 * 2, 0xF80},
+ {((u8 *) &gPokemonStorage) + 0xF80 * 3, 0xF80},
+ {((u8 *) &gPokemonStorage) + 0xF80 * 4, 0xF80},
+ {((u8 *) &gPokemonStorage) + 0xF80 * 5, 0xF80},
+ {((u8 *) &gPokemonStorage) + 0xF80 * 6, 0xF80},
+ {((u8 *) &gPokemonStorage) + 0xF80 * 7, 0xF80},
+ {((u8 *) &gPokemonStorage) + 0xF80 * 8, 0x7D0}
+};
-extern u16 gUnknown_03005E9C;
-extern u32 gUnknown_03005EA0;
-extern u16 gUnknown_03005EA4;
-extern u32 gUnknown_03005EA8;
-extern u32 gUnknown_03005EAC;
-extern struct SaveSection *gUnknown_03005EB0;
-extern u16 gUnknown_03005EB4;
-extern u16 gSaveFileStatus;
-extern u32 gUnknown_03005EBC;
+const struct SaveSectionLocation gHallOfFameSaveSectionLocations[] =
+{
+ {((u8 *) &gHallOfFame) + 0xF80 * 0, 0xF80},
+ {((u8 *) &gHallOfFame) + 0xF80 * 1, 0xF80}
+};
-extern struct SaveSectionLocation gSaveSectionLocations[];
-extern struct SaveSectionLocation gHallOfFameSaveSectionLocations[];
-extern u8 gUnknown_08401E24[];
+const u8 gFlashSectors[] = { 0x1E, 0x1F };
void ClearSaveData(void)
{
u16 i;
- for (i = 0; i < 32; i++)
+
+ for (i = 0; i < NUM_SECTORS; i++)
EraseFlashSector(i);
}
-void sub_81251B8(void)
+// ResetSaveCounters
+void ResetSaveCounters(void)
{
- gUnknown_03005EAC = 0;
- gUnknown_03005E9C = 0;
- gUnknown_03005EA8 = 0;
+ gSaveCounter = 0;
+ gLastWrittenSector = 0;
+ gDamagedSaveSectors = 0;
}
-bool32 sub_81251D4(u8 op, u8 bit)
+bool32 SetDamagedSectorBits(u8 op, u8 bit)
{
bool32 retVal = FALSE;
switch (op)
{
- case 0:
- gUnknown_03005EA8 |= 1 << bit;
+ case ENABLE:
+ gDamagedSaveSectors |= (1 << bit);
break;
- case 1:
- gUnknown_03005EA8 &= ~(1 << bit);
+ case DISABLE:
+ gDamagedSaveSectors &= ~(1 << bit);
break;
- case 2:
- if (gUnknown_03005EA8 & (1 << bit))
+ case CHECK: // unused
+ if (gDamagedSaveSectors & (1 << bit))
retVal = TRUE;
break;
}
@@ -62,67 +85,70 @@ bool32 sub_81251D4(u8 op, u8 bit)
return retVal;
}
-u8 save_write_to_flash(u16 a1, struct SaveSectionLocation *a2)
+u8 save_write_to_flash(u16 a1, const struct SaveSectionLocation *location)
{
u32 retVal;
u16 i;
- gUnknown_03005EB0 = &unk_2000000;
+ gFastSaveSection = &unk_2000000;
- if (a1 != 0xFFFF)
+ if (a1 != 0xFFFF) // for link
{
- retVal = sub_81252D8(a1, a2);
+ retVal = HandleWriteSector(a1, location);
}
else
{
- gUnknown_03005EA4 = gUnknown_03005E9C;
- gUnknown_03005EA0 = gUnknown_03005EAC;
- gUnknown_03005E9C++;
- gUnknown_03005E9C = gUnknown_03005E9C % 14;
- gUnknown_03005EAC++;
+ gLastKnownGoodSector = gLastWrittenSector; // backup the current written sector before attempting to write.
+ gLastSaveCounter = gSaveCounter;
+ gLastWrittenSector++;
+ gLastWrittenSector = gLastWrittenSector % 14;
+ gSaveCounter++;
retVal = 1;
+
for (i = 0; i < 14; i++)
- sub_81252D8(i, a2);
- if (gUnknown_03005EA8)
+ HandleWriteSector(i, location);
+
+ if (gDamagedSaveSectors != 0) // skip the damaged sector.
{
retVal = 0xFF;
- gUnknown_03005E9C = gUnknown_03005EA4;
- gUnknown_03005EAC = gUnknown_03005EA0;
+ gLastWrittenSector = gLastKnownGoodSector;
+ gSaveCounter = gLastSaveCounter;
}
}
return retVal;
}
-u8 sub_81252D8(u16 a1, struct SaveSectionLocation *a2)
+u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location)
{
u16 i;
u16 sector;
u8 *data;
u16 size;
- sector = a1 + gUnknown_03005E9C;
+ sector = a1 + gLastWrittenSector;
sector %= 14;
- sector += 14 * (gUnknown_03005EAC % 2);
+ sector += 14 * (gSaveCounter % 2);
- data = a2[a1].data;
- size = a2[a1].size;
+ data = location[a1].data;
+ size = location[a1].size;
+ // clear save section.
for (i = 0; i < sizeof(struct SaveSection); i++)
- ((char *)gUnknown_03005EB0)[i] = 0;
+ ((char *)gFastSaveSection)[i] = 0;
- gUnknown_03005EB0->id = a1;
- gUnknown_03005EB0->unknown = 0x8012025;
- gUnknown_03005EB0->counter = gUnknown_03005EAC;
+ gFastSaveSection->id = a1;
+ gFastSaveSection->security = UNKNOWN_CHECK_VALUE;
+ gFastSaveSection->counter = gSaveCounter;
for (i = 0; i < size; i++)
- gUnknown_03005EB0->data[i] = data[i];
+ gFastSaveSection->data[i] = data[i];
- gUnknown_03005EB0->checksum = sub_8125C10(data, size);
- return sub_8125440(sector, gUnknown_03005EB0->data);
+ gFastSaveSection->checksum = CalculateChecksum(data, size);
+ return TryWriteSector(sector, gFastSaveSection->data);
}
-u8 sub_81253C8(u8 sector, u8 *data, u16 size)
+u8 HandleWriteSectorNBytes(u8 sector, u8 *data, u16 size)
{
u16 i;
struct SaveSection *section = &unk_2000000;
@@ -130,66 +156,66 @@ u8 sub_81253C8(u8 sector, u8 *data, u16 size)
for (i = 0; i < sizeof(struct SaveSection); i++)
((char *)section)[i] = 0;
- section->unknown = 0x8012025;
+ section->security = UNKNOWN_CHECK_VALUE;
for (i = 0; i < size; i++)
section->data[i] = data[i];
- section->id = sub_8125C10(data, size); // id instead of checksum?
- return sub_8125440(sector, section->data);
+ section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used.
+ return TryWriteSector(sector, section->data);
}
-u8 sub_8125440(u8 sector, u8 *data)
+u8 TryWriteSector(u8 sector, u8 *data)
{
- if (ProgramFlashSectorAndVerify(sector, data))
+ if (ProgramFlashSectorAndVerify(sector, data) != 0) // is damaged?
{
- sub_81251D4(0, sector);
+ SetDamagedSectorBits(ENABLE, sector); // set damaged sector bits.
return 0xFF;
}
else
{
- sub_81251D4(1, sector);
+ SetDamagedSectorBits(DISABLE, sector); // unset damaged sector bits. it's safe now.
return 1;
}
}
-u32 sub_812546C(struct SaveSectionLocation *a1)
+u32 RestoreSaveBackupVarsAndIncrement(const struct SaveSectionLocation *location) // location is unused
{
- gUnknown_03005EB0 = &unk_2000000;
- gUnknown_03005EA4 = gUnknown_03005E9C;
- gUnknown_03005EA0 = gUnknown_03005EAC;
- gUnknown_03005E9C++;
- gUnknown_03005E9C = gUnknown_03005E9C % 14;
- gUnknown_03005EAC++;
+ gFastSaveSection = &unk_2000000;
+ gLastKnownGoodSector = gLastWrittenSector;
+ gLastSaveCounter = gSaveCounter;
+ gLastWrittenSector++;
+ gLastWrittenSector = gLastWrittenSector % 14;
+ gSaveCounter++;
gUnknown_03005EB4 = 0;
- gUnknown_03005EA8 = 0;
+ gDamagedSaveSectors = 0;
return 0;
}
-u32 sub_81254C8(struct SaveSectionLocation *a1)
+u32 RestoreSaveBackupVars(const struct SaveSectionLocation *location) // only ever called once, and gSaveBlock2 is passed to this function. location is unused
{
- gUnknown_03005EB0 = &unk_2000000;
- gUnknown_03005EA4 = gUnknown_03005E9C;
- gUnknown_03005EA0 = gUnknown_03005EAC;
+ gFastSaveSection = &unk_2000000;
+ gLastKnownGoodSector = gLastWrittenSector;
+ gLastSaveCounter = gSaveCounter;
gUnknown_03005EB4 = 0;
- gUnknown_03005EA8 = 0;
+ gDamagedSaveSectors = 0;
return 0;
}
-u8 sub_812550C(u16 a1, struct SaveSectionLocation *a2)
+u8 sub_812550C(u16 a1, const struct SaveSectionLocation *location)
{
u8 retVal;
if (gUnknown_03005EB4 < a1 - 1)
{
retVal = 1;
- sub_81252D8(gUnknown_03005EB4, a2);
+ HandleWriteSector(gUnknown_03005EB4, location);
gUnknown_03005EB4++;
- if (gUnknown_03005EA8)
+ if (gDamagedSaveSectors)
{
retVal = 0xFF;
- gUnknown_03005E9C = gUnknown_03005EA4;
- gUnknown_03005EAC = gUnknown_03005EA0;
+ gLastWrittenSector = gLastKnownGoodSector;
+ gSaveCounter = gLastSaveCounter;
}
}
else
@@ -200,20 +226,22 @@ u8 sub_812550C(u16 a1, struct SaveSectionLocation *a2)
return retVal;
}
-u8 sub_812556C(u16 a1, struct SaveSectionLocation *a2)
+u8 sub_812556C(u16 a1, const struct SaveSectionLocation *location)
{
u8 retVal = 1;
- sub_81255B8(a1 - 1, a2);
- if (gUnknown_03005EA8)
+
+ sub_81255B8(a1 - 1, location);
+
+ if (gDamagedSaveSectors)
{
retVal = 0xFF;
- gUnknown_03005E9C = gUnknown_03005EA4;
- gUnknown_03005EAC = gUnknown_03005EA0;
+ gLastWrittenSector = gLastKnownGoodSector;
+ gSaveCounter = gLastSaveCounter;
}
return retVal;
}
-u8 sub_81255B8(u16 a1, struct SaveSectionLocation *a2)
+u8 sub_81255B8(u16 a1, const struct SaveSectionLocation *location)
{
u16 i;
u16 sector;
@@ -221,32 +249,35 @@ u8 sub_81255B8(u16 a1, struct SaveSectionLocation *a2)
u16 size;
u8 status;
- sector = a1 + gUnknown_03005E9C;
+ sector = a1 + gLastWrittenSector;
sector %= 14;
- sector += 14 * (gUnknown_03005EAC % 2);
+ sector += 14 * (gSaveCounter % 2);
- data = a2[a1].data;
- size = a2[a1].size;
+ data = location[a1].data;
+ size = location[a1].size;
+ // clear temp save section.
for (i = 0; i < sizeof(struct SaveSection); i++)
- ((char *)gUnknown_03005EB0)[i] = 0;
+ ((char *)gFastSaveSection)[i] = 0;
- gUnknown_03005EB0->id = a1;
- gUnknown_03005EB0->unknown = 0x8012025;
- gUnknown_03005EB0->counter = gUnknown_03005EAC;
+ gFastSaveSection->id = a1;
+ gFastSaveSection->security = UNKNOWN_CHECK_VALUE;
+ gFastSaveSection->counter = gSaveCounter;
+ // set temp section's data.
for (i = 0; i < size; i++)
- gUnknown_03005EB0->data[i] = data[i];
+ gFastSaveSection->data[i] = data[i];
- gUnknown_03005EB0->checksum = sub_8125C10(data, size);
+ // calculate checksum.
+ gFastSaveSection->checksum = CalculateChecksum(data, size);
EraseFlashSector(sector);
status = 1;
- for (i = 0; i < 0xFF8; i++)
+ for (i = 0; i < sizeof(struct UnkSaveSection); i++)
{
- if (ProgramFlashByte(sector, i, ((u8 *)gUnknown_03005EB0)[i]))
+ if (ProgramFlashByte(sector, i, ((u8 *)gFastSaveSection)[i]))
{
status = 0xFF;
break;
@@ -255,7 +286,7 @@ u8 sub_81255B8(u16 a1, struct SaveSectionLocation *a2)
if (status == 0xFF)
{
- sub_81251D4(0, sector);
+ SetDamagedSectorBits(ENABLE, sector);
return 0xFF;
}
else
@@ -264,7 +295,7 @@ u8 sub_81255B8(u16 a1, struct SaveSectionLocation *a2)
for (i = 0; i < 7; i++)
{
- if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gUnknown_03005EB0)[0xFF9 + i]))
+ if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i]))
{
status = 0xFF;
break;
@@ -273,105 +304,107 @@ u8 sub_81255B8(u16 a1, struct SaveSectionLocation *a2)
if (status == 0xFF)
{
- sub_81251D4(0, sector);
+ SetDamagedSectorBits(ENABLE, sector);
return 0xFF;
}
else
{
- sub_81251D4(1, sector);
+ SetDamagedSectorBits(DISABLE, sector);
return 1;
}
}
}
-u8 sub_8125758(u16 a1, struct SaveSectionLocation *a2)
+u8 sub_8125758(u16 a1, const struct SaveSectionLocation *location)
{
u16 sector;
- sector = a1 + gUnknown_03005E9C - 1;
+ sector = a1 + gLastWrittenSector - 1;
sector %= 14;
- sector += 14 * (gUnknown_03005EAC % 2);
+ sector += 14 * (gSaveCounter % 2);
- if (ProgramFlashByte(sector, 0xFF8, ((u8 *)gUnknown_03005EB0)[0xFF8]))
+ if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)]))
{
- sub_81251D4(0, sector);
- gUnknown_03005E9C = gUnknown_03005EA4;
- gUnknown_03005EAC = gUnknown_03005EA0;
+ // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
+ SetDamagedSectorBits(ENABLE, sector);
+ gLastWrittenSector = gLastKnownGoodSector;
+ gSaveCounter = gLastSaveCounter;
return 0xFF;
}
else
{
- sub_81251D4(1u, sector);
+ SetDamagedSectorBits(DISABLE, sector);
return 1;
}
}
-u8 sub_81257F0(u16 a1, struct SaveSectionLocation *a2)
+u8 sub_81257F0(u16 a1, const struct SaveSectionLocation *location)
{
u16 sector;
- sector = a1 + gUnknown_03005E9C - 1;
+ sector = a1 + gLastWrittenSector - 1;
sector %= 14;
- sector += 14 * (gUnknown_03005EAC % 2);
+ sector += 14 * (gSaveCounter % 2);
- if (ProgramFlashByte(sector, 0xFF8, 0x25))
+ if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25))
{
- sub_81251D4(0, sector);
- gUnknown_03005E9C = gUnknown_03005EA4;
- gUnknown_03005EAC = gUnknown_03005EA0;
+ // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
+ SetDamagedSectorBits(ENABLE, sector);
+ gLastWrittenSector = gLastKnownGoodSector;
+ gSaveCounter = gLastSaveCounter;
return 0xFF;
}
else
{
- sub_81251D4(1u, sector);
+ SetDamagedSectorBits(DISABLE, sector);
return 1;
}
}
-u8 sub_812587C(u16 a1, struct SaveSectionLocation *a2)
+u8 sub_812587C(u16 a1, const struct SaveSectionLocation *location)
{
u8 retVal;
- gUnknown_03005EB0 = &unk_2000000;
+ gFastSaveSection = &unk_2000000;
if (a1 != 0xFFFF)
{
retVal = 0xFF;
}
else
{
- retVal = sub_8125974(a2);
- sub_81258BC(0xFFFF, a2);
+ retVal = sub_8125974(location);
+ sub_81258BC(0xFFFF, location);
}
return retVal;
}
-u8 sub_81258BC(u16 a1, struct SaveSectionLocation *a2)
+u8 sub_81258BC(u16 a1, const struct SaveSectionLocation *location)
{
u16 i;
u16 checksum;
- u16 v3 = 14 * (gUnknown_03005EAC % 2);
+ u16 v3 = 14 * (gSaveCounter % 2);
u16 id;
for (i = 0; i < 14; i++)
{
- sub_8125BF8(i + v3, gUnknown_03005EB0);
- id = gUnknown_03005EB0->id;
+ sub_8125BF8(i + v3, gFastSaveSection);
+ id = gFastSaveSection->id;
if (id == 0)
- gUnknown_03005E9C = i;
- checksum = sub_8125C10(gUnknown_03005EB0->data, a2[id].size);
- if (gUnknown_03005EB0->unknown == 0x8012025
- && gUnknown_03005EB0->checksum == checksum)
+ gLastWrittenSector = i;
+ checksum = CalculateChecksum(gFastSaveSection->data, location[id].size);
+ if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE
+ && gFastSaveSection->checksum == checksum)
{
u16 j;
- for (j = 0; j < a2[id].size; j++)
- ((u8 *)a2[id].data)[j] = gUnknown_03005EB0->data[j];
+ for (j = 0; j < location[id].size; j++)
+ ((u8 *)location[id].data)[j] = gFastSaveSection->data[j];
}
}
return 1;
}
-u8 sub_8125974(struct SaveSectionLocation *a1)
+u8 sub_8125974(const struct SaveSectionLocation *location)
{
u16 i;
u16 checksum;
@@ -387,15 +420,15 @@ u8 sub_8125974(struct SaveSectionLocation *a1)
for (i = 0; i < 14; i++)
{
- sub_8125BF8(i, gUnknown_03005EB0);
- if (gUnknown_03005EB0->unknown == 0x8012025)
+ sub_8125BF8(i, gFastSaveSection);
+ if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE)
{
v5 = TRUE;
- checksum = sub_8125C10(gUnknown_03005EB0->data, a1[gUnknown_03005EB0->id].size);
- if (gUnknown_03005EB0->checksum == checksum)
+ checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size);
+ if (gFastSaveSection->checksum == checksum)
{
- v2 = gUnknown_03005EB0->counter;
- v4 |= 1 << gUnknown_03005EB0->id;
+ v2 = gFastSaveSection->counter;
+ v4 |= 1 << gFastSaveSection->id;
}
}
}
@@ -417,15 +450,15 @@ u8 sub_8125974(struct SaveSectionLocation *a1)
for (i = 0; i < 14; i++)
{
- sub_8125BF8(i + 14, gUnknown_03005EB0);
- if (gUnknown_03005EB0->unknown == 0x8012025)
+ sub_8125BF8(i + 14, gFastSaveSection);
+ if (gFastSaveSection->security == UNKNOWN_CHECK_VALUE)
{
v5 = TRUE;
- checksum = sub_8125C10(gUnknown_03005EB0->data, a1[gUnknown_03005EB0->id].size);
- if (gUnknown_03005EB0->checksum == checksum)
+ checksum = CalculateChecksum(gFastSaveSection->data, location[gFastSaveSection->id].size);
+ if (gFastSaveSection->checksum == checksum)
{
- v3 = gUnknown_03005EB0->counter;
- v4 |= 1 << gUnknown_03005EB0->id;
+ v3 = gFastSaveSection->counter;
+ v4 |= 1 << gFastSaveSection->id;
}
}
}
@@ -448,22 +481,22 @@ u8 sub_8125974(struct SaveSectionLocation *a1)
{
if ((unsigned)(v2 + 1) < (unsigned)(v3 + 1))
{
- gUnknown_03005EAC = v3;
+ gSaveCounter = v3;
}
else
{
- gUnknown_03005EAC = v2;
+ gSaveCounter = v2;
}
}
else
{
if (v2 < v3)
{
- gUnknown_03005EAC = v3;
+ gSaveCounter = v3;
}
else
{
- gUnknown_03005EAC = v2;
+ gSaveCounter = v2;
}
}
return 1;
@@ -471,7 +504,7 @@ u8 sub_8125974(struct SaveSectionLocation *a1)
if (v14 == 1)
{
- gUnknown_03005EAC = v2;
+ gSaveCounter = v2;
if (v10 == 255)
return 255;
return 1;
@@ -479,7 +512,7 @@ u8 sub_8125974(struct SaveSectionLocation *a1)
if (v10 == 1)
{
- gUnknown_03005EAC = v3;
+ gSaveCounter = v3;
if (v14 == 255)
return 255;
return 1;
@@ -487,13 +520,13 @@ u8 sub_8125974(struct SaveSectionLocation *a1)
if (v14 == 0 && v10 == 0)
{
- gUnknown_03005EAC = 0;
- gUnknown_03005E9C = 0;
+ gSaveCounter = 0;
+ gLastWrittenSector = 0;
return 0;
}
- gUnknown_03005EAC = 0;
- gUnknown_03005E9C = 0;
+ gSaveCounter = 0;
+ gLastWrittenSector = 0;
return 2;
}
@@ -502,9 +535,9 @@ u8 sub_8125B88(u8 a1, u8 *data, u16 size)
u16 i;
struct SaveSection *section = &unk_2000000;
sub_8125BF8(a1, section);
- if (section->unknown == 0x8012025)
+ if (section->security == UNKNOWN_CHECK_VALUE)
{
- u16 checksum = sub_8125C10(section->data, size);
+ u16 checksum = CalculateChecksum(section->data, size);
if (section->id == checksum)
{
for (i = 0; i < size; i++)
@@ -524,11 +557,11 @@ u8 sub_8125B88(u8 a1, u8 *data, u16 size)
u8 sub_8125BF8(u8 sector, struct SaveSection *section)
{
- ReadFlash(sector, 0, section->data, 0x1000);
+ ReadFlash(sector, 0, section->data, sizeof(struct SaveSection));
return 1;
}
-u16 sub_8125C10(void *data, u16 size)
+u16 CalculateChecksum(void *data, u16 size)
{
u16 i;
u32 checksum = 0;
@@ -539,37 +572,37 @@ u16 sub_8125C10(void *data, u16 size)
return ((checksum >> 16) + checksum);
}
-u8 sub_8125C3C(u8 a1)
+u8 HandleSavingData(u8 saveType)
{
u8 i;
- switch (a1)
+ switch (saveType)
{
- case 5:
+ case HOF_DELETE_SAVE: // deletes save before HOF case. unused
for (i = 28; i < 32; i++)
EraseFlashSector(i);
- case 3:
+ case HOF_SAVE: // hall of fame.
if (GetGameStat(10) < 999)
IncrementGameStat(10);
for (i = 0; i < 2; i++)
- sub_81253C8(28 + i, gHallOfFameSaveSectionLocations[i].data, gHallOfFameSaveSectionLocations[i].size);
+ HandleWriteSectorNBytes(28 + i, gHallOfFameSaveSectionLocations[i].data, gHallOfFameSaveSectionLocations[i].size);
SaveSerializedGame();
save_write_to_flash(0xFFFF, gSaveSectionLocations);
break;
- case 0:
+ case NORMAL_SAVE: // normal save.
default:
SaveSerializedGame();
save_write_to_flash(0xFFFF, gSaveSectionLocations);
break;
- case 1:
+ case LINK_SAVE: // link save. update only the pokemon, i think.
SaveSerializedGame();
for (i = 0; i < 5; i++)
save_write_to_flash(i, gSaveSectionLocations);
break;
- case 2:
+ case EREADER_SAVE: // used in mossdeep "game corner" before/after battling old man e-reader trainer
SaveSerializedGame();
save_write_to_flash(0, gSaveSectionLocations);
break;
- case 4:
+ case DIFFERENT_FILE_SAVE: // there is a different file, so erase the file and overwrite it completely.
for (i = 28; i < 32; i++)
EraseFlashSector(i);
SaveSerializedGame();
@@ -579,60 +612,60 @@ u8 sub_8125C3C(u8 a1)
return 0;
}
-u8 sub_8125D44(u8 a1)
+u8 TrySavingData(u8 saveType) // TrySave
{
- if (gUnknown_3004820 != 1)
+ if (gFlashMemoryPresent != TRUE)
return 0xFF;
- sub_8125C3C(a1);
- if (!gUnknown_03005EA8)
+ HandleSavingData(saveType);
+ if (!gDamagedSaveSectors)
return 1;
- DoSaveFailedScreen(a1);
+ DoSaveFailedScreen(saveType);
return 0xFF;
}
-u8 sub_8125D80(void)
+u8 sub_8125D80(void) // trade.s save
{
- if (gUnknown_3004820 != 1)
+ if (gFlashMemoryPresent != TRUE)
return 1;
SaveSerializedGame();
- sub_812546C(gSaveSectionLocations);
+ RestoreSaveBackupVarsAndIncrement(gSaveSectionLocations);
return 0;
}
-bool8 sub_8125DA8(void)
+bool8 sub_8125DA8(void) // trade.s save
{
- u8 v0 = sub_812550C(14, gSaveSectionLocations);
- if (gUnknown_03005EA8)
+ u8 retVal = sub_812550C(14, gSaveSectionLocations);
+ if (gDamagedSaveSectors)
DoSaveFailedScreen(0);
- if (v0 == 0xFF)
+ if (retVal == 0xFF)
return 1;
else
return 0;
}
-u8 sub_8125DDC(void)
+u8 sub_8125DDC(void) // trade.s save
{
sub_812556C(14, gSaveSectionLocations);
- if (gUnknown_03005EA8)
+ if (gDamagedSaveSectors)
DoSaveFailedScreen(0);
return 0;
}
-u8 sub_8125E04(void)
+u8 sub_8125E04(void) // trade.s save
{
sub_8125758(14, gSaveSectionLocations);
- if (gUnknown_03005EA8)
+ if (gDamagedSaveSectors)
DoSaveFailedScreen(0);
return 0;
}
u8 sub_8125E2C(void)
{
- if (gUnknown_3004820 != 1)
+ if (gFlashMemoryPresent != TRUE)
return 1;
SaveSerializedGame();
- sub_81254C8(gSaveSectionLocations);
+ RestoreSaveBackupVars(gSaveSectionLocations);
sub_812556C(gUnknown_03005EB4 + 1, gSaveSectionLocations);
return 0;
}
@@ -651,7 +684,7 @@ u8 sub_8125E6C(void)
sub_81257F0(val, gSaveSectionLocations);
retVal = 1;
}
- if (gUnknown_03005EA8)
+ if (gDamagedSaveSectors)
DoSaveFailedScreen(1);
return retVal;
}
@@ -660,7 +693,7 @@ u8 sub_8125EC8(u8 a1)
{
u8 result;
- if (gUnknown_3004820 != 1)
+ if (gFlashMemoryPresent != TRUE)
{
gSaveFileStatus = 4;
return 0xFF;
@@ -673,7 +706,7 @@ u8 sub_8125EC8(u8 a1)
result = sub_812587C(0xFFFF, gSaveSectionLocations);
LoadSerializedGame();
gSaveFileStatus = result;
- gUnknown_03005EBC = 0;
+ gGameContinueCallback = 0;
break;
case 3:
result = sub_8125B88(28, gHallOfFameSaveSectionLocations[0].data, gHallOfFameSaveSectionLocations[0].size);
@@ -690,12 +723,12 @@ bool8 unref_sub_8125F4C(struct UnkSaveSection *a1)
u16 i;
char *raw = (char *)a1;
- for (i = 0; i < 0x1000; i++)
+ for (i = 0; i < sizeof(struct SaveSection); i++)
raw[i] = 0;
- ReadFlash(gUnknown_08401E24[0], 0, a1->data, 4096);
+ ReadFlash(gFlashSectors[0], 0, a1->data, 4096);
- if (a1->unknown != 0x8012025)
+ if (a1->security != UNKNOWN_CHECK_VALUE)
return FALSE;
return TRUE;
@@ -704,10 +737,10 @@ bool8 unref_sub_8125F4C(struct UnkSaveSection *a1)
u8 unref_sub_8125FA0(void)
{
u16 i;
- u8 v0 = sub_8125D44(0);
+ u8 v0 = TrySavingData(0);
for (i = 0; i < 2; i++)
- EraseFlashSector(gUnknown_08401E24[i]);
+ EraseFlashSector(gFlashSectors[i]);
if (v0 == 255)
{
@@ -729,25 +762,25 @@ u8 unref_sub_8125FF0(u8 *data, u16 size)
u16 i;
struct UnkSaveSection *section = (struct UnkSaveSection *)&unk_2000000;
- for (i = 0; i < 0x1000; i++)
+ for (i = 0; i < sizeof(struct SaveSection); i++)
((char *)section)[i] = 0;
- section->unknown = 0x8012025;
+ section->security = UNKNOWN_CHECK_VALUE;
for (i = 0; i < size; i++)
section->data[i] = data[i];
- gUnknown_02039284 = ProgramFlashSectorAndVerifyNBytes(gUnknown_08401E24[0], (u8 *)section, 0x1000);
+ gLastSaveSectorStatus = ProgramFlashSectorAndVerifyNBytes(gFlashSectors[0], (u8 *)section, sizeof(struct SaveSection));
- if (gUnknown_02039284)
- return 255;
+ if (gLastSaveSectorStatus)
+ return 0xFF;
else
return 1;
}
u8 unref_sub_8126068(u8 sector, u8 *data, u32 size)
{
- if (ProgramFlashSectorAndVerify(sector, data, size))
+ if (ProgramFlashSectorAndVerify(sector, data))
return 255;
else
return 1;
@@ -755,6 +788,6 @@ u8 unref_sub_8126068(u8 sector, u8 *data, u32 size)
u8 unref_sub_8126080(u8 sector, u8 *data)
{
- ReadFlash(sector, 0, data, 0x1000);
+ ReadFlash(sector, 0, data, sizeof(struct SaveSection));
return 1;
}
diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c
index 2396aab15..dd0e1b966 100644
--- a/src/save_failed_screen.c
+++ b/src/save_failed_screen.c
@@ -1,14 +1,14 @@
#include "global.h"
+#include "asm.h"
+#include "gba/flash_internal.h"
+#include "m4a.h"
#include "main.h"
-#include "sprite.h"
+#include "menu.h"
#include "palette.h"
+#include "save.h"
+#include "sprite.h"
#include "task.h"
#include "text.h"
-#include "menu.h"
-#include "save.h"
-#include "m4a.h"
-#include "gba/flash_internal.h"
-#include "asm.h"
// In English 1.0, the text window is too small, causing text to overflow.
@@ -20,18 +20,19 @@
#define CLOCK_WIN_TOP (MSG_WIN_TOP - 4)
-struct SaveFailedStruct
+struct SaveFailedClockStruct
{
- u16 unk0;
- u16 unk2;
+ bool16 clockRunning;
+ u16 timer; // appears to be unused, the only case its "used" cannot be reached normally
+ u8 unused[0xE]; // appears to be unused space. alternatively, there could have been multiple clock structs. however, neither of these cases are fulfilled, so the purpose of this space is unknown. one theory is that there is room for 3 more clock structs (2 16-bit values), so its possible GF intended there to be support for link-based save failed screens in case the synchronization failed, or it in fact was present in an earlier build but taken out for reasons.
};
extern u8 unk_2000000[];
-extern u16 gUnknown_0203933C;
-extern struct SaveFailedStruct gUnknown_0203933E;
-extern u32 gUnknown_03005EA8;
-extern u32 gUnknown_03005EBC;
+extern u16 gSaveFailedType;
+extern struct SaveFailedClockStruct gSaveFailedClockInfo;
+extern u32 gDamagedSaveSectors;
+extern u32 gGameContinueCallback;
extern u8 gBirchHelpGfx[];
@@ -44,10 +45,7 @@ extern u8 gSystemText_GameplayEnded[];
extern u8 gBirchGrassTilemap[];
extern u8 gBirchBagTilemap[];
-
-extern const u8 gSaveFailedClockGfx[];
-extern const u8 gSaveFailedClockPal[];
-extern u8 gBirchBagGrassPal[];
+extern u8 gBirchBagGrassPal[0x40];
static const struct OamData sClockOamData =
{
@@ -78,6 +76,9 @@ static const u8 sClockFrames[8][3] =
{ 5, 1, 0 },
};
+static const u8 gSaveFailedClockPal[] = INCBIN_U8("graphics/misc/clock_small.gbapal");
+static const u8 gSaveFailedClockGfx[] = INCBIN_U8("graphics/misc/clock_small.4bpp.lz");
+
static void VBlankCB(void);
static void CB2_SaveFailedScreen(void);
static void CB2_WipeSave(void);
@@ -89,11 +90,11 @@ static bool8 VerifySectorWipe(u16 sector);
static bool8 WipeSector(u16 sector);
static bool8 WipeSectors(u32 sectorBits);
-void DoSaveFailedScreen(u8 var)
+void DoSaveFailedScreen(u8 saveType)
{
SetMainCallback2(CB2_SaveFailedScreen);
- gUnknown_0203933C = var;
- gUnknown_0203933E.unk0 = 0;
+ gSaveFailedType = saveType;
+ gSaveFailedClockInfo.clockRunning = FALSE;
}
static void VBlankCB(void)
@@ -107,7 +108,7 @@ static void CB2_SaveFailedScreen(void)
{
u16 ime;
- switch(gMain.state)
+ switch (gMain.state)
{
case 0:
default:
@@ -135,8 +136,8 @@ static void CB2_SaveFailedScreen(void)
ResetSpriteData();
ResetTasks();
ResetPaletteFade();
- LoadPalette(&gBirchBagGrassPal, 0, 0x40);
- LoadPalette(&gSaveFailedClockPal, 0x100, 0x20);
+ 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
@@ -169,11 +170,11 @@ static void CB2_WipeSave(void)
{
u8 wipeTries = 0;
- gUnknown_0203933E.unk0 = 1;
+ gSaveFailedClockInfo.clockRunning = TRUE;
- while (gUnknown_03005EA8 && wipeTries < 3)
+ while (gDamagedSaveSectors != 0 && wipeTries < 3) // while there are still attempts left, keep trying to fix the save sectors.
{
- if (WipeSectors(gUnknown_03005EA8))
+ if (WipeSectors(gDamagedSaveSectors) != FALSE)
{
MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19);
MenuPrint(gSystemText_BackupDamagedGameContinue, 2, MSG_WIN_TOP + 1);
@@ -183,9 +184,9 @@ static void CB2_WipeSave(void)
MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19);
MenuPrint(gSystemText_CheckCompleteSaveAttempt, 2, MSG_WIN_TOP + 1);
- sub_8125C3C(gUnknown_0203933C);
+ HandleSavingData(gSaveFailedType);
- if (gUnknown_03005EA8)
+ if (gDamagedSaveSectors != 0)
{
#ifdef BUGFIX_SAVEFAILEDSCREEN2
MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19);
@@ -206,9 +207,10 @@ static void CB2_WipeSave(void)
{
MenuDrawTextWindow(1, MSG_WIN_TOP, 28, 19);
- if (!gUnknown_03005EBC) // cant continue game.
+ // no callback exists, so the game cannot continue.
+ if (gGameContinueCallback == 0)
MenuPrint(gSystemText_SaveCompletedGameEnd, 2, MSG_WIN_TOP + 1);
- else // can continue game.
+ else // callback exists, so continue
MenuPrint(gSystemText_SaveCompletedPressA, 2, MSG_WIN_TOP + 1);
}
@@ -217,7 +219,7 @@ static void CB2_WipeSave(void)
static void CB2_GameplayCannotBeContinued(void)
{
- gUnknown_0203933E.unk0 = 0;
+ gSaveFailedClockInfo.clockRunning = FALSE;
if (gMain.newKeys & A_BUTTON)
{
@@ -230,13 +232,11 @@ static void CB2_GameplayCannotBeContinued(void)
static void CB2_FadeAndReturnToTitleScreen(void)
{
- u8 zero;
-
- gUnknown_0203933E.unk0 = zero = 0;
+ gSaveFailedClockInfo.clockRunning = FALSE;
if (gMain.newKeys & A_BUTTON)
{
- BeginNormalPaletteFade(0xFFFFFFFF, 0, zero, 16, 0);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
SetVBlankCallback(VBlankCB);
SetMainCallback2(CB2_ReturnToTitleScreen);
}
@@ -246,14 +246,14 @@ static void CB2_ReturnToTitleScreen(void)
{
if (!UpdatePaletteFade())
{
- if (!gUnknown_03005EBC)
+ if (gGameContinueCallback == 0) // no callback exists, so do a soft reset.
{
DoSoftReset();
}
else
{
- SetMainCallback2((MainCallback)gUnknown_03005EBC);
- gUnknown_03005EBC = 0;
+ SetMainCallback2((MainCallback)gGameContinueCallback);
+ gGameContinueCallback = 0;
}
}
}
@@ -266,7 +266,7 @@ static void VBlankCB_UpdateClockGraphics(void)
gMain.oamBuffer[0].x = 112;
gMain.oamBuffer[0].y = (CLOCK_WIN_TOP + 1) * 8;
- if (gUnknown_0203933E.unk0)
+ if (gSaveFailedClockInfo.clockRunning != FALSE)
{
gMain.oamBuffer[0].tileNum = sClockFrames[n][0];
gMain.oamBuffer[0].matrixNum = (sClockFrames[n][2] << 4) | (sClockFrames[n][1] << 3);
@@ -278,8 +278,8 @@ static void VBlankCB_UpdateClockGraphics(void)
CpuFastCopy(gMain.oamBuffer, (void *)OAM, 4);
- if (gUnknown_0203933E.unk2)
- gUnknown_0203933E.unk2--;
+ if (gSaveFailedClockInfo.timer) // maybe was used for debugging?
+ gSaveFailedClockInfo.timer--;
}
static bool8 VerifySectorWipe(u16 sector)
diff --git a/src/save_menu_util.c b/src/save_menu_util.c
index d2fda59d6..7899fabb1 100644
--- a/src/save_menu_util.c
+++ b/src/save_menu_util.c
@@ -1,10 +1,10 @@
#include "global.h"
#include "save_menu_util.h"
#include "asm.h"
-#include "menu.h"
#include "event_data.h"
-#include "string_util.h"
+#include "menu.h"
#include "pokedex.h"
+#include "string_util.h"
extern u8 gOtherText_Player[];
extern u8 gOtherText_Badges[];
@@ -15,7 +15,8 @@ void HandleDrawSaveWindowInfo(s16 left, s16 top)
{
u32 width = 12;
- if (sub_809473C())
+ // old handle for setting window width?
+ if (IsResizeSaveWindowEnabled())
width = 13;
if (FlagGet(SYS_POKEDEX_GET))
@@ -39,11 +40,12 @@ void HandleDrawSaveWindowInfo(s16 left, s16 top)
}
}
-void sub_80946C8(u16 left, u16 top)
+void HandleCloseSaveWindow(u16 left, u16 top)
{
u32 width = 12;
- if (sub_809473C())
+ // old handle for setting window width?
+ if (IsResizeSaveWindowEnabled())
width = 13;
if (FlagGet(SYS_POKEDEX_GET))
@@ -52,9 +54,14 @@ void sub_80946C8(u16 left, u16 top)
MenuZeroFillWindowRect(left, top, left + width, top + 9);
}
-u8 sub_809473C()
+/*
+theory: This function was used to handle the save menu window's width being auto sized from
+either 12 or 13 in an older source. Whatever was here might have either been optimized out by
+GF's compiler or was dummied out to always return a TRUE at some point.
+*/
+u8 IsResizeSaveWindowEnabled(void) // i don't know what else to name it..
{
- return 1;
+ return TRUE;
}
void PrintSavePlayerName(s16 x, s16 y)
@@ -74,22 +81,18 @@ void PrintSaveMapName(s16 x, s16 y)
void PrintSaveBadges(s16 x, s16 y)
{
char badges[16];
- u8 badgeCount;
MenuPrint(gOtherText_Badges, x, y);
- badgeCount = GetBadgeCount();
- ConvertIntToDecimalString(badges, badgeCount);
+ ConvertIntToDecimalString(badges, GetBadgeCount());
MenuPrint_RightAligned(badges, x + 12, y);
}
void PrintSavePokedexCount(s16 x, s16 y)
{
char pokedex[16];
- u16 pokedexCount;
MenuPrint(gOtherText_Pokedex, x, y);
- pokedexCount = GetPokedexSeenCount();
- ConvertIntToDecimalStringN(pokedex, pokedexCount, 1, 3);
+ ConvertIntToDecimalStringN(pokedex, GetPokedexSeenCount(), 1, 3);
MenuPrint_RightAligned(pokedex, x + 12, y);
}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index d3d28f923..b780cc6b4 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -1,28 +1,35 @@
#include "global.h"
#include "asm.h"
+#include "asm_fieldmap.h"
#include "battle_setup.h"
#include "berry.h"
+#include "coins.h"
+#include "decoration.h"
+#include "event_data.h"
+#include "field_effect.h"
+#include "field_message_box.h"
#include "field_player_avatar.h"
+#include "field_map_obj_helpers.h"
+#include "field_door.h"
#include "item.h"
-#include "script.h"
-#include "rng.h"
-#include "palette.h"
-#include "rtc.h"
-#include "pokemon.h"
-#include "asm_fieldmap.h"
#include "main.h"
+#include "map_obj_lock.h"
#include "menu.h"
#include "money.h"
-#include "decoration.h"
-#include "field_message_box.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "rng.h"
+#include "rom4.h"
+#include "rtc.h"
+#include "script.h"
#include "sound.h"
#include "string_util.h"
-#include "event_data.h"
-#include "rom4.h"
#include "weather.h"
-#include "map_obj_lock.h"
-#include "coins.h"
-#include "field_effect.h"
+#include "script_menu.h"
+#include "script_pokemon_80F9.h"
+#include "script_pokemon_80C4.h"
+#include "clock.h"
+#include "contest_painting.h"
typedef u16 (*SpecialFunc)(void);
typedef void (*NativeFunc)(void);
@@ -561,7 +568,7 @@ bool8 ScrCmd_darken(struct ScriptContext *ctx)
return FALSE;
}
-bool8 sub_8066248(void)
+bool8 IsPaletteNotActive(void)
{
if (!gPaletteFade.active)
return TRUE;
@@ -572,7 +579,7 @@ bool8 sub_8066248(void)
bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
{
fade_screen(ScriptReadByte(ctx), 0);
- SetupNativeScript(ctx, sub_8066248);
+ SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -581,7 +588,7 @@ bool8 ScrCmd_fadescreendelay(struct ScriptContext *ctx)
u8 duration = ScriptReadByte(ctx);
u8 delay = ScriptReadByte(ctx);
fade_screen(duration, delay);
- SetupNativeScript(ctx, sub_8066248);
+ SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -1170,7 +1177,7 @@ bool8 ScrCmd_closebutton(struct ScriptContext *ctx)
return FALSE;
}
-bool8 sub_80670C0()
+bool8 WaitForAorBPress(void)
{
if (gMain.newKeys & A_BUTTON)
return TRUE;
@@ -1181,7 +1188,7 @@ bool8 sub_80670C0()
bool8 ScrCmd_waitbutton(struct ScriptContext *ctx)
{
- SetupNativeScript(ctx, sub_80670C0);
+ SetupNativeScript(ctx, WaitForAorBPress);
return TRUE;
}
diff --git a/src/script_menu.c b/src/script_menu.c
index c4f0b5292..de3dd7269 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -1,44 +1,585 @@
#include "global.h"
-#include "task.h"
+#include "event_data.h"
#include "menu.h"
#include "palette.h"
#include "script.h"
#include "sound.h"
-#include "event_data.h"
#include "sprite.h"
+#include "task.h"
+#include "strings.h"
+#include "script_menu.h"
-struct MultichoiceListStruct
+// multichoice lists
+const struct MenuAction MultichoiceList_00[] =
{
- struct MenuAction *list;
- u8 count;
+ {(u8 *)OtherText_Petalburg, 0},
+ {(u8 *)OtherText_Slateport, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
};
-extern const struct MultichoiceListStruct gMultichoiceLists[];
+const struct MenuAction MultichoiceList_02[] =
+{
+ {(u8 *)OtherText_Enter, 0},
+ {(u8 *)OtherText_Info3, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
-extern u16 gScriptResult;
+const struct MenuAction MultichoiceList_03[] =
+{
+ {(u8 *)OtherText_WhatsAContest, 0},
+ {(u8 *)OtherText_TypesOfContest, 0},
+ {(u8 *)OtherText_Ranks, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
-extern void FreeResourcesAndDestroySprite(struct Sprite *sprite);
-extern u8 CreateMonSprite_PicBox(u16, s16, s16, u8);
-extern u8 sub_80B59AC(void);
+const struct MenuAction MultichoiceList_04[] =
+{
+ {(u8 *)OtherText_CoolContest, 0},
+ {(u8 *)OtherText_BeautyContest, 0},
+ {(u8 *)OtherText_CuteContest, 0},
+ {(u8 *)OtherText_SmartContest, 0},
+ {(u8 *)OtherText_ToughContest, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_06[] =
+{
+ {(u8 *)OtherText_Decoration, 0},
+ {(u8 *)OtherText_PackUp, 0},
+ {(u8 *)OtherText_Registry, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_05[] =
+{
+ {(u8 *)OtherText_Decoration, 0},
+ {(u8 *)OtherText_PackUp, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_07[] =
+{
+ {(u8 *)OtherText_Register, 0},
+ {(u8 *)OtherText_Registry, 0},
+ {(u8 *)OtherText_Information, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_12[] =
+{
+ {(u8 *)OtherText_Mach, 0},
+ {(u8 *)OtherText_Acro, 0},
+};
+
+const struct MenuAction MultichoiceList_13[] =
+{
+ {(u8 *)OtherText_Poison, 0},
+ {(u8 *)OtherText_Paralysis, 0},
+ {(u8 *)OtherText_Sleep, 0},
+ {(u8 *)OtherText_Burn, 0},
+ {(u8 *)OtherText_Frozen, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_14[] =
+{
+ {(u8 *)OtherText_Dewford, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_16[] =
+{
+ {(u8 *)OtherText_SawIt, 0},
+ {(u8 *)OtherText_NotYet, 0},
+};
+
+const struct MenuAction MultichoiceList_17[] =
+{
+ {(u8 *)OtherText_Yes, 0},
+ {(u8 *)OtherText_No, 0},
+ {(u8 *)OtherText_Info3, 0},
+};
+
+const struct MenuAction MultichoiceList_18[] =
+{
+ {(u8 *)OtherText_SingleBattle, 0},
+ {(u8 *)OtherText_DoubleBattle, 0},
+ {(u8 *)OtherText_MultiBattle, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_19[] =
+{
+ {(u8 *)OtherText_Littleroot, 0},
+ {(u8 *)OtherText_Slateport, 0},
+ {(u8 *)OtherText_Lilycove, 0},
+};
+
+const struct MenuAction MultichoiceList_20[] =
+{
+ {(u8 *)OtherText_Yes, 0},
+ {(u8 *)OtherText_No, 0},
+ {(u8 *)OtherText_Info3, 0},
+};
+
+const struct MenuAction MultichoiceList_23[] =
+{
+ {(u8 *)OtherText_MakeAChallenge, 0},
+ {(u8 *)OtherText_ObtainInformation, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_24[] =
+{
+ {(u8 *)OtherText_Lv50_2, 0},
+ {(u8 *)OtherText_Lv100_2, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_25[] =
+{
+ {(u8 *)OtherText_Zigzagoon, 0},
+ {(u8 *)OtherText_Nincada, 0},
+ {(u8 *)OtherText_Poochyena, 0},
+};
+
+const struct MenuAction MultichoiceList_26[] =
+{
+ {(u8 *)OtherText_Nincada2, 0},
+ {(u8 *)OtherText_Lotad, 0},
+ {(u8 *)OtherText_Roselia, 0},
+};
+
+const struct MenuAction MultichoiceList_27[] =
+{
+ {(u8 *)OtherText_Shroomish, 0},
+ {(u8 *)OtherText_Nincada3, 0},
+ {(u8 *)OtherText_Surskit, 0},
+};
+
+const struct MenuAction MultichoiceList_28[] =
+{
+ {(u8 *)OtherText_Treecko, 0},
+ {(u8 *)OtherText_Torchic, 0},
+ {(u8 *)OtherText_Mudkip, 0},
+};
+
+const struct MenuAction MultichoiceList_29[] =
+{
+ {(u8 *)OtherText_Seedot, 0},
+ {(u8 *)OtherText_Shroomish2, 0},
+ {(u8 *)OtherText_Spinda, 0},
+};
+
+const struct MenuAction MultichoiceList_30[] =
+{
+ {(u8 *)OtherText_Shroomish3, 0},
+ {(u8 *)OtherText_Zigzagoon2, 0},
+ {(u8 *)OtherText_Wurmple, 0},
+};
+
+const struct MenuAction MultichoiceList_31[] =
+{
+ {(u8 *)OtherText_PokeBall, 0},
+ {(u8 *)OtherText_SuperPotion, 0},
+ {(u8 *)OtherText_SamePrice, 0},
+};
+
+const struct MenuAction MultichoiceList_32[] =
+{
+ {(u8 *)OtherText_Yen135, 0},
+ {(u8 *)OtherText_Yen155, 0},
+ {(u8 *)OtherText_Yen175, 0},
+};
+
+const struct MenuAction MultichoiceList_33[] =
+{
+ {(u8 *)OtherText_CostMore, 0},
+ {(u8 *)OtherText_CostLess, 0},
+ {(u8 *)OtherText_SamePrice2, 0},
+};
+
+const struct MenuAction MultichoiceList_34[] =
+{
+ {(u8 *)OtherText_MaleSymbol, 0},
+ {(u8 *)OtherText_FemaleSymbol, 0},
+ {(u8 *)OtherText_Neither, 0},
+};
+
+const struct MenuAction MultichoiceList_35[] =
+{
+ {(u8 *)OtherText_Males, 0},
+ {(u8 *)OtherText_Females, 0},
+ {(u8 *)OtherText_SameNumber, 0},
+};
+
+const struct MenuAction MultichoiceList_36[] =
+{
+ {(u8 *)OtherText_Male, 0},
+ {(u8 *)OtherText_Female, 0},
+ {(u8 *)OtherText_ItDepends, 0},
+};
+
+const struct MenuAction MultichoiceList_37[] =
+{
+ {(u8 *)OtherText_Six2, 0},
+ {(u8 *)OtherText_Eight2, 0},
+ {(u8 *)OtherText_Ten, 0},
+};
+
+const struct MenuAction MultichoiceList_38[] =
+{
+ {(u8 *)OtherText_One, 0},
+ {(u8 *)OtherText_Two, 0},
+ {(u8 *)OtherText_Three, 0},
+};
+
+const struct MenuAction MultichoiceList_39[] =
+{
+ {(u8 *)OtherText_Six, 0},
+ {(u8 *)OtherText_Seven, 0},
+ {(u8 *)OtherText_Eight, 0},
+};
+
+const struct MenuAction MultichoiceList_42[] =
+{
+ {(u8 *)OtherText_FreshWater, 0},
+ {(u8 *)OtherText_SodaPop, 0},
+ {(u8 *)OtherText_Lemonade, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_43[] =
+{
+ {(u8 *)OtherText_HowToRide, 0},
+ {(u8 *)OtherText_HowToTurn, 0},
+ {(u8 *)OtherText_SandySlopes, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_44[] =
+{
+ {(u8 *)OtherText_Wheelies, 0},
+ {(u8 *)OtherText_BunnyHops, 0},
+ {(u8 *)OtherText_Jumping, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_45[] =
+{
+ {(u8 *)OtherText_Satisfied, 0},
+ {(u8 *)OtherText_Dissatisfied, 0},
+};
+
+const struct MenuAction MultichoiceList_46[] =
+{
+ {(u8 *)OtherText_Deepseatooth, 0},
+ {(u8 *)OtherText_Deepseascale, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_47[] =
+{
+ {(u8 *)OtherText_BlueFlute2, 0},
+ {(u8 *)OtherText_YellowFlute2, 0},
+ {(u8 *)OtherText_RedFlute2, 0},
+ {(u8 *)OtherText_WhiteFlute2, 0},
+ {(u8 *)OtherText_BlackFlute2, 0},
+ {(u8 *)OtherText_GlassChair, 0},
+ {(u8 *)OtherText_GlassDesk, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_48[] =
+{
+ {(u8 *)OtherText_TreeckoDoll, 0},
+ {(u8 *)OtherText_TorchicDoll, 0},
+ {(u8 *)OtherText_MudkipDoll, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_55[] =
+{
+ {(u8 *)OtherText_TM32, 0},
+ {(u8 *)OtherText_TM29, 0},
+ {(u8 *)OtherText_TM35, 0},
+ {(u8 *)OtherText_TM24, 0},
+ {(u8 *)OtherText_TM13, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_49[] =
+{
+ {(u8 *)OtherText_50Coins, 0},
+ {(u8 *)OtherText_500Coins, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_50[] =
+{
+ {(u8 *)OtherText_Excellent, 0},
+ {(u8 *)OtherText_NotSoHot, 0},
+};
+
+const struct MenuAction MultichoiceList_52[] =
+{
+ {(u8 *)OtherText_Lilycove, 0},
+ {(u8 *)OtherText_BattleTower, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_53[] =
+{
+ {(u8 *)OtherText_Slateport, 0},
+ {(u8 *)OtherText_Lilycove, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_54[] =
+{
+ {(u8 *)OtherText_Right, 0},
+ {(u8 *)OtherText_Left, 0},
+};
+
+const struct MenuAction MultichoiceList_56[] =
+{
+ {(u8 *)OtherText_Slateport, 0},
+ {(u8 *)OtherText_BattleTower, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_57[] =
+{
+ {(u8 *)OtherText_1F_2, 0},
+ {(u8 *)OtherText_2F_2, 0},
+ {(u8 *)OtherText_3F_2, 0},
+ {(u8 *)OtherText_4F_2, 0},
+ {(u8 *)OtherText_5F_2, 0},
+};
+
+const struct MenuAction MultichoiceList_58[] =
+{
+ {(u8 *)OtherText_RedShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_59[] =
+{
+ {(u8 *)OtherText_YellowShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_60[] =
+{
+ {(u8 *)OtherText_RedShard, 0},
+ {(u8 *)OtherText_YellowShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_61[] =
+{
+ {(u8 *)OtherText_BlueShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_62[] =
+{
+ {(u8 *)OtherText_RedShard, 0},
+ {(u8 *)OtherText_BlueShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_63[] =
+{
+ {(u8 *)OtherText_YellowShard, 0},
+ {(u8 *)OtherText_BlueShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_64[] =
+{
+ {(u8 *)OtherText_RedShard, 0},
+ {(u8 *)OtherText_YellowShard, 0},
+ {(u8 *)OtherText_BlueShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_65[] =
+{
+ {(u8 *)OtherText_GreenShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_66[] =
+{
+ {(u8 *)OtherText_RedShard, 0},
+ {(u8 *)OtherText_GreenShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_67[] =
+{
+ {(u8 *)OtherText_YellowShard, 0},
+ {(u8 *)OtherText_GreenShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_68[] =
+{
+ {(u8 *)OtherText_RedShard, 0},
+ {(u8 *)OtherText_YellowShard, 0},
+ {(u8 *)OtherText_GreenShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_69[] =
+{
+ {(u8 *)OtherText_BlueShard, 0},
+ {(u8 *)OtherText_GreenShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_70[] =
+{
+ {(u8 *)OtherText_RedShard, 0},
+ {(u8 *)OtherText_BlueShard, 0},
+ {(u8 *)OtherText_GreenShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_71[] =
+{
+ {(u8 *)OtherText_YellowShard, 0},
+ {(u8 *)OtherText_BlueShard, 0},
+ {(u8 *)OtherText_GreenShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_72[] =
+{
+ {(u8 *)OtherText_RedShard, 0},
+ {(u8 *)OtherText_YellowShard, 0},
+ {(u8 *)OtherText_BlueShard, 0},
+ {(u8 *)OtherText_GreenShard, 0},
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MenuAction MultichoiceList_01[] =
+{
+ {(u8 *)gOtherText_CancelNoTerminator, 0},
+};
+
+const struct MultichoiceListStruct gMultichoiceLists[] =
+{
+ {(struct MenuAction *)MultichoiceList_00, 3},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_02, 3},
+ {(struct MenuAction *)MultichoiceList_03, 4},
+ {(struct MenuAction *)MultichoiceList_04, 6},
+ {(struct MenuAction *)MultichoiceList_05, 3},
+ {(struct MenuAction *)MultichoiceList_06, 4},
+ {(struct MenuAction *)MultichoiceList_07, 4},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_12, 2},
+ {(struct MenuAction *)MultichoiceList_13, 6},
+ {(struct MenuAction *)MultichoiceList_14, 2},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_16, 2},
+ {(struct MenuAction *)MultichoiceList_17, 3},
+ {(struct MenuAction *)MultichoiceList_18, 4},
+ {(struct MenuAction *)MultichoiceList_19, 3},
+ {(struct MenuAction *)MultichoiceList_20, 3},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_23, 3},
+ {(struct MenuAction *)MultichoiceList_24, 3},
+ {(struct MenuAction *)MultichoiceList_25, 3},
+ {(struct MenuAction *)MultichoiceList_26, 3},
+ {(struct MenuAction *)MultichoiceList_27, 3},
+ {(struct MenuAction *)MultichoiceList_28, 3},
+ {(struct MenuAction *)MultichoiceList_29, 3},
+ {(struct MenuAction *)MultichoiceList_30, 3},
+ {(struct MenuAction *)MultichoiceList_31, 3},
+ {(struct MenuAction *)MultichoiceList_32, 3},
+ {(struct MenuAction *)MultichoiceList_33, 3},
+ {(struct MenuAction *)MultichoiceList_34, 3},
+ {(struct MenuAction *)MultichoiceList_35, 3},
+ {(struct MenuAction *)MultichoiceList_36, 3},
+ {(struct MenuAction *)MultichoiceList_37, 3},
+ {(struct MenuAction *)MultichoiceList_38, 3},
+ {(struct MenuAction *)MultichoiceList_39, 3},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_42, 4},
+ {(struct MenuAction *)MultichoiceList_43, 4},
+ {(struct MenuAction *)MultichoiceList_44, 4},
+ {(struct MenuAction *)MultichoiceList_45, 2},
+ {(struct MenuAction *)MultichoiceList_46, 3},
+ {(struct MenuAction *)MultichoiceList_47, 8},
+ {(struct MenuAction *)MultichoiceList_48, 4},
+ {(struct MenuAction *)MultichoiceList_49, 3},
+ {(struct MenuAction *)MultichoiceList_50, 2},
+ {(struct MenuAction *)MultichoiceList_01, 1},
+ {(struct MenuAction *)MultichoiceList_52, 3},
+ {(struct MenuAction *)MultichoiceList_53, 3},
+ {(struct MenuAction *)MultichoiceList_54, 2},
+ {(struct MenuAction *)MultichoiceList_55, 6},
+ {(struct MenuAction *)MultichoiceList_56, 3},
+ {(struct MenuAction *)MultichoiceList_57, 5},
+ {(struct MenuAction *)MultichoiceList_58, 2},
+ {(struct MenuAction *)MultichoiceList_59, 2},
+ {(struct MenuAction *)MultichoiceList_60, 3},
+ {(struct MenuAction *)MultichoiceList_61, 2},
+ {(struct MenuAction *)MultichoiceList_62, 3},
+ {(struct MenuAction *)MultichoiceList_63, 3},
+ {(struct MenuAction *)MultichoiceList_64, 4},
+ {(struct MenuAction *)MultichoiceList_65, 2},
+ {(struct MenuAction *)MultichoiceList_66, 3},
+ {(struct MenuAction *)MultichoiceList_67, 3},
+ {(struct MenuAction *)MultichoiceList_68, 4},
+ {(struct MenuAction *)MultichoiceList_69, 3},
+ {(struct MenuAction *)MultichoiceList_70, 4},
+ {(struct MenuAction *)MultichoiceList_71, 4},
+ {(struct MenuAction *)MultichoiceList_72, 5}
+};
+
+const struct TextStruct gUnknown_083CE048[] =
+{
+ OtherText_Cool2,
+ OtherText_Beauty3,
+ OtherText_Cute2,
+ OtherText_Smart2,
+ OtherText_Tough2,
+ OtherText_Normal,
+ OtherText_Super,
+ OtherText_Hyper,
+ OtherText_Master,
+ OtherText_Cool3,
+ OtherText_Beauty4,
+ OtherText_Cute3,
+ OtherText_Smart3,
+ OtherText_Tough3,
+ OtherText_Items,
+ OtherText_KeyItems,
+ OtherText_Balls,
+ OtherText_TMsHMs,
+ OtherText_Berries,
+};
-extern u8 gPCText_PlayersPC[];
-extern u8 gPCText_SomeonesPC[];
-extern u8 gPCText_HallOfFame[];
-extern u8 gPCText_LogOff[];
-extern u8 gPCText_LanettesPC[];
extern u8 gPCText_WhichPCShouldBeAccessed[];
-void DrawMultichoiceMenu(u8, u8, u8, struct MenuAction *list, u8, u8);
-void sub_80B53B4(u8, u8, u8, struct MenuAction *list, u8);
-void sub_80B52B4(u8);
-void sub_80B5230(u8, u8, u8, u8, u8, u8);
-void task_yes_no_maybe(u8);
-void sub_80B5684(u8);
-void CreatePCMenu(void);
+extern u16 gScriptResult;
+
+// field_effect
+extern void FreeResourcesAndDestroySprite(struct Sprite *sprite);
+extern u8 CreateMonSprite_PicBox(u16, s16, s16, u8);
bool8 sub_80B5054(u8 left, u8 top, u8 var3, u8 var4)
{
- if(FuncIsActiveTask(sub_80B52B4) == 1)
+ if (FuncIsActiveTask(sub_80B52B4) == 1)
return FALSE;
else
{
@@ -50,7 +591,7 @@ bool8 sub_80B5054(u8 left, u8 top, u8 var3, u8 var4)
bool8 sub_80B50B0(u8 left, u8 top, u8 var3, u8 var4, u8 var5)
{
- if(FuncIsActiveTask(sub_80B52B4) == 1)
+ if (FuncIsActiveTask(sub_80B52B4) == 1)
return FALSE;
else
{
@@ -60,7 +601,7 @@ bool8 sub_80B50B0(u8 left, u8 top, u8 var3, u8 var4, u8 var5)
}
}
-u16 GetStringWidthInTilesForScriptMenu(u8 *str)
+u16 GetStringWidthInTilesForScriptMenu(const u8 *str)
{
// each tile on screen is 8x8, so it needs the number of tiles and not pixels, hence the division by 8.
return (GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6CE4, str) + 7) / 8;
@@ -74,17 +615,17 @@ void DrawMultichoiceMenu(u8 left, u8 top, u8 count, struct MenuAction *list, u8
u8 right;
u8 bottom;
- for(i = 1; i < count; i++)
+ for (i = 1; i < count; i++)
{
newWidth = GetStringWidthInTilesForScriptMenu(list[i].text);
- if(width < newWidth)
+ if (width < newWidth)
width = newWidth;
}
right = width;
right = (right + left) + 1;
- if(right > 29)
+ if (right > 29)
{
left = left + (29 - right);
right = 29;
@@ -108,7 +649,7 @@ void sub_80B5230(u8 left, u8 top, u8 right, u8 bottom, u8 unkVar, u8 count)
gTasks[taskId].data[3] = bottom;
gTasks[taskId].data[4] = unkVar;
- if(count > 3)
+ if (count > 3)
gTasks[taskId].data[5] = TRUE;
else
gTasks[taskId].data[5] = FALSE;
@@ -118,18 +659,18 @@ void sub_80B52B4(u8 taskId)
{
s8 var;
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
- if(!gTasks[taskId].data[5])
+ if (!gTasks[taskId].data[5])
var = ProcessMenuInputNoWrap();
else
var = ProcessMenuInput();
- if(var != -2)
+ if (var != -2)
{
- if(var == -1)
+ if (var == -1)
{
- if(!gTasks[taskId].data[4])
+ if (!gTasks[taskId].data[4])
{
PlaySE(5);
gScriptResult = 127;
@@ -153,7 +694,7 @@ void sub_80B52B4(u8 taskId)
bool8 Multichoice(u8 var1, u8 var2, u8 var3, u8 var4)
{
- if(FuncIsActiveTask(sub_80B52B4) == 1)
+ if (FuncIsActiveTask(sub_80B52B4) == 1)
return FALSE;
else
{
@@ -171,10 +712,10 @@ void sub_80B53B4(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4)
u8 right;
u8 bottom;
- for(i = 1; i < count; i++)
+ for (i = 1; i < count; i++)
{
newWidth = GetStringWidthInTilesForScriptMenu(list[i].text);
- if(width < newWidth)
+ if (width < newWidth)
width = newWidth;
}
@@ -191,7 +732,7 @@ bool8 yes_no_box(u8 var1, u8 var2)
{
u8 taskId;
- if(FuncIsActiveTask(task_yes_no_maybe) == 1)
+ if (FuncIsActiveTask(task_yes_no_maybe) == 1)
return FALSE;
else
{
@@ -207,7 +748,7 @@ bool8 yes_no_box(u8 var1, u8 var2)
// unused
bool8 IsScriptActive(void)
{
- if(gScriptResult == 0xFF)
+ if (gScriptResult == 0xFF)
return FALSE;
else
return TRUE;
@@ -315,7 +856,7 @@ void sub_80B5684(u8 taskId)
bool8 TryCreatePCMenu(void)
{
- if(FuncIsActiveTask(sub_80B52B4) == 1)
+ if (FuncIsActiveTask(sub_80B52B4) == 1)
return FALSE;
else
{
@@ -331,12 +872,12 @@ void CreatePCMenu(void)
u8 width;
u8 numChoices;
- if(playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC))
+ if (playersPCWidth > GetStringWidthInTilesForScriptMenu(gPCText_SomeonesPC))
width = playersPCWidth;
else
width = 8;
- if(FlagGet(SYS_GAME_CLEAR)) // player has cleared game?
+ if (FlagGet(SYS_GAME_CLEAR)) // player has cleared game?
{
numChoices = 4;
MenuDrawTextWindow(0, 0, width + 2, 9);
@@ -350,7 +891,7 @@ void CreatePCMenu(void)
MenuPrint(gPCText_LogOff, 1, 5);
}
- if(FlagGet(SYS_PC_LANETTE)) // player met lanette?
+ if (FlagGet(SYS_PC_LANETTE)) // player met lanette?
MenuPrint(gPCText_LanettesPC, 1, 1);
else
MenuPrint(gPCText_SomeonesPC, 1, 1);
@@ -369,8 +910,8 @@ void sub_80B5838(void)
void task_picbox(u8 taskId)
{
struct Task *task = &gTasks[taskId];
-
- switch(task->data[0])
+
+ switch (task->data[0])
{
case 0:
task->data[0]++;
@@ -393,7 +934,7 @@ bool8 sub_80B58C4(u16 var1, u8 var2, u8 var3)
u8 taskId;
u8 var;
- if(FindTaskIdByFunc(task_picbox) != 0xFF)
+ if (FindTaskIdByFunc(task_picbox) != 0xFF)
return FALSE;
else
{
@@ -415,7 +956,7 @@ void *picbox_close(void)
{
u8 taskId = FindTaskIdByFunc(task_picbox);
- if(taskId == 0xFF)
+ if (taskId == 0xFF)
return NULL;
gTasks[taskId].data[0]++;
@@ -424,7 +965,7 @@ void *picbox_close(void)
bool8 sub_80B59AC(void)
{
- if(FindTaskIdByFunc(task_picbox) == 0xFF)
+ if (FindTaskIdByFunc(task_picbox) == 0xFF)
return TRUE;
else
return FALSE;
diff --git a/src/script_movement.c b/src/script_movement.c
new file mode 100644
index 000000000..dcd772d5f
--- /dev/null
+++ b/src/script_movement.c
@@ -0,0 +1,226 @@
+#include "global.h"
+#include "asm.h"
+#include "task.h"
+#include "field_map_obj_helpers.h"
+
+extern const u32 gBitTable[];
+extern u8 *gUnknown_020384F8[];
+
+extern void UnfreezeMapObject(struct MapObject *);
+extern bool8 FieldObjectIsSpecialAnimActive(struct MapObject *);
+
+static void sub_80A2198(u8);
+static u8 sub_80A21E0(void);
+static bool8 sub_80A21F4(u8, u8, u8 *);
+static u8 sub_80A2260(u8, u8);
+static bool8 sub_80A2370(u8, u8);
+static void sub_80A23C8(u8, u8, u8, u8 *);
+static void sub_80A2408(u8);
+static void Task_80A244C(u8);
+static void sub_80A2490(u8, u8, u8, u8 *);
+
+bool8 exec_movement(u8 a, u8 b, u8 c, u8 *d)
+{
+ u8 mapObjId;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId))
+ return TRUE;
+ if (!FuncIsActiveTask(Task_80A244C))
+ sub_80A2198(50);
+ return sub_80A21F4(sub_80A21E0(), mapObjId, d);
+}
+
+bool8 sub_80A212C(u8 a, u8 b, u8 c)
+{
+ u8 mapObjId;
+ u8 r4;
+ u8 r1;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(a, b, c, &mapObjId))
+ return 1;
+ r4 = sub_80A21E0();
+ r1 = sub_80A2260(r4, mapObjId);
+ if (r1 == 16)
+ return 1;
+ return sub_80A2370(r4, r1);
+}
+
+void sub_80A2178(void)
+{
+ u8 taskId;
+
+ taskId = sub_80A21E0();
+ if (taskId != 0xFF)
+ {
+ sub_80A2408(taskId);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80A2198(u8 priority)
+{
+ u8 taskId;
+ u8 i;
+
+ taskId = CreateTask(Task_80A244C, priority);
+ for (i = 1; i < 16; i++)
+ gTasks[taskId].data[i] = 0xFFFF;
+}
+
+static u8 sub_80A21E0(void)
+{
+ return FindTaskIdByFunc(Task_80A244C);
+}
+
+static bool8 sub_80A21F4(u8 taskId, u8 b, u8 *c)
+{
+ u8 r4;
+
+ r4 = sub_80A2260(taskId, b);
+ if (r4 != 16)
+ {
+ if (sub_80A2370(taskId, r4) == 0)
+ return TRUE;
+ else
+ {
+ sub_80A23C8(taskId, r4, b, c);
+ return FALSE;
+ }
+ }
+ r4 = sub_80A2260(taskId, 0xFF);
+ if (r4 == 16)
+ return TRUE;
+ else
+ {
+ sub_80A23C8(taskId, r4, b, c);
+ return FALSE;
+ }
+}
+
+static u8 sub_80A2260(u8 taskId, u8 b)
+{
+ u8 *ptr;
+ u8 i;
+
+ ptr = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < 16; i++, ptr++)
+ {
+ if (*ptr == b)
+ return i;
+ }
+ return 16;
+}
+
+static void sub_80A229C(u8 taskId, u8 b, u8 **c)
+{
+ u8 i;
+
+ *c = (u8 *)&gTasks[taskId].data[1];
+ for (i = 0; i < b; i++, (*c)++)
+ ;
+}
+
+static void sub_80A22D0(u8 taskId, u8 b, u8 c)
+{
+ u8 *ptr;
+
+ sub_80A229C(taskId, b, &ptr);
+ *ptr = c; //what is this supposed to do?
+}
+
+static void sub_80A22F4(u8 taskId, u8 b, u8 *c)
+{
+ u8 *ptr;
+
+ sub_80A229C(taskId, b, &ptr);
+ *c = *ptr;
+}
+
+static void sub_80A2318(u8 a, u8 b)
+{
+ u16 var = ~gBitTable[b];
+
+ gTasks[a].data[0] &= var;
+}
+
+static void sub_80A2348(u8 taskId, u8 b)
+{
+ gTasks[taskId].data[0] |= gBitTable[b];
+}
+
+static bool8 sub_80A2370(u8 taskId, u8 b)
+{
+ u16 var = (u16)gTasks[taskId].data[0] & gBitTable[b];
+
+ if (var != 0)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+static void npc_obj_offscreen_culling_and_flag_update(u8 a, u8 *b)
+{
+ gUnknown_020384F8[a] = b;
+}
+
+static u8 *sub_80A23B8(u8 a)
+{
+ return gUnknown_020384F8[a];
+}
+
+static void sub_80A23C8(u8 taskId, u8 b, u8 c, u8 *d)
+{
+ sub_80A2318(taskId, b);
+ npc_obj_offscreen_culling_and_flag_update(b, d);
+ sub_80A22D0(taskId, b, c);
+}
+
+static void sub_80A2408(u8 a)
+{
+ u8 *ptr;
+ u8 i;
+
+ ptr = (u8 *)&gTasks[a].data[1];
+ for (i = 0; i < 16; i++, ptr++)
+ {
+ if (*ptr != 0xFF)
+ UnfreezeMapObject(&gMapObjects[*ptr]);
+ }
+}
+
+static void Task_80A244C(u8 taskId)
+{
+ u8 i;
+ u8 var;
+
+ for (i = 0; i < 16; i++)
+ {
+ sub_80A22F4(taskId, i, &var);
+ if (var != 0xFF)
+ sub_80A2490(taskId, i, var, sub_80A23B8(i));
+ }
+}
+
+static void sub_80A2490(u8 taskId, u8 b, u8 c, u8 *d)
+{
+ u8 var;
+
+ if (FieldObjectIsSpecialAnimActive(&gMapObjects[c])
+ && !FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[c]))
+ return;
+
+ var = *d;
+ if (var == 0xFE)
+ {
+ sub_80A2348(taskId, b);
+ FreezeMapObject(&gMapObjects[c]);
+ }
+ else
+ {
+ if (!FieldObjectSetSpecialAnim(&gMapObjects[c], var))
+ {
+ d++;
+ npc_obj_offscreen_culling_and_flag_update(b, d);
+ }
+ }
+}
diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c
new file mode 100644
index 000000000..ba1545861
--- /dev/null
+++ b/src/script_pokemon_util_80C4BF0.c
@@ -0,0 +1,722 @@
+#include "global.h"
+#include "contest.h"
+#include "rom4.h"
+#include "main.h"
+#include "battle.h"
+#include "event_data.h"
+#include "pokemon.h"
+#include "task.h"
+#include "menu.h"
+#include "decompress.h"
+#include "link.h"
+#include "rng.h"
+#include "pokedex.h"
+#include "asm.h"
+#include "species.h"
+#include "berry.h"
+#include "items.h"
+#include "load_save.h"
+#include "script_pokemon_80C4.h"
+
+#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);
+extern void sub_80B2A7C(u8);
+extern void sub_80AAF30(void); // matsuda debug?
+extern u8 sub_80B2C4C(u8, u8);
+extern void CB2_ContestPainting(void);
+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);
+
+extern u8 gContestPlayerMonIndex;
+extern u8 gIsLinkContest;
+extern u8 gPlayerPartyCount;
+extern u8 gSelectedOrderFromParty[];
+
+extern u16 gSpecialVar_0x8004;
+extern u16 gSpecialVar_0x8005;
+extern u16 gSpecialVar_0x8006;
+
+extern u16 gScriptContestCategory;
+extern u16 gScriptContestRank;
+extern u16 gScriptResult;
+
+extern u32 gUnknown_03005D28;
+
+extern u8 gUnknown_02038694;
+extern u8 gUnknown_0203856C;
+extern u8 gUnknown_02038690[];
+extern u16 gUnknown_02038678[];
+
+void sub_80C4BF0(void)
+{
+ gSaveBlock1.vars[0x10] = gContestMons[0].unk16;
+ gSaveBlock1.vars[0x11] = gContestMons[1].unk16;
+ gSaveBlock1.vars[0x12] = gContestMons[2].unk16;
+}
+
+void sub_80C4C28(void)
+{
+ u16 var;
+ u8 specialVar = gSpecialVar_0x8005;
+
+ switch(specialVar)
+ {
+ case 0:
+ var = 3;
+ break;
+ case 1:
+ var = 4;
+ break;
+ case 2:
+ var = 5;
+ break;
+ default:
+ var = 100;
+ break;
+ }
+ gSpecialVar_0x8004 = var;
+}
+
+void sub_80C4C64(void)
+{
+ sub_80C46EC();
+ sub_80C4740();
+ sub_80C48F4();
+}
+
+void sub_80C4C78(void)
+{
+ u16 var;
+ u16 returnVar;
+
+ 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;
+ }
+
+ returnVar = gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[var].var;
+
+ if(returnVar == 0)
+ gSpecialVar_0x8004 = returnVar;
+ else
+ gSpecialVar_0x8004 = 1;
+}
+
+void sub_80C4CEC(void)
+{
+ sub_80B2A7C(0xFF);
+}
+
+void sub_80C4CF8(void)
+{
+ if(!gUnknown_02038690[gContestPlayerMonIndex]
+ && gScriptContestRank == 3
+ && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800)
+ {
+ gSpecialVar_0x8004 = 1;
+ }
+ else
+ {
+ gSpecialVar_0x8004 = 0;
+ }
+}
+
+u8 sub_80C4D50(void)
+{
+ u8 retVar = 0;
+ int i;
+
+ for (i = 0; i < 5; i++)
+ if (gSaveBlock1.sbStruct.unkSB2.sb1_2EFC_struct2[i + 8].var)
+ retVar++;
+
+ return retVar;
+}
+
+// nope. too hard
+__attribute__((naked))
+void sub_80C4D80(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, 0x8\n\
+ ldr r0, _080C4EA0 @ =gUnknown_02038670\n\
+ mov r12, r0\n\
+ ldr r1, _080C4EA4 @ =gSpecialVar_0x8006\n\
+ mov r8, r1\n\
+ ldr r2, _080C4EA8 @ =gStringVar1\n\
+ mov r9, r2\n\
+ mov r2, r12\n\
+ mov r1, sp\n\
+ movs r6, 0x3\n\
+_080C4D9E:\n\
+ ldrh r0, [r2]\n\
+ strh r0, [r1]\n\
+ adds r2, 0x2\n\
+ adds r1, 0x2\n\
+ subs r6, 0x1\n\
+ cmp r6, 0\n\
+ bge _080C4D9E\n\
+ movs r6, 0\n\
+_080C4DAE:\n\
+ movs r1, 0x3\n\
+ cmp r1, r6\n\
+ ble _080C4DD8\n\
+_080C4DB4:\n\
+ subs r4, r1, 0x1\n\
+ lsls r0, r4, 1\n\
+ mov r5, sp\n\
+ adds r3, r5, r0\n\
+ lsls r0, r1, 1\n\
+ adds r2, r5, r0\n\
+ ldrh r5, [r3]\n\
+ movs r7, 0\n\
+ ldrsh r1, [r3, r7]\n\
+ movs r7, 0\n\
+ ldrsh r0, [r2, r7]\n\
+ cmp r1, r0\n\
+ bge _080C4DD2\n\
+ strh r5, [r2]\n\
+ strh r0, [r3]\n\
+_080C4DD2:\n\
+ adds r1, r4, 0\n\
+ cmp r1, r6\n\
+ bgt _080C4DB4\n\
+_080C4DD8:\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x2\n\
+ ble _080C4DAE\n\
+ mov r2, r8\n\
+ ldrh r0, [r2]\n\
+ lsls r0, 1\n\
+ add r0, sp\n\
+ ldrh r0, [r0]\n\
+ movs r2, 0\n\
+ movs r7, 0\n\
+ movs r6, 0\n\
+ lsls r0, 16\n\
+ asrs r4, r0, 16\n\
+ adds r3, r0, 0\n\
+ mov r1, sp\n\
+_080C4DF6:\n\
+ movs r5, 0\n\
+ ldrsh r0, [r1, r5]\n\
+ cmp r0, r4\n\
+ bne _080C4E12\n\
+ lsls r0, r2, 24\n\
+ movs r2, 0x80\n\
+ lsls r2, 17\n\
+ adds r0, r2\n\
+ lsrs r2, r0, 24\n\
+ mov r5, r8\n\
+ ldrh r5, [r5]\n\
+ cmp r6, r5\n\
+ bne _080C4E12\n\
+ adds r7, r2, 0\n\
+_080C4E12:\n\
+ adds r1, 0x2\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x3\n\
+ ble _080C4DF6\n\
+ movs r6, 0\n\
+ mov r0, sp\n\
+ movs r1, 0\n\
+ ldrsh r0, [r0, r1]\n\
+ asrs r1, r3, 16\n\
+ lsls r2, 24\n\
+ mov r10, r2\n\
+ cmp r0, r1\n\
+ beq _080C4E40\n\
+ adds r2, r1, 0\n\
+ mov r1, sp\n\
+_080C4E30:\n\
+ adds r1, 0x2\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x3\n\
+ bgt _080C4E40\n\
+ movs r4, 0\n\
+ ldrsh r0, [r1, r4]\n\
+ cmp r0, r2\n\
+ bne _080C4E30\n\
+_080C4E40:\n\
+ lsls r0, r6, 24\n\
+ lsrs r4, r0, 24\n\
+ adds r2, r7, 0\n\
+ movs r6, 0\n\
+ asrs r5, r3, 16\n\
+ mov r8, r5\n\
+ mov r1, r12\n\
+ movs r5, 0\n\
+ ldrsh r0, [r1, r5]\n\
+ cmp r8, r0\n\
+ bne _080C4E60\n\
+ cmp r7, 0x1\n\
+ beq _080C4E78\n\
+_080C4E5A:\n\
+ subs r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+_080C4E60:\n\
+ adds r6, 0x1\n\
+ cmp r6, 0x3\n\
+ bgt _080C4E78\n\
+ lsls r0, r6, 1\n\
+ add r0, r12\n\
+ asrs r1, r3, 16\n\
+ movs r5, 0\n\
+ ldrsh r0, [r0, r5]\n\
+ cmp r1, r0\n\
+ bne _080C4E60\n\
+ cmp r2, 0x1\n\
+ bne _080C4E5A\n\
+_080C4E78:\n\
+ lsls r1, r6, 24\n\
+ lsrs r1, 24\n\
+ mov r0, r9\n\
+ bl sub_80C4698\n\
+ ldr r0, _080C4EAC @ =gIsLinkContest\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080C4EB8\n\
+ ldr r0, _080C4EB0 @ =gStringVar2\n\
+ lsls r1, r6, 3\n\
+ subs r1, r6\n\
+ lsls r1, 2\n\
+ ldr r2, _080C4EB4 @ =gLinkPlayers + 0x8\n\
+ adds r1, r2\n\
+ bl sub_80C4674\n\
+ b _080C4EC4\n\
+ .align 2, 0\n\
+_080C4EA0: .4byte gUnknown_02038670\n\
+_080C4EA4: .4byte gSpecialVar_0x8006\n\
+_080C4EA8: .4byte gStringVar1\n\
+_080C4EAC: .4byte gIsLinkContest\n\
+_080C4EB0: .4byte gStringVar2\n\
+_080C4EB4: .4byte gLinkPlayers + 0x8\n\
+_080C4EB8:\n\
+ ldr r0, _080C4ED8 @ =gStringVar2\n\
+ lsls r1, r6, 6\n\
+ ldr r2, _080C4EDC @ =gUnknown_0203857D\n\
+ adds r1, r2\n\
+ bl sub_80C4674\n\
+_080C4EC4:\n\
+ mov r1, r10\n\
+ asrs r0, r1, 24\n\
+ cmp r0, 0x1\n\
+ beq _080C4ED0\n\
+ cmp r7, r0\n\
+ bne _080C4EE4\n\
+_080C4ED0:\n\
+ ldr r0, _080C4EE0 @ =gSpecialVar_0x8006\n\
+ strh r4, [r0]\n\
+ b _080C4EEA\n\
+ .align 2, 0\n\
+_080C4ED8: .4byte gStringVar2\n\
+_080C4EDC: .4byte gUnknown_0203857D\n\
+_080C4EE0: .4byte gSpecialVar_0x8006\n\
+_080C4EE4:\n\
+ ldr r1, _080C4EFC @ =gSpecialVar_0x8006\n\
+ adds r0, r4, 0x4\n\
+ strh r0, [r1]\n\
+_080C4EEA:\n\
+ add sp, 0x8\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\
+_080C4EFC: .4byte gSpecialVar_0x8006\n\
+ .syntax divided");
+}
+
+void ShowContestWinnerCleanup(void)
+{
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+}
+
+void ShowContestWinner(void)
+{
+ if(gUnknown_0203856C)
+ {
+ sub_80AAF30();
+ BATTLE_STRUCT->unk15DDF = 1;
+ BATTLE_STRUCT->unk15DDE = sub_80B2C4C(254, 0);
+ sub_80B2A7C(3);
+ gUnknown_0203856C = 0;
+ }
+ SetMainCallback2(CB2_ContestPainting);
+ gMain.savedCallback = ShowContestWinnerCleanup;
+}
+
+void sub_80C4F70(void)
+{
+ VarSet(0x4010, gContestMons[0].unk16);
+ VarSet(0x4011, gContestMons[1].unk16);
+ VarSet(0x4012, gContestMons[2].unk16);
+ VarSet(0x4013, gContestMons[3].unk16);
+}
+
+bool8 GiveMonArtistRibbon(void)
+{
+ u8 ribbon = GetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON);
+
+ if(ribbon == FALSE
+ && gUnknown_02038690[gContestPlayerMonIndex] == 0
+ && gScriptContestRank == 3
+ && (s16)gUnknown_02038678[gContestPlayerMonIndex] >= 800)
+ {
+ ribbon = TRUE;
+ SetMonData(&gPlayerParty[gUnknown_02038694], MON_DATA_ARTIST_RIBBON, &ribbon);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+u8 sub_80C5044(void)
+{
+ return gUnknown_0203856C;
+}
+
+void ShowContestEntryMonPic(void)
+{
+ struct SpritePalette *paletteData;
+ u32 var1, var2;
+ u16 species;
+ u8 spriteId;
+ u8 taskId;
+
+ if(FindTaskIdByFunc(sub_80C5190) == 0xFF)
+ {
+ u8 left = CONTEST_ENTRY_PIC_LEFT;
+ u8 top = CONTEST_ENTRY_PIC_TOP;
+
+ MenuDrawTextWindow(left, top, 19, 13);
+ species = gContestMons[gSpecialVar_0x8006].species;
+ var1 = gContestMons[gSpecialVar_0x8006].unk38; // v2
+ var2 = gContestMons[gSpecialVar_0x8006].unk3C; // v3
+ taskId = CreateTask(sub_80C5190, 0x50);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = species;
+ HandleLoadSpecialPokePic((struct SpriteSheet *)&gMonFrontPicTable[species].data,
+ gMonFrontPicCoords[species].x, gMonFrontPicCoords[species].y,
+ (u32)gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], species, var1);
+ paletteData = sub_80409C8(species, var2, var1);
+ LoadCompressedObjectPalette(paletteData);
+ GetMonSpriteTemplate_803C56C(species, 1);
+ gUnknown_02024E8C.paletteTag = paletteData->tag;
+ spriteId = CreateSprite(&gUnknown_02024E8C, 0x78, 0x40, 0);
+ gTasks[taskId].data[2] = spriteId;
+ gTasks[taskId].data[3] = left;
+ gTasks[taskId].data[4] = top;
+ gSprites[spriteId].callback = SpriteCallbackDummy;
+ gSprites[spriteId].oam.priority = 0;
+ }
+}
+
+void sub_80C5164(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80C5190);
+
+ if(taskId != 0xFF)
+ gTasks[taskId].data[0]++;
+}
+
+void sub_80C5190(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ struct Sprite *sprite;
+
+ 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;
+ }
+}
+
+void ScriptGetMultiplayerId(void)
+{
+ if(gIsLinkContest & 1)
+ gScriptResult = GetMultiplayerId();
+ else
+ gScriptResult = 4;
+}
+
+void ScriptRandom(void)
+{
+ u16 random;
+ u16 *scriptPtr;
+
+ if(gIsLinkContest & 1)
+ {
+ gUnknown_03005D28 = 1103515245 * gUnknown_03005D28 + 24691;
+ random = gUnknown_03005D28 >> 16;
+ scriptPtr = &gScriptResult;
+ }
+ else
+ {
+ scriptPtr = &gScriptResult;
+ random = Random();
+ }
+ *scriptPtr = random % *scriptPtr;
+}
+
+void HealPlayerParty(void)
+{
+ u8 i, j;
+ u8 ppBonuses;
+ u8 arg[4];
+
+ // restore HP.
+ for(i = 0; i < gPlayerPartyCount; i++)
+ {
+ u16 maxHP = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
+ arg[0] = maxHP;
+ arg[1] = maxHP >> 8;
+ SetMonData(&gPlayerParty[i], MON_DATA_HP, arg);
+ ppBonuses = GetMonData(&gPlayerParty[i], MON_DATA_PP_BONUSES);
+
+ // restore PP.
+ for(j = 0; j < 4; j++)
+ {
+ arg[0] = CalculatePPWithBonus(GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + j), ppBonuses, j);
+ SetMonData(&gPlayerParty[i], MON_DATA_PP1 + j, arg);
+ }
+
+ // since status is u32, the four 0 assignments here are probably for safety to prevent undefined data from reaching SetMonData.
+ arg[0] = 0;
+ arg[1] = 0;
+ arg[2] = 0;
+ arg[3] = 0;
+ SetMonData(&gPlayerParty[i], MON_DATA_STATUS, arg);
+ }
+}
+
+u8 ScriptGiveMon(u16 species, u8 var, u16 item, u32 var3, u32 var4, u8 var5)
+{
+ u16 nationalSpecies;
+ int sentToPc;
+ u8 array[2];
+ struct Pokemon mon;
+
+ CreateMon(&mon, species, var, 32, 0, 0, 0, 0);
+ array[0] = item;
+ array[1] = item >> 8;
+ SetMonData(&mon, MON_DATA_HELD_ITEM, array);
+ sentToPc = GiveMonToPlayer(&mon);
+ nationalSpecies = SpeciesToNationalPokedexNum(species);
+
+ // nested if check to fool compiler
+ if(sentToPc < 2)
+ {
+ if(sentToPc >= 0)
+ {
+ // set both the seen and caught flags
+ sub_8090D90(nationalSpecies, 2);
+ sub_8090D90(nationalSpecies, 3);
+ }
+ }
+ return sentToPc;
+}
+
+u8 ScriptGiveEgg(u16 value)
+{
+ struct Pokemon mon;
+ u8 data;
+
+ sub_8042044(&mon, value, 1);
+ data = 1;
+ SetMonData(&mon, MON_DATA_IS_EGG, &data);
+
+ return GiveMonToPlayer(&mon);
+}
+
+void CheckForAlivePartyMons(void)
+{
+ u8 var = sub_803DAA0();
+
+ switch(var)
+ {
+ case 1:
+ gScriptResult = var;
+ break;
+ case 0:
+ gScriptResult = var;
+ break;
+ case 2:
+ gScriptResult = var;
+ break;
+ }
+}
+
+bool8 CheckPartyMonHasHeldItem(u16 item)
+{
+ int i;
+
+ for(i = 0; i < 6; i++)
+ {
+ u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
+ if(species != SPECIES_NONE && species != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == item)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 GetNameOfEnigmaBerryInPlayerParty(void)
+{
+ bool8 hasItem = CheckPartyMonHasHeldItem(ITEM_ENIGMA_BERRY);
+
+ if(hasItem == TRUE)
+ GetBerryNameByBerryType(ItemIdToBerryType(ITEM_ENIGMA_BERRY), gStringVar1);
+
+ return hasItem;
+}
+
+void ScriptWildBattle(u16 species, u8 level, u16 item)
+{
+ u8 data[2];
+
+ ZeroEnemyPartyMons();
+ CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0);
+
+ if(item)
+ {
+ data[0] = item;
+ data[1] = item >> 8;
+ SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, data);
+ }
+}
+
+void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot)
+{
+ if(monIndex > 6)
+ monIndex = gPlayerPartyCount - 1;
+
+ SetMonMoveSlot(&gPlayerParty[monIndex], move, slot);
+}
+
+void sub_80C5568(void)
+{
+ gMain.savedCallback = sub_80C5580;
+ sub_8121E10();
+}
+
+void sub_80C5580(void)
+{
+ u8 var = gSelectedOrderFromParty[0];
+
+ switch(var)
+ {
+ case 0:
+ gScriptResult = 0;
+ break;
+ default:
+ gScriptResult = 1;
+ break;
+ }
+
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+}
+
+void ChooseBattleTowerPlayerParty(void)
+{
+ gMain.savedCallback = SetBattleTowerPlayerParty;
+ sub_8121E34();
+}
+
+void SetBattleTowerPlayerParty(void)
+{
+ u8 var = gSelectedOrderFromParty[0];
+
+ switch(var)
+ {
+ 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);
+}
+
+void ReducePlayerPartyToThree(void)
+{
+ struct Pokemon party[3];
+ int i;
+
+ CpuFill32(0, party, sizeof party);
+
+ // copy the selected pokemon according to the order.
+ for(i = 0; i < 3; i++)
+ if(gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop
+ party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal
+
+ // delete the last 3 pokemon
+ CpuFill32(0, gPlayerParty, sizeof gPlayerParty);
+
+ // overwrite the first 3 with the order copied to.
+ for(i = 0; i < 3; i++)
+ gPlayerParty[i] = party[i];
+
+ CalculatePlayerPartyCount();
+}
diff --git a/src/script_pokemon_util_80F99CC.c b/src/script_pokemon_util_80F99CC.c
new file mode 100644
index 000000000..1a848c665
--- /dev/null
+++ b/src/script_pokemon_util_80F99CC.c
@@ -0,0 +1,455 @@
+#include "global.h"
+#include "script.h"
+#include "task.h"
+#include "palette.h"
+#include "battle_party_menu.h"
+#include "sound.h"
+#include "asm.h"
+#include "rom4.h"
+#include "pokemon.h"
+#include "text.h"
+#include "string_util.h"
+#include "script_pokemon_80F9.h"
+
+extern u8 gPlayerPartyCount;
+extern u16 gSpecialVar_0x8004;
+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);
+extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *);
+extern void LoadHeldItemIconGraphics(void);
+extern void CreateHeldItemIcons_806DC34(); // undefined args
+extern u8 sub_806BD58(u8, u8);
+extern void PartyMenuPrintMonsLevelOrStatus(void);
+extern void PrintPartyMenuMonNicknames(void);
+extern u8 sub_806B58C(u8);
+extern u8 sub_80AE47C(struct Pokemon *party);
+extern void sub_806BC3C(u8, u8);
+extern u16 sub_806BD80(); // undefined args in battle_party_menu.c
+extern u8 sub_806CA38();
+extern void sub_8123138(u8);
+extern u8 sub_8040574(struct Pokemon *party);
+extern void sub_809D9F0(struct Pokemon *party, u8, u8, void *, u32);
+
+void sub_80F99CC(void)
+{
+ u8 taskId;
+
+ ScriptContext2_Enable();
+ taskId = CreateTask((void *)sub_80F9A8C, 0xA);
+ gTasks[taskId].data[0] = 2;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+}
+
+void sub_80F9A0C(void)
+{
+ u8 taskId;
+
+ ScriptContext2_Enable();
+ taskId = CreateTask((void *)sub_80F9A8C, 0xA);
+ gTasks[taskId].data[0] = 3;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+}
+
+void sub_80F9A4C(void)
+{
+ u8 taskId;
+
+ ScriptContext2_Enable();
+ taskId = CreateTask((void *)sub_80F9A8C, 0xA);
+ gTasks[taskId].data[0] = 7;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+}
+
+void sub_80F9A8C(u8 taskId)
+{
+ if(!gPaletteFade.active)
+ {
+ gPaletteFade.bufferTransferDisabled = 1;
+ OpenPartyMenu(gTasks[taskId].data[0], 0);
+ DestroyTask(taskId);
+ }
+}
+
+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();
+ 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;
+ }
+ else
+ {
+ EWRAM_1B000.unk266 = 0;
+ EWRAM_1B000.unk264 = 0;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void sub_80F9C00(void)
+{
+ u8 i;
+
+ for(i = 0; i < gPlayerPartyCount; i++)
+ {
+ 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;
+ }
+ }
+}
+
+void sub_80F9C6C(u8 var)
+{
+ if(!gPaletteFade.active)
+ {
+ 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;
+ }
+ }
+}
+
+bool8 sub_80F9CE8(void) // this is the same function as sub_80F9ACC except case 6 calls a different function. why
+{
+ 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();
+ 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;
+ }
+ else
+ {
+ EWRAM_1B000.unk266 = 0;
+ EWRAM_1B000.unk264 = 0;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void sub_80F9E1C(void)
+{
+ u8 i;
+
+ for(i = 0; i < gPlayerPartyCount; i++)
+ {
+ if(!sub_8040574(&gPlayerParty[i]))
+ sub_806BC3C(i, 0x9A);
+ else
+ sub_806BC3C(i, 0x8C);
+ }
+}
+
+void sub_80F9E64(u8 var)
+{
+ if(!gPaletteFade.active)
+ {
+ 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);
+ }
+ }
+}
+
+void sub_80F9EEC(void)
+{
+ sub_809D9F0(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0);
+ unk_2018000.unk8 = 3;
+ gUnknown_0300485C = sub_8080990;
+}
+
+void sub_80F9F3C(void) // count pokemon moves
+{
+ u8 i;
+
+ gScriptResult = 0;
+
+ for(i = 0; i < 4; i++) // checks MOVE1-MOVE4
+ if(GetMonData(&gPlayerParty[gSpecialVar_0x8004], i + 13))
+ gScriptResult++;
+}
+
+void sub_80F9F84(void)
+{
+ struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004];
+ u16 data = GetMonData(party, gSpecialVar_0x8005 + 13);
+
+ GetMonNickname(party, gStringVar1);
+ StringCopy(gStringVar2, gMoveNames[data]);
+}
+
+// no. hard
+__attribute__((naked))
+void sub_80F9FDC(struct Pokemon *party, u8 var, u8 var2)
+{
+ 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, 0x20\n\
+ mov r8, r0\n\
+ adds r5, r1, 0\n\
+ adds r4, r2, 0\n\
+ lsls r5, 24\n\
+ lsrs r5, 24\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ adds r0, r5, 0\n\
+ adds r0, 0xD\n\
+ str r0, [sp, 0x8]\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0x8]\n\
+ bl GetMonData\n\
+ mov r1, sp\n\
+ adds r1, 0x2\n\
+ str r1, [sp, 0x14]\n\
+ strh r0, [r1]\n\
+ adds r3, r4, 0\n\
+ adds r3, 0xD\n\
+ str r3, [sp, 0xC]\n\
+ mov r0, r8\n\
+ adds r1, r3, 0\n\
+ bl GetMonData\n\
+ mov r1, sp\n\
+ strh r0, [r1]\n\
+ adds r7, r5, 0\n\
+ adds r7, 0x11\n\
+ str r7, [sp, 0x10]\n\
+ mov r0, r8\n\
+ adds r1, r7, 0\n\
+ bl GetMonData\n\
+ mov r1, sp\n\
+ adds r1, 0x5\n\
+ str r1, [sp, 0x18]\n\
+ strb r0, [r1]\n\
+ adds r3, r4, 0\n\
+ adds r3, 0x11\n\
+ str r3, [sp, 0x1C]\n\
+ mov r0, r8\n\
+ adds r1, r3, 0\n\
+ bl GetMonData\n\
+ add r7, sp, 0x4\n\
+ mov r10, r7\n\
+ strb r0, [r7]\n\
+ mov r0, r8\n\
+ movs r1, 0x15\n\
+ bl GetMonData\n\
+ mov r6, sp\n\
+ adds r6, 0x6\n\
+ strb r0, [r6]\n\
+ ldr r1, _080FA0D8 @ =gUnknown_08208238\n\
+ adds r0, r5, r1\n\
+ ldrb r0, [r0]\n\
+ mov r9, r0\n\
+ ldrb r0, [r6]\n\
+ adds r2, r0, 0\n\
+ mov r3, r9\n\
+ ands r2, r3\n\
+ lsls r5, 1\n\
+ asrs r2, r5\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ adds r1, r4, r1\n\
+ ldrb r3, [r1]\n\
+ adds r1, r0, 0\n\
+ ands r1, r3\n\
+ lsls r4, 1\n\
+ asrs r1, r4\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ mov r7, r9\n\
+ bics r0, r7\n\
+ strb r0, [r6]\n\
+ ldrb r0, [r6]\n\
+ bics r0, r3\n\
+ strb r0, [r6]\n\
+ lsls r2, r4\n\
+ lsls r1, r5\n\
+ adds r2, r1\n\
+ ldrb r0, [r6]\n\
+ orrs r0, r2\n\
+ strb r0, [r6]\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0x8]\n\
+ mov r2, sp\n\
+ bl SetMonData\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0xC]\n\
+ ldr r2, [sp, 0x14]\n\
+ bl SetMonData\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0x10]\n\
+ mov r2, r10\n\
+ bl SetMonData\n\
+ mov r0, r8\n\
+ ldr r1, [sp, 0x1C]\n\
+ ldr r2, [sp, 0x18]\n\
+ bl SetMonData\n\
+ mov r0, r8\n\
+ movs r1, 0x15\n\
+ adds r2, r6, 0\n\
+ bl SetMonData\n\
+ add sp, 0x20\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\
+_080FA0D8: .4byte gUnknown_08208238\n\
+ .syntax divided");
+}
+
+void sub_80FA0DC(void)
+{
+ u16 i;
+
+ SetMonMoveSlot(&gPlayerParty[gSpecialVar_0x8004], 0, gSpecialVar_0x8005);
+ RemoveMonPPBonus(&gPlayerParty[gSpecialVar_0x8004], gSpecialVar_0x8005);
+
+ for(i = gSpecialVar_0x8005; i < 3; i++)
+ sub_80F9FDC(&gPlayerParty[gSpecialVar_0x8004], i, i + 1);
+}
+
+void sub_80FA148(void)
+{
+ struct Pokemon *party = &gPlayerParty[gSpecialVar_0x8004];
+ gScriptResult = 0;
+
+ if(GetMonData(party, MON_DATA_IS_EGG))
+ gScriptResult = 1;
+}
diff --git a/src/shop.c b/src/shop.c
new file mode 100644
index 000000000..5148ddcca
--- /dev/null
+++ b/src/shop.c
@@ -0,0 +1,358 @@
+#include "global.h"
+#include "menu.h"
+#include "script.h"
+#include "task.h"
+#include "main.h"
+#include "sound.h"
+#include "weather.h"
+#include "palette.h"
+#include "sprite.h"
+#include "asm.h"
+#include "decompress.h"
+#include "money.h"
+
+struct UnknownShopStruct
+{
+ /* 0x0 */ void (* callback) (void);
+ /* 0x4 */ u16 *itemList;
+ /* 0x8 */ u8 itemCount;
+ /* 0x9 */ u8 unk9;
+ /* 0xA */ u8 unkA;
+ /* 0xB */ u8 unkB;
+ /* 0xC */ bool8 unkC;
+ // unknown size
+};
+
+extern struct UnknownShopStruct gUnknown_03000708;
+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[];
+extern u16 gMenuMoneyPal[16];
+extern u16 gUnknown_083CC710[2];
+
+extern void sub_80A6300(void);
+extern void sub_80BE3BC(void);
+extern void DisplayItemMessageOnField(u8, u8*, TaskFunc, u16);
+extern u8 sub_807D770(void);
+extern void pal_fill_black(void);
+extern void sub_80B3764(int, int);
+extern void sub_80B37EC(void);
+extern void sub_80B40E8(u8);
+extern void BuyMenuDrawMapGraphics(void);
+extern void sub_80F944C(void);
+extern void CreateVerticalScrollIndicators(u32, u32, u32); // unknown args
+extern void sub_80F979C(u32, u32); // unknown args
+
+void sub_80B2E38(u8);
+void HandleShopMenuQuit(u8);
+void sub_80B2FA0(u8);
+void BuyMenuDrawGraphics(void);
+void sub_80B3240(void);
+void sub_80B3270(void);
+
+u8 CreateShopMenu(bool8 var)
+{
+ ScriptContext2_Enable();
+ gUnknown_03000708.unkC = var;
+ gUnknown_03000708.unk9 = 0;
+
+ if(var == FALSE)
+ {
+ gUnknown_03000708.unkA = 2;
+ MenuDrawTextWindow(0, 0, 10, 7);
+ PrintMenuItemsReordered(1, 1, 3, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6E8);
+ }
+ else
+ {
+ gUnknown_03000708.unkA = 1;
+ MenuDrawTextWindow(0, 0, 10, 5);
+ PrintMenuItemsReordered(1, 1, 2, gUnknown_083CC6D0, (u8 *)gUnknown_083CC6EB);
+ }
+ InitMenu(0, 1, 1, gUnknown_03000708.unkA + 1, 0, 9);
+
+ return CreateTask(sub_80B2E38, 8);
+}
+
+void SetShopMenuCallback(void *callbackPtr)
+{
+ gUnknown_03000708.callback = callbackPtr;
+}
+
+void SetShopItemsForSale(u16 *items)
+{
+ u16 i = 0;
+
+ gUnknown_03000708.itemList = items;
+ gUnknown_03000708.itemCount = 0;
+
+ while (gUnknown_03000708.itemList[i])
+ {
+ gUnknown_03000708.itemCount++;
+ i++;
+ }
+}
+
+void sub_80B2E38(u8 var)
+{
+ const u8 local = var;
+
+ if(gMain.newAndRepeatedKeys & 0x40)
+ {
+ if(gUnknown_03000708.unk9)
+ {
+ PlaySE(0x5);
+ gUnknown_03000708.unk9 = MoveMenuCursor(-1);
+ }
+ }
+ else if(gMain.newAndRepeatedKeys & 0x80)
+ {
+ if(gUnknown_03000708.unk9 != gUnknown_03000708.unkA)
+ {
+ PlaySE(0x5);
+ gUnknown_03000708.unk9 = MoveMenuCursor(1);
+ }
+ }
+ else if (gMain.newKeys & 1)
+ {
+ PlaySE(0x5);
+ if(!gUnknown_03000708.unkC)
+ {
+ gUnknown_083CC6D0[gUnknown_083CC6E8[gUnknown_03000708.unk9]].func(local);
+ }
+ else
+ {
+ gUnknown_083CC6D0[gUnknown_083CC6EB[gUnknown_03000708.unk9]].func(local);
+ }
+ }
+ else if(gMain.newKeys & 2)
+ {
+ PlaySE(0x5);
+ HandleShopMenuQuit(local);
+ }
+}
+
+void sub_80B2EFC(u8 taskId)
+{
+ gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16;
+ gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics;
+ gTasks[taskId].func = sub_80B2FA0;
+ fade_screen(1, 0);
+}
+
+void sub_80B2F30(u8 taskId)
+{
+ gTasks[taskId].data[8] = (u32)sub_80A6300 >> 16;
+ gTasks[taskId].data[9] = (u32)sub_80A6300;
+ gTasks[taskId].func = sub_80B2FA0;
+ fade_screen(1, 0);
+}
+
+void HandleShopMenuQuit(u8 taskId)
+{
+ sub_8072DEC();
+ MenuZeroFillWindowRect(0, 0, 11, 8);
+ sub_80BE3BC(); // in tv.s?
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+
+ if(gUnknown_03000708.callback)
+ gUnknown_03000708.callback(); // run the callback if it exists.
+}
+
+void sub_80B2FA0(u8 taskId)
+{
+ if(!gPaletteFade.active)
+ {
+ SetMainCallback2((void *)((u16)gTasks[taskId].data[8] << 16 | (u16)gTasks[taskId].data[9]));
+ DestroyTask(taskId);
+ }
+}
+
+void ReturnToShopMenuAfterExitingSellMenu(u8 taskId)
+{
+ CreateShopMenu(gUnknown_03000708.unkC);
+ DestroyTask(taskId);
+}
+
+void Task_ExitSellMenu(u8 taskId)
+{
+ if(sub_807D770() == 1)
+ {
+ if(gUnknown_03000708.unkC == 2)
+ DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0);
+ else
+ DisplayItemMessageOnField(taskId, gOtherText_AnythingElse, ReturnToShopMenuAfterExitingSellMenu, 0);
+ }
+}
+
+void sub_80B3050(void)
+{
+ pal_fill_black();
+ CreateTask(Task_ExitSellMenu, 0x8);
+}
+
+void sub_80B3068(u8 taskId)
+{
+ Task_ExitSellMenu(taskId);
+}
+
+void unref_sub_80B3078(u8 taskId)
+{
+ gTasks[taskId].func = Task_ExitSellMenu;
+}
+
+void sub_80B3094(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTasks();
+ UpdatePaletteFade();
+}
+
+void sub_80B30AC(void)
+{
+ void *addr;
+ void *addr2;
+ void *addr3;
+ u16 *tempArr;
+ u16 *tempArr2;
+ u16 *tempArr3;
+
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+
+ // temp vars needed to match for some dumb reason
+ tempArr = gBGTilemapBuffers[1];
+ addr = (void *)(VRAM + 0xE800);
+ DmaCopy16(3, tempArr, addr, 0x800);
+ tempArr2 = gBGTilemapBuffers[2];
+ addr2 = (void *)(VRAM + 0xE000);
+ DmaCopy16(3, tempArr2, addr2, 0x800);
+ tempArr3 = gBGTilemapBuffers[3];
+ addr3 = (void *)(VRAM + 0xF000);
+ DmaCopy16(3, tempArr3, addr3, 0x800);
+}
+
+// this function is fugly. pls fix
+void BuyMenuDrawGraphics(void)
+{
+ void *addr;
+ register u16 zero2 asm("r5");
+
+ sub_80F9438();
+ remove_some_task();
+ REG_BG1HOFS = (zero2 = 0);
+ REG_BG1VOFS = zero2;
+ REG_BG2HOFS = zero2;
+ REG_BG2VOFS = zero2;
+ REG_BG3HOFS = zero2;
+ REG_BG3VOFS = zero2;
+ gPaletteFade.bufferTransferDisabled = 1;
+ addr = (void*)OAM;
+ {
+ register const u32 zero asm("r6") = 0;
+ DmaFill32(3, zero, addr, OAM_SIZE);
+ LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00));
+ sub_800D238(gBuyMenuFrame_Tilemap, (void *)0x02018000);
+ LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal));
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ SetUpWindowConfig(&gWindowConfig_81E6DFC);
+ InitMenuWindow(&gWindowConfig_81E6DFC);
+ BuyMenuDrawMapGraphics();
+ gUnknown_03000708.unk9 = zero;
+ gUnknown_03000708.unkB = zero2;
+ MenuZeroFillWindowRect(0, 0, 0x20, 0x20);
+ sub_80B7C14(gSaveBlock1.money, 0, 0);
+ sub_80B3764(0, 7);
+ sub_80B37EC();
+ sub_80B3270();
+ CreateTask(sub_80B40E8, 0x8);
+ sub_80B3240();
+ asm("":::"r4"); // what??
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, zero);
+ gPaletteFade.bufferTransferDisabled = 0;
+ SetVBlankCallback(sub_80B30AC);
+ SetMainCallback2(sub_80B3094);
+ }
+}
+
+void sub_80B3240(void)
+{
+ u16 tempArr[2];
+
+ memcpy(tempArr, gUnknown_083CC710, sizeof(tempArr));
+ LoadPalette(&tempArr[1], 0xD1, 2);
+ LoadPalette(&tempArr[0], 0xD8, 2);
+}
+
+void sub_80B3270(void)
+{
+ sub_80F944C();
+
+ if(gUnknown_03000708.itemCount > 7)
+ {
+ CreateVerticalScrollIndicators(0, 172, 12);
+ CreateVerticalScrollIndicators(1, 172, 148);
+ sub_80F979C(0, 1);
+ }
+}
+
+void sub_80B32A4(void)
+{
+ if(gUnknown_03000708.unkB == 0)
+ sub_80F979C(0, 1);
+ else
+ sub_80F979C(0, 0);
+
+ if(gUnknown_03000708.unkB + 7 >= gUnknown_03000708.itemCount)
+ sub_80F979C(1, 1);
+ else
+ sub_80F979C(1, 0);
+}
+
+void sub_80B32EC(u16 *array, s16 offset1, s16 offset2)
+{
+ array[offset1 + offset2] = 0xC3E1;
+ array[offset1 + offset2 + 1] = 0xC3E1;
+}
+
+void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2)
+{
+ array[offset1 + offset2] = array2[0];
+ array[offset1 + offset2 + 1] = array2[1];
+ array[offset1 + offset2 + 32] = array2[2];
+ array[offset1 + offset2 + 33] = array2[3];
+}
+
+void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s8 var4)
+{
+ u8 tempVar4 = var4;
+ s16 offset1 = var1 * 2;
+ s16 offset2 = (var2 * 0x40) + 0x40;
+
+ 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;
+ }
+}
diff --git a/src/sound.c b/src/sound.c
index c244c5cbe..ea8d5b49c 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -1,11 +1,11 @@
#include "global.h"
#include "sound.h"
#include "asm.h"
+#include "battle.h"
#include "gba/m4a_internal.h"
-#include "task.h"
-#include "songs.h"
#include "m4a.h"
-#include "battle.h"
+#include "songs.h"
+#include "task.h"
struct Fanfare
{
@@ -526,7 +526,7 @@ void PlaySE(u16 songNum)
m4aSongNumStart(songNum);
}
-void PlaySE12WithPanning(u16 songNum, u8 pan)
+void PlaySE12WithPanning(u16 songNum, s8 pan)
{
m4aSongNumStart(songNum);
m4aMPlayImmInit(&gMPlay_SE1);
@@ -535,21 +535,21 @@ void PlaySE12WithPanning(u16 songNum, u8 pan)
m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan);
}
-void PlaySE1WithPanning(u16 songNum, u8 pan)
+void PlaySE1WithPanning(u16 songNum, s8 pan)
{
m4aSongNumStart(songNum);
m4aMPlayImmInit(&gMPlay_SE1);
m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan);
}
-void PlaySE2WithPanning(u16 songNum, u8 pan)
+void PlaySE2WithPanning(u16 songNum, s8 pan)
{
m4aSongNumStart(songNum);
m4aMPlayImmInit(&gMPlay_SE2);
m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan);
}
-void SE12PanpotControl(u8 pan)
+void SE12PanpotControl(s8 pan)
{
m4aMPlayPanpotControl(&gMPlay_SE1, 0xFFFF, pan);
m4aMPlayPanpotControl(&gMPlay_SE2, 0xFFFF, pan);
diff --git a/src/sprite.c b/src/sprite.c
index df101b61f..409c66cfa 100644
--- a/src/sprite.c
+++ b/src/sprite.c
@@ -1,8 +1,8 @@
#include "global.h"
#include "sprite.h"
#include "main.h"
-#include "palette.h"
#include "menu_cursor.h"
+#include "palette.h"
#define MAX_SPRITE_COPY_REQUESTS 64
@@ -36,7 +36,7 @@ struct OamMatrix
struct SpriteCopyRequest
{
- u8 *src;
+ const u8 *src;
u8 *dest;
u16 size;
};
@@ -58,7 +58,7 @@ static void ResetOamMatrices(void);
static void ResetSprite(struct Sprite *sprite);
static s16 AllocSpriteTiles(u16 tileCount);
u8 SpriteTileAllocBitmapOp(u16 bit, u8 op);
-static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, struct SpriteFrameImage *images);
+static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images);
static void ResetAllSprites(void);
static void BeginAnim(struct Sprite *sprite);
static void ContinueAnim(struct Sprite *sprite);
@@ -95,7 +95,7 @@ static void ApplyAffineAnimFrame(u8 matrixNum, struct AffineAnimFrameCmd *frameC
static void ResetAffineAnimData(void);
static u8 IndexOfSpriteTileTag(u16 tag);
static void AllocSpriteTileRange(u16 tag, u16 start, u16 count);
-static void DoLoadSpritePalette(u16 *src, u16 paletteOffset);
+static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset);
typedef void (*AnimFunc)(struct Sprite *);
typedef void (*AnimCmdFunc)(struct Sprite *);
@@ -129,10 +129,12 @@ const struct SpriteTemplate gDummySpriteTemplate;
// Unreferenced error message.
// It means "The DMA transfer request table has exceeded its limit."
static const u8 sDmaOverErrorMsg[] =
- _"DMA OVER\n"
- "DMAてんそう\n"
- "リクエストテーブルが\n"
- "オーバーしました";
+ _(
+ "DMA OVER\n"
+ "DMAてんそう\n"
+ "リクエストテーブルが\n"
+ "オーバーしました"
+ );
// Unreferenced data.
static const u8 sUnknownData[24] =
@@ -169,51 +171,51 @@ static const u8 sCenterToCornerVecTable[3][4][2] =
static const struct Sprite sDummySprite =
{
- DUMMY_OAM_DATA,
- (union AnimCmd **)gDummySpriteAnimTable,
- NULL,
- (union AffineAnimCmd **)gDummySpriteAffineAnimTable,
- (struct SpriteTemplate *)&gDummySpriteTemplate,
- NULL,
- SpriteCallbackDummy,
- { 304, 160 },
- { 0, 0 },
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0xFF
+ .oam = DUMMY_OAM_DATA,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .template = &gDummySpriteTemplate,
+ .subspriteTables = NULL,
+ .callback = SpriteCallbackDummy,
+ .pos1 = { 304, 160 },
+ .pos2 = { 0, 0 },
+ .centerToCornerVecX = 0,
+ .centerToCornerVecY = 0,
+ .animNum = 0,
+ .animCmdIndex = 0,
+ .animDelayCounter = 0,
+ .animPaused = 0,
+ .affineAnimPaused = 0,
+ .animLoopCounter = 0,
+ .data0 = 0,
+ .data1 = 0,
+ .data2 = 0,
+ .data3 = 0,
+ .data4 = 0,
+ .data5 = 0,
+ .data6 = 0,
+ .data7 = 0,
+ .inUse = 0,
+ .coordOffsetEnabled = 0,
+ .invisible = 0,
+ .flags_3 = 0,
+ .flags_4 = 0,
+ .flags_5 = 0,
+ .flags_6 = 0,
+ .flags_7 = 0,
+ .hFlip = 0,
+ .vFlip = 0,
+ .animBeginning = 0,
+ .affineAnimBeginning = 0,
+ .animEnded = 0,
+ .affineAnimEnded = 0,
+ .usingSheet = 0,
+ .flags_f = 0,
+ .sheetTileStart = 0,
+ .subspriteTableNum = 0,
+ .subspriteMode = 0,
+ .subpriority = 0xFF
};
const struct OamData gDummyOamData = DUMMY_OAM_DATA;
@@ -228,13 +230,13 @@ const union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffin
const struct SpriteTemplate gDummySpriteTemplate =
{
- 0,
- 0xFFFF,
- (struct OamData *)&gDummyOamData,
- (union AnimCmd **)gDummySpriteAnimTable,
- NULL,
- (union AffineAnimCmd **)gDummySpriteAffineAnimTable,
- SpriteCallbackDummy
+ .tileTag = 0,
+ .paletteTag = 0xFFFF,
+ .oam = &gDummyOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
};
// TODO: Find out what these are used for.
@@ -534,7 +536,7 @@ u8 CreateSprite(const struct SpriteTemplate *template, s16 x, s16 y, u8 subprior
return MAX_SPRITES;
}
-u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, u16 x, u16 y, u8 subpriority)
+u8 CreateSpriteAtEnd(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority)
{
s16 i;
@@ -827,7 +829,7 @@ void ProcessSpriteCopyRequests(void)
}
}
-static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, struct SpriteFrameImage *images)
+static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, const struct SpriteFrameImage *images)
{
if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS)
{
@@ -838,7 +840,7 @@ static void RequestSpriteFrameImageCopy(u16 index, u16 tileNum, struct SpriteFra
}
}
-void RequestSpriteCopy(u8 *src, u8 *dest, u16 size)
+void RequestSpriteCopy(const u8 *src, u8 *dest, u16 size)
{
if (gSpriteCopyRequestCount < MAX_SPRITE_COPY_REQUESTS)
{
@@ -1466,7 +1468,7 @@ void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotat
CopyOamMatrix(matrixNum, &matrix);
}
-u16 LoadSpriteSheet(struct SpriteSheet *sheet)
+u16 LoadSpriteSheet(const struct SpriteSheet *sheet)
{
s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP);
@@ -1482,7 +1484,7 @@ u16 LoadSpriteSheet(struct SpriteSheet *sheet)
}
}
-void LoadSpriteSheets(struct SpriteSheet *sheets)
+void LoadSpriteSheets(const struct SpriteSheet *sheets)
{
u8 i;
for (i = 0; sheets[i].data != NULL; i++)
@@ -1511,9 +1513,9 @@ void AllocTilesForSpriteSheets(struct SpriteSheet *sheets)
AllocTilesForSpriteSheet(&sheets[i]);
}
-void LoadTilesForSpriteSheet(struct SpriteSheet *sheet)
+void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet)
{
- u8 *data = sheet->data;
+ const u8 *data = sheet->data;
u16 tileStart = GetSpriteTileStartByTag(sheet->tag);
CpuCopy16(data, (u8 *)OBJ_VRAM0 + TILE_SIZE_4BPP * tileStart, sheet->size);
}
@@ -1597,14 +1599,14 @@ static void AllocSpriteTileRange(u16 tag, u16 start, u16 count)
SET_SPRITE_TILE_RANGE(freeIndex, start, count);
}
-void RequestSpriteSheetCopy(struct SpriteSheet *sheet)
+void RequestSpriteSheetCopy(const struct SpriteSheet *sheet)
{
- u8 *data = sheet->data;
+ const u8 *data = sheet->data;
u16 tileStart = GetSpriteTileStartByTag(sheet->tag);
RequestSpriteCopy(data, (u8 *)OBJ_VRAM0 + tileStart * TILE_SIZE_4BPP, sheet->size);
}
-u16 LoadSpriteSheetDeferred(struct SpriteSheet *sheet)
+u16 LoadSpriteSheetDeferred(const struct SpriteSheet *sheet)
{
s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP);
@@ -1657,7 +1659,7 @@ void LoadSpritePalettes(const struct SpritePalette *palettes)
break;
}
-static void DoLoadSpritePalette(u16 *src, u16 paletteOffset)
+static void DoLoadSpritePalette(const u16 *src, u16 paletteOffset)
{
LoadPalette(src, paletteOffset + 0x100, 32);
}
@@ -1698,7 +1700,7 @@ void FreeSpritePaletteByTag(u16 tag)
sSpritePaletteTags[index] = 0xFFFF;
}
-void SetSubspriteTables(struct Sprite *sprite, struct SubspriteTable *subspriteTables)
+void SetSubspriteTables(struct Sprite *sprite, const struct SubspriteTable *subspriteTables)
{
sprite->subspriteTables = subspriteTables;
sprite->subspriteTableNum = 0;
@@ -1724,7 +1726,7 @@ bool8 AddSpriteToOamBuffer(struct Sprite *sprite, u8 *oamIndex)
bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex)
{
- struct SubspriteTable *subspriteTable;
+ const struct SubspriteTable *subspriteTable;
struct OamData *oam;
if (*oamIndex >= gOamLimit)
diff --git a/src/start_menu.c b/src/start_menu.c
index 31ba31766..d1344ce90 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -1,8 +1,8 @@
#include "global.h"
#include "start_menu.h"
#include "asm.h"
-#include "field_player_avatar.h"
#include "event_data.h"
+#include "field_player_avatar.h"
#include "load_save.h"
#include "main.h"
#include "map_obj_lock.h"
@@ -22,6 +22,7 @@
#include "task.h"
#include "trainer_card.h"
#include "weather.h"
+#include "field_map_obj_helpers.h"
//Menu actions
enum {
@@ -41,7 +42,7 @@ static u8 (*saveDialogCallback)(void);
static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed
static bool8 savingComplete;
-extern bool8 gUnknown_020297EC;
+extern bool8 gDifferentSaveFile;
extern u16 gSaveFileStatus;
extern u16 gScriptResult;
extern u8 (*gCallback_03004AE8)(void);
@@ -141,11 +142,11 @@ static void Task_8071B64(u8 taskId);
static void BuildStartMenuActions(void)
{
sNumStartMenuActions = 0;
- if(is_c1_link_related_active() == TRUE)
+ if (is_c1_link_related_active() == TRUE)
BuildStartMenuActions_Link();
else
{
- if(GetSafariZoneFlag() == TRUE)
+ if (GetSafariZoneFlag() == TRUE)
BuildStartMenuActions_SafariZone();
else
BuildStartMenuActions_Normal();
@@ -159,12 +160,12 @@ static void AddStartMenuAction(u8 action)
static void BuildStartMenuActions_Normal(void)
{
- if(FlagGet(SYS_POKEDEX_GET) == TRUE)
+ if (FlagGet(SYS_POKEDEX_GET) == TRUE)
AddStartMenuAction(MENU_ACTION_POKEDEX);
- if(FlagGet(SYS_POKEMON_GET) == TRUE)
+ if (FlagGet(SYS_POKEMON_GET) == TRUE)
AddStartMenuAction(MENU_ACTION_POKEMON);
AddStartMenuAction(MENU_ACTION_BAG);
- if(FlagGet(SYS_POKENAV_GET) == TRUE)
+ if (FlagGet(SYS_POKENAV_GET) == TRUE)
AddStartMenuAction(MENU_ACTION_POKENAV);
AddStartMenuAction(MENU_ACTION_PLAYER);
AddStartMenuAction(MENU_ACTION_SAVE);
@@ -187,11 +188,11 @@ static void BuildStartMenuActions_Link(void)
{
AddStartMenuAction(MENU_ACTION_POKEMON);
AddStartMenuAction(MENU_ACTION_BAG);
- if(FlagGet(SYS_POKENAV_GET) == TRUE)
+ if (FlagGet(SYS_POKENAV_GET) == TRUE)
AddStartMenuAction(MENU_ACTION_POKENAV);
AddStartMenuAction(MENU_ACTION_PLAYER_LINK);
AddStartMenuAction(MENU_ACTION_OPTION);
- AddStartMenuAction(MENU_ACTION_EXIT);
+ AddStartMenuAction(MENU_ACTION_EXIT);
}
//Show number of safari balls left
@@ -206,25 +207,25 @@ static void DisplaySafariBallsWindow(void)
static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n)
{
int _index = *index;
-
+
do
{
MenuPrint(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2);
_index++;
- if(_index >= sNumStartMenuActions)
+ if (_index >= sNumStartMenuActions)
{
*index = _index;
return TRUE;
}
}
- while(--n != 0);
+ while (--n != 0);
*index = _index;
return FALSE;
}
static bool32 InitStartMenuMultistep(s16 *step, s16 *index)
{
- switch(*step)
+ switch (*step)
{
case 1:
BuildStartMenuActions();
@@ -236,12 +237,12 @@ static bool32 InitStartMenuMultistep(s16 *step, s16 *index)
(*step)++;
break;
case 3:
- if(GetSafariZoneFlag())
+ if (GetSafariZoneFlag())
DisplaySafariBallsWindow();
(*step)++;
break;
case 4:
- if(PrintStartMenuItemsMultistep(index, 2))
+ if (PrintStartMenuItemsMultistep(index, 2))
(*step)++;
break;
case 0:
@@ -258,14 +259,14 @@ static void InitStartMenu(void)
{
s16 step = 0;
s16 index = 0;
-
- while(InitStartMenuMultistep(&step, &index) == FALSE)
+
+ while (InitStartMenuMultistep(&step, &index) == FALSE)
;
}
static void Task_StartMenu(u8 taskId)
{
- if(InitStartMenuMultistep(gTasks[taskId].data, gTasks[taskId].data + 1) == TRUE)
+ if (InitStartMenuMultistep(gTasks[taskId].data, gTasks[taskId].data + 1) == TRUE)
{
*gTasks[taskId].data = 0;
SwitchTaskToFollowupFunc(taskId);
@@ -275,31 +276,24 @@ static void Task_StartMenu(u8 taskId)
void CreateStartMenuTask(void (*func)(u8))
{
u8 taskId;
-
+
InitMenuWindow(&gWindowConfig_81E6CE4);
taskId = CreateTask(Task_StartMenu, 0x50);
SetTaskFuncWithFollowupFunc(taskId, Task_StartMenu, func);
}
-struct MyTask {
- TaskFunc func;
- bool8 isActive;
- u8 prev;
- u8 next;
- u8 priority;
- s16 var1;
-};
-
void sub_80712B4(u8 taskId)
{
- switch(((struct MyTask *)&gTasks[taskId])->var1)
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
{
case 0:
gCallback_03004AE8 = StartMenu_InputProcessCallback;
- ((struct MyTask *)&gTasks[taskId])->var1++;
+ task->data[0]++;
break;
case 1:
- if(gCallback_03004AE8() == 1)
+ if (gCallback_03004AE8() == 1)
DestroyTask(taskId);
break;
}
@@ -307,7 +301,7 @@ void sub_80712B4(u8 taskId)
void sub_8071310(void)
{
- if(!is_c1_link_related_active())
+ if (!is_c1_link_related_active())
{
FreezeMapObjects();
sub_80594C0();
@@ -319,32 +313,32 @@ void sub_8071310(void)
static u8 StartMenu_InputProcessCallback(void)
{
- if(gMain.newKeys & DPAD_UP)
+ if (gMain.newKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
sStartMenuCursorPos = MoveMenuCursor(-1);
}
- if(gMain.newKeys & DPAD_DOWN)
+ if (gMain.newKeys & DPAD_DOWN)
{
PlaySE(SE_SELECT);
sStartMenuCursorPos = MoveMenuCursor(1);
}
- if(gMain.newKeys & A_BUTTON)
+ if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
- if(sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func == StartMenu_PokedexCallback)
+ if (sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func == StartMenu_PokedexCallback)
{
- if(GetNationalPokedexCount(0) == 0)
+ if (GetNationalPokedexCount(0) == 0)
return 0;
}
gCallback_03004AE8 = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func;
- if(gCallback_03004AE8 != StartMenu_SaveCallback &&
+ if (gCallback_03004AE8 != StartMenu_SaveCallback &&
gCallback_03004AE8 != StartMenu_ExitCallback &&
gCallback_03004AE8 != StartMenu_RetireCallback)
fade_screen(1, 0);
return 0;
}
- if(gMain.newKeys & (START_BUTTON | B_BUTTON))
+ if (gMain.newKeys & (START_BUTTON | B_BUTTON))
{
CloseMenu();
return 1;
@@ -355,7 +349,7 @@ static u8 StartMenu_InputProcessCallback(void)
//When player selects POKEDEX
static u8 StartMenu_PokedexCallback(void)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
IncrementGameStat(0x29);
PlayRainSoundEffect();
@@ -368,7 +362,7 @@ static u8 StartMenu_PokedexCallback(void)
//When player selects POKEMON
static u8 StartMenu_PokemonCallback(void)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
PlayRainSoundEffect();
SetMainCallback2(sub_8089A70);
@@ -380,7 +374,7 @@ static u8 StartMenu_PokemonCallback(void)
//When player selects BAG
static u8 StartMenu_BagCallback(void)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
PlayRainSoundEffect();
SetMainCallback2(sub_80A53F8);
@@ -392,7 +386,7 @@ static u8 StartMenu_BagCallback(void)
//When player selects POKENAV
static u8 StartMenu_PokenavCallback(void)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
PlayRainSoundEffect();
SetMainCallback2(sub_80EBA5C);
@@ -404,7 +398,7 @@ static u8 StartMenu_PokenavCallback(void)
//When player selects his/her name
static u8 StartMenu_PlayerCallback(void)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
PlayRainSoundEffect();
sub_8093110(sub_805469C);
@@ -424,7 +418,7 @@ static u8 StartMenu_SaveCallback(void)
//When player selects OPTION
static u8 StartMenu_OptionCallback(void)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
PlayRainSoundEffect();
SetMainCallback2(CB2_InitOptionMenu);
@@ -452,7 +446,7 @@ static u8 StartMenu_RetireCallback(void)
//When player selects their name in multiplayer mode
static u8 StartMenu_PlayerLinkCallback(void)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
{
PlayRainSoundEffect();
sub_8093130(gUnknown_03004860, sub_805469C);
@@ -479,7 +473,7 @@ static u8 SaveCallback1(void)
static u8 SaveCallback2(void)
{
- switch(RunSaveDialogCallback())
+ switch (RunSaveDialogCallback())
{
case SAVE_IN_PROGRESS:
return FALSE;
@@ -497,7 +491,7 @@ static u8 SaveCallback2(void)
return TRUE;
}
return FALSE;
-}
+}
static void sub_807160C(void)
{
@@ -508,9 +502,9 @@ static void sub_807160C(void)
static u8 RunSaveDialogCallback(void)
{
- if(savingComplete)
+ if (savingComplete)
{
- if(!MenuUpdateWindowText())
+ if (!MenuUpdateWindowText())
return 0;
}
savingComplete = FALSE;
@@ -535,13 +529,13 @@ static void DisplaySaveMessageWithCallback(u8 *ptr, u8 (*func)(void))
static void Task_SaveDialog(u8 taskId)
{
u8 status = RunSaveDialogCallback();
-
- switch(status)
+
+ switch (status)
{
case SAVE_CANCELED:
case SAVE_ERROR:
gScriptResult = 0;
- break;
+ break;
case SAVE_SUCCESS:
gScriptResult = status;
break;
@@ -554,7 +548,7 @@ static void Task_SaveDialog(u8 taskId)
static void sub_8071700(void)
{
- sub_80946C8(0, 0);
+ HandleCloseSaveWindow(0, 0);
}
static void HideSaveDialog(void)
@@ -570,21 +564,21 @@ static void SaveDialogStartTimeout(void)
static bool8 SaveDialogCheckForTimeoutOrKeypress(void)
{
saveDialogTimer--;
- if(gMain.heldKeys & A_BUTTON)
+ if (gMain.heldKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
return TRUE;
}
- else if(saveDialogTimer == 0)
+ else if (saveDialogTimer == 0)
return TRUE;
return FALSE;
}
static bool8 SaveDialogCheckForTimeoutAndKeypress(void)
{
- if(saveDialogTimer != 0)
+ if (saveDialogTimer != 0)
saveDialogTimer--;
- else if(gMain.heldKeys & A_BUTTON)
+ else if (gMain.heldKeys & A_BUTTON)
return TRUE;
return FALSE;
}
@@ -593,7 +587,6 @@ static u8 SaveDialogCB_DisplayConfirmMessage(void)
{
MenuZeroFillScreen();
HandleDrawSaveWindowInfo(0, 0);
- //"Would you like to save the game?"
DisplaySaveMessageWithCallback(gSaveText_WouldYouLikeToSave, SaveDialogCB_DisplayConfirmYesNoMenu);
return SAVE_IN_PROGRESS;
}
@@ -607,15 +600,15 @@ static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void)
static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void)
{
- switch(ProcessMenuInputNoWrap_())
+ switch (ProcessMenuInputNoWrap_())
{
case 0: //YES
HideSaveDialog();
- switch(gSaveFileStatus)
+ switch (gSaveFileStatus)
{
case 0:
case 2:
- if(gUnknown_020297EC == FALSE)
+ if (gDifferentSaveFile == FALSE)
{
saveDialogCallback = SaveDialogCB_SaveFileExists;
return SAVE_IN_PROGRESS;
@@ -639,7 +632,7 @@ static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void)
static u8 SaveDialogCB_SaveFileExists(void)
{
DisplaySaveMessageWithCallback(
- gUnknown_020297EC == TRUE ? gSaveText_ThereIsADifferentFile : gSaveText_ThereIsAlreadyAFile,
+ gDifferentSaveFile == TRUE ? gSaveText_ThereIsADifferentFile : gSaveText_ThereIsAlreadyAFile,
SaveDialogCB_DisplayOverwriteYesNoMenu);
return SAVE_IN_PROGRESS;
}
@@ -653,7 +646,7 @@ static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void)
static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void)
{
- switch(ProcessMenuInputNoWrap_())
+ switch (ProcessMenuInputNoWrap_())
{
case 0: //YES
HideSaveDialog();
@@ -677,20 +670,20 @@ static u8 SaveDialogCB_DisplaySavingMessage(void)
static u8 SaveDialogCB_DoSave(void)
{
- u8 a;
-
+ bool8 saveSucceeded;
+
IncrementGameStat(0);
- if(gUnknown_020297EC == TRUE)
+ if (gDifferentSaveFile == TRUE)
{
- a = sub_8125D44(4);
- gUnknown_020297EC = FALSE;
+ saveSucceeded = TrySavingData(DIFFERENT_FILE_SAVE);
+ gDifferentSaveFile = FALSE;
}
else
{
- a = sub_8125D44(0);
+ saveSucceeded = TrySavingData(NORMAL_SAVE);
}
-
- if(a == 1)
+
+ if (saveSucceeded == TRUE)
{
//"(Player) saved the game."
DisplaySaveMessageWithCallback(gSaveText_PlayerSavedTheGame, SaveDialogCB_SaveSuccess);
@@ -700,14 +693,14 @@ static u8 SaveDialogCB_DoSave(void)
//"Save error. Please exchange the backup memory."
DisplaySaveMessageWithCallback(gSystemText_SaveErrorExchangeBackup, SaveDialogCB_SaveError);
}
-
+
SaveDialogStartTimeout();
return SAVE_IN_PROGRESS;
}
static u8 SaveDialogCB_SaveSuccess(void)
{
- if(MenuUpdateWindowText())
+ if (MenuUpdateWindowText())
{
PlaySE(SE_SAVE);
saveDialogCallback = SaveDialogCB_ReturnSuccess;
@@ -717,7 +710,7 @@ static u8 SaveDialogCB_SaveSuccess(void)
static u8 SaveDialogCB_ReturnSuccess(void)
{
- if(!IsSEPlaying() && SaveDialogCheckForTimeoutOrKeypress())
+ if (!IsSEPlaying() && SaveDialogCheckForTimeoutOrKeypress())
{
sub_8071700();
return SAVE_SUCCESS;
@@ -728,7 +721,7 @@ static u8 SaveDialogCB_ReturnSuccess(void)
static u8 SaveDialogCB_SaveError(void)
{
- if(MenuUpdateWindowText())
+ if (MenuUpdateWindowText())
{
PlaySE(SE_BOO);
saveDialogCallback = SaveDialogCB_ReturnError;
@@ -738,7 +731,7 @@ static u8 SaveDialogCB_SaveError(void)
static u8 SaveDialogCB_ReturnError(void)
{
- if(!SaveDialogCheckForTimeoutAndKeypress())
+ if (!SaveDialogCheckForTimeoutAndKeypress())
return SAVE_IN_PROGRESS;
else
{
@@ -754,25 +747,25 @@ static void sub_80719F0(void)
static bool32 sub_80719FC(u8 *step)
{
- switch(*step)
+ switch (*step)
{
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)
+ while (1)
{
DmaFill16(3, 0, addr, 0x1000);
addr += 0x1000;
size -= 0x1000;
- if(size <= 0x1000)
+ if (size <= 0x1000)
{
DmaFill16(3, 0, addr, size);
break;
@@ -794,7 +787,7 @@ static bool32 sub_80719FC(u8 *step)
case 3:
{
u32 savedIme;
-
+
BlendPalettes(-1, 0x10, 0);
SetVBlankCallback(sub_80719F0);
savedIme = REG_IME;
@@ -812,7 +805,7 @@ static bool32 sub_80719FC(u8 *step)
void sub_8071B28(void)
{
- if(sub_80719FC(&gMain.state))
+ if (sub_80719FC(&gMain.state))
{
CreateTask(Task_8071B64, 0x50);
SetMainCallback2(sub_8071B54);
@@ -828,10 +821,10 @@ static void sub_8071B54(void)
static void Task_8071B64(u8 taskId)
{
s16 *step = gTasks[taskId].data;
-
- if(!gPaletteFade.active)
+
+ if (!gPaletteFade.active)
{
- switch(*step)
+ switch (*step)
{
case 0:
MenuDisplayMessageBox();
@@ -845,7 +838,7 @@ static void Task_8071B64(u8 taskId)
(*step)++;
break;
case 2:
- if(!sub_8125E6C())
+ if (!sub_8125E6C())
break;
ClearSecretBase2Field_9_2();
(*step)++;
@@ -857,7 +850,7 @@ static void Task_8071B64(u8 taskId)
case 4:
SetMainCallback2(gMain.savedCallback);
DestroyTask(taskId);
- break;
+ break;
}
}
}
diff --git a/src/starter_choose.c b/src/starter_choose.c
index 9bd817cce..63d153ebd 100644
--- a/src/starter_choose.c
+++ b/src/starter_choose.c
@@ -1,17 +1,18 @@
#include "global.h"
#include "starter_choose.h"
#include "asm.h"
+#include "decompress.h"
#include "main.h"
#include "menu.h"
#include "palette.h"
#include "pokedex.h"
#include "songs.h"
#include "sound.h"
+#include "species.h"
+#include "sprite.h"
#include "string_util.h"
#include "task.h"
#include "trig.h"
-#include "decompress.h"
-#include "sprite.h"
struct MonCoords
{
@@ -19,32 +20,219 @@ struct MonCoords
};
extern void * const gUnknown_081FAF4C[];
-extern const u8 gStarterChoose_PokeballCoords[][2];
-extern u8 gBirchHelpGfx[];
-extern u8 gBirchBagTilemap[];
-extern u8 gBirchGrassTilemap[];
-extern struct SpriteSheet gUnknown_083F7794;
-extern struct SpriteSheet gUnknown_083F77A4;
-extern u8 gBirchBagGrassPal[];
-extern const u8 gStarterChoose_LabelCoords[][2];
-extern u16 gStarterMons[];
-extern union AffineAnimCmd *gSpriteAffineAnimTable_83F778C[];
-extern u8 gOtherText_DoYouChoosePoke[];
+extern const u8 gOtherText_DoYouChoosePoke[];
extern u16 gScriptResult;
-extern u8 gSpeciesNames[][11];
-extern u8 gOtherText_Poke[];
+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 u8 gUnknown_083F76E4[][2];
-extern u8 gOtherText_BirchInTrouble[];
-
-extern struct SpriteTemplate gSpriteTemplate_83F77E4;
-extern struct SpriteTemplate gSpriteTemplate_83F77CC;
-extern struct SpritePalette gUnknown_083F77B4[];
-extern struct SpriteTemplate gSpriteTemplate_83F77FC;
+extern const u8 gOtherText_BirchInTrouble[];
extern struct SpriteTemplate gUnknown_02024E8C;
+//--------------------------------------------------
+// Graphics Data
+//--------------------------------------------------
+
+const u16 gBirchBagGrassPal[][16] =
+{
+ INCBIN_U16("graphics/misc/birch_bag.gbapal"),
+ INCBIN_U16("graphics/misc/birch_grass.gbapal"),
+};
+static const u16 gBirchBallarrow_Pal[] = INCBIN_U16("graphics/misc/birch_ballarrow.gbapal");
+static const u16 gBirchCircle_Pal[] = INCBIN_U16("graphics/misc/birch_circle.gbapal");
+const u8 gBirchBagTilemap[] = INCBIN_U8("graphics/misc/birch_bag_map.bin.lz");
+const u8 gBirchGrassTilemap[] = INCBIN_U8("graphics/misc/birch_grass_map.bin.lz");
+const u8 gBirchHelpGfx[] = INCBIN_U8("graphics/misc/birch_help.4bpp.lz");
+static const u8 gBirchBallarrow_Gfx[] = INCBIN_U8("graphics/misc/birch_ballarrow.4bpp.lz");
+static const u8 gBirchCircle_Gfx[] = INCBIN_U8("graphics/misc/birch_circle.4bpp.lz");
+static const u8 gStarterChoose_PokeballCoords[][2] =
+{
+ {60, 64},
+ {120, 88},
+ {180, 64},
+};
+static const u8 gStarterChoose_LabelCoords[][2] =
+{
+ {0, 9},
+ {16, 10},
+ {8, 4},
+};
+static const u16 sStarterMons[] = {SPECIES_TREECKO, SPECIES_TORCHIC, SPECIES_MUDKIP};
+static const struct OamData gOamData_83F76CC =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const struct OamData gOamData_83F76D4 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const struct OamData gOamData_83F76DC =
+{
+ .y = 160,
+ .affineMode = 3,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const u8 gUnknown_083F76E4[][2] =
+{
+ {60, 32},
+ {120, 56},
+ {180, 32},
+ {0, 0},
+};
+static const union AnimCmd gSpriteAnim_83F76EC[] =
+{
+ ANIMCMD_FRAME(48, 30),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_83F76F4[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_83F76FC[] =
+{
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(32, 4),
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_FRAME(0, 32),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_JUMP(0),
+};
+static const union AnimCmd gSpriteAnim_83F7744[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_83F774C[] =
+{
+ gSpriteAnim_83F76EC,
+};
+static const union AnimCmd *const gSpriteAnimTable_83F7750[] =
+{
+ gSpriteAnim_83F76F4,
+ gSpriteAnim_83F76FC,
+};
+static const union AnimCmd *const gSpriteAnimTable_83F7758[] =
+{
+ gSpriteAnim_83F7744,
+};
+static const union AffineAnimCmd gSpriteAffineAnim_83F775C[] =
+{
+ AFFINEANIMCMD_FRAME(16, 16, 0, 0),
+ AFFINEANIMCMD_FRAME(16, 16, 0, 15),
+ AFFINEANIMCMD_END,
+};
+static const union AffineAnimCmd gSpriteAffineAnim_83F7774[] =
+{
+ AFFINEANIMCMD_FRAME(20, 20, 0, 0),
+ AFFINEANIMCMD_FRAME(20, 20, 0, 15),
+ AFFINEANIMCMD_END,
+};
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F778C[] =
+{
+ gSpriteAffineAnim_83F775C,
+};
+static const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7790[] =
+{
+ gSpriteAffineAnim_83F7774,
+};
+static const struct SpriteSheet gUnknown_083F7794[] =
+{
+ {gBirchBallarrow_Gfx, 0x0800, 0x1000},
+ {NULL},
+};
+static const struct SpriteSheet gUnknown_083F77A4[] =
+{
+ {gBirchCircle_Gfx, 0x0800, 0x1001},
+ {NULL},
+};
+const struct SpritePalette gUnknown_083F77B4[] =
+{
+ {gBirchBallarrow_Pal, 0x1000},
+ {gBirchCircle_Pal, 0x1001},
+ {NULL},
+};
+static void sub_810A62C(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_83F77CC =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &gOamData_83F76CC,
+ .anims = gSpriteAnimTable_83F774C,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_810A62C,
+};
+static void sub_810A68C(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_83F77E4 =
+{
+ .tileTag = 4096,
+ .paletteTag = 4096,
+ .oam = &gOamData_83F76D4,
+ .anims = gSpriteAnimTable_83F7750,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_810A68C,
+};
+static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_83F77FC =
+{
+ .tileTag = 4097,
+ .paletteTag = 4097,
+ .oam = &gOamData_83F76DC,
+ .anims = gSpriteAnimTable_83F7758,
+ .images = NULL,
+ .affineAnims = gSpriteAffineAnimTable_83F7790,
+ .callback = StarterPokemonSpriteAnimCallback,
+};
+
static void MainCallback2(void);
static void Task_StarterChoose1(u8 taskId);
static void Task_StarterChoose2(u8 taskId);
@@ -60,19 +248,12 @@ static u8 CreatePokemonFrontSprite(u16, u8, u8);
#define STARTER_PKMN_POS_X 120
#define STARTER_PKMN_POS_Y 64
-//Task data
-enum {
- TD_STARTERSELECTION,
- TD_PKMN_SPRITE_ID,
- TD_CIRCLE_SPRITE_ID,
-};
-
//Retrieves one of the available starter Pokemon
u16 GetStarterPokemon(u16 n)
{
- if(n > 3)
+ if (n > 3)
n = 0;
- return gStarterMons[n];
+ return sStarterMons[n];
}
static void VblankCallback(void)
@@ -82,14 +263,18 @@ static void VblankCallback(void)
TransferPlttBuffer();
}
+#define tStarterSelection data[0]
+#define tPkmnSpriteId data[1]
+#define tCircleSpriteId data[2]
+
void CB2_ChooseStarter(void)
{
u16 savedIme;
u8 taskId;
u8 spriteId;
-
+
SetVBlankCallback(NULL);
-
+
REG_DISPCNT = 0;
REG_BG3CNT = 0;
REG_BG2CNT = 0;
@@ -103,11 +288,11 @@ void CB2_ChooseStarter(void)
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));
@@ -116,23 +301,23 @@ void CB2_ChooseStarter(void)
ResetSpriteData();
ResetPaletteFade();
FreeAllSpritePalettes();
- LoadPalette(gBirchBagGrassPal, 0, 0x40);
- LoadCompressedObjectPic(&gUnknown_083F7794);
- LoadCompressedObjectPic(&gUnknown_083F77A4);
+ LoadPalette(gBirchBagGrassPal, 0, sizeof(gBirchBagGrassPal));
+ LoadCompressedObjectPic(&gUnknown_083F7794[0]);
+ LoadCompressedObjectPic(&gUnknown_083F77A4[0]);
LoadSpritePalettes(gUnknown_083F77B4);
SetUpWindowConfig(&gWindowConfig_81E6C3C);
InitMenuWindow(&gWindowConfig_81E6CE4);
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
-
+
savedIme = REG_IME;
REG_IME = 0;
REG_IE |= INTR_FLAG_VBLANK;
REG_IME = savedIme;
REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
-
+
SetVBlankCallback(VblankCallback);
SetMainCallback2(MainCallback2);
-
+
REG_WININ = 0x3F;
REG_WINOUT = 0x1F;
REG_WIN0H = 0;
@@ -144,14 +329,14 @@ void CB2_ChooseStarter(void)
REG_BG2CNT = 0x602;
REG_BG0CNT = 0x1F08;
REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON;
-
+
taskId = CreateTask(Task_StarterChoose1, 0);
- gTasks[taskId].data[TD_STARTERSELECTION] = 1;
-
+ gTasks[taskId].tStarterSelection = 1;
+
//Create hand sprite
spriteId = CreateSprite(&gSpriteTemplate_83F77CC, 120, 56, 2);
gSprites[spriteId].data0 = taskId;
-
+
//Create three Pokeball sprites
spriteId = CreateSprite(
&gSpriteTemplate_83F77E4,
@@ -180,7 +365,7 @@ static void MainCallback2(void)
static void Task_StarterChoose1(u8 taskId)
{
- CreateStarterPokemonLabel(0xFF, gTasks[taskId].data[TD_STARTERSELECTION]);
+ CreateStarterPokemonLabel(0xFF, gTasks[taskId].tStarterSelection);
MenuDrawTextWindow(2, 14, 27, 19);
MenuPrint(gOtherText_BirchInTrouble, 3, 15);
gTasks[taskId].func = Task_StarterChoose2;
@@ -188,60 +373,60 @@ static void Task_StarterChoose1(u8 taskId)
static void Task_StarterChoose2(u8 taskId)
{
- u8 selection = gTasks[taskId].data[TD_STARTERSELECTION];
-
- if(gMain.newKeys & A_BUTTON)
+ u8 selection = gTasks[taskId].tStarterSelection;
+
+ if (gMain.newKeys & A_BUTTON)
{
u8 spriteId;
-
+
MenuZeroFillWindowRect(
gStarterChoose_LabelCoords[selection][0],
gStarterChoose_LabelCoords[selection][1],
gStarterChoose_LabelCoords[selection][0] + 13,
gStarterChoose_LabelCoords[selection][1] + 3);
-
+
REG_WIN0H = 0;
REG_WIN0V = 0;
-
+
//Create white circle background
spriteId = CreateSprite(
&gSpriteTemplate_83F77FC,
gStarterChoose_PokeballCoords[selection][0],
gStarterChoose_PokeballCoords[selection][1],
1);
- gTasks[taskId].data[TD_CIRCLE_SPRITE_ID] = spriteId;
-
+ gTasks[taskId].tCircleSpriteId = spriteId;
+
//Create Pokemon sprite
spriteId = CreatePokemonFrontSprite(
- GetStarterPokemon(gTasks[taskId].data[TD_STARTERSELECTION]),
+ GetStarterPokemon(gTasks[taskId].tStarterSelection),
gStarterChoose_PokeballCoords[selection][0],
gStarterChoose_PokeballCoords[selection][1]);
gSprites[spriteId].affineAnims = gSpriteAffineAnimTable_83F778C;
gSprites[spriteId].callback = StarterPokemonSpriteAnimCallback;
- gTasks[taskId].data[TD_PKMN_SPRITE_ID] = spriteId;
-
+ gTasks[taskId].tPkmnSpriteId = spriteId;
+
gTasks[taskId].func = Task_StarterChoose3;
}
else
{
- if((gMain.newKeys & DPAD_LEFT) && selection > 0)
+ if ((gMain.newKeys & DPAD_LEFT) && selection > 0)
{
- gTasks[taskId].data[TD_STARTERSELECTION]--;
- CreateStarterPokemonLabel(selection, gTasks[taskId].data[TD_STARTERSELECTION]);
+ gTasks[taskId].tStarterSelection--;
+ CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection);
}
- else if((gMain.newKeys & DPAD_RIGHT) && selection < 2)
+ else if ((gMain.newKeys & DPAD_RIGHT) && selection < 2)
{
- gTasks[taskId].data[TD_STARTERSELECTION]++;
- CreateStarterPokemonLabel(selection, gTasks[taskId].data[TD_STARTERSELECTION]);
+ gTasks[taskId].tStarterSelection++;
+ CreateStarterPokemonLabel(selection, gTasks[taskId].tStarterSelection);
}
}
}
static void Task_StarterChoose3(u8 taskId)
{
- if(gSprites[gTasks[taskId].data[TD_CIRCLE_SPRITE_ID]].affineAnimEnded &&
- gSprites[gTasks[taskId].data[TD_CIRCLE_SPRITE_ID]].pos1.x == STARTER_PKMN_POS_X &&
- gSprites[gTasks[taskId].data[TD_CIRCLE_SPRITE_ID]].pos1.y == STARTER_PKMN_POS_Y)
+ if (gSprites[gTasks[taskId].tCircleSpriteId].affineAnimEnded &&
+ gSprites[gTasks[taskId].tCircleSpriteId].pos1.x == STARTER_PKMN_POS_X &&
+ gSprites[gTasks[taskId].tCircleSpriteId].pos1.y == STARTER_PKMN_POS_Y)
{
gTasks[taskId].func = Task_StarterChoose4;
}
@@ -249,7 +434,7 @@ static void Task_StarterChoose3(u8 taskId)
static void Task_StarterChoose4(u8 taskId)
{
- PlayCry1(GetStarterPokemon(gTasks[taskId].data[TD_STARTERSELECTION]), 0);
+ PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0);
MenuDrawTextWindow(2, 14, 27, 19);
//"Do you choose this POKEMON?"
MenuPrint(gOtherText_DoYouChoosePoke, 3, 15);
@@ -260,25 +445,25 @@ static void Task_StarterChoose4(u8 taskId)
static void Task_StarterChoose5(u8 taskId)
{
u8 spriteId;
-
- switch(ProcessMenuInputNoWrap_())
+
+ switch (ProcessMenuInputNoWrap_())
{
- case 0: //YES
+ case 0: // YES
//Return the starter choice and exit.
- gScriptResult = gTasks[taskId].data[TD_STARTERSELECTION];
+ gScriptResult = gTasks[taskId].tStarterSelection;
SetMainCallback2(gMain.savedCallback);
break;
- case 1: //NO
- case -1: //B button
+ case 1: // NO
+ case -1: // B button
PlaySE(SE_SELECT);
MenuZeroFillWindowRect(21, 7, 27, 12);
-
- spriteId = gTasks[taskId].data[TD_PKMN_SPRITE_ID];
+
+ spriteId = gTasks[taskId].tPkmnSpriteId;
FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum));
FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
DestroySprite(&gSprites[spriteId]);
-
- spriteId = gTasks[taskId].data[TD_CIRCLE_SPRITE_ID];
+
+ spriteId = gTasks[taskId].tCircleSpriteId;
FreeOamMatrix(gSprites[spriteId].oam.matrixNum);
DestroySprite(&gSprites[spriteId]);
gTasks[taskId].func = Task_StarterChoose6;
@@ -313,13 +498,13 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection)
u8 srcIndex;
u8 dstIndex;
u16 species;
-
+
u8 labelLeft;
u8 labelRight;
u8 labelTop;
u8 labelBottom;
-
- if(prevSelection != 0xFF)
+
+ if (prevSelection != 0xFF)
{
//Remove the old Pokemon label
MenuZeroFillWindowRect(
@@ -337,18 +522,18 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection)
SET_CHAR(labelText, 5, EXT_CTRL_CODE_BEGIN);
SET_CHAR(labelText, 6, 0x11);
SET_CHAR(labelText, 7, dstIndex);
-
+
//Copy category string to label
dstIndex = 8;
srcIndex = 0;
- while(category[srcIndex] != EOS && srcIndex <= 10)
+ while (category[srcIndex] != EOS && srcIndex <= 10)
{
labelText[dstIndex] = category[srcIndex];
srcIndex++;
dstIndex++;
}
labelText[dstIndex++] = CHAR_SPACE;
-
+
//Copy POKEMON string to label
StringCopy(labelText + dstIndex, gOtherText_Poke);
MenuPrint(
@@ -356,14 +541,14 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection)
gStarterChoose_LabelCoords[selection][0],
gStarterChoose_LabelCoords[selection][1]);
AddTextColorCtrlCode(labelText, 0, 15, 8);
-
+
//Copy Pokemon name to label
sub_8072C74(labelText + 5, gSpeciesNames[species], 0x6B, 1);
MenuPrint(
labelText,
gStarterChoose_LabelCoords[selection][0],
gStarterChoose_LabelCoords[selection][1] + 2);
-
+
labelLeft = gStarterChoose_LabelCoords[selection][0] * 8 + 4;
labelRight = (gStarterChoose_LabelCoords[selection][0] + 13) * 8 + 4;
labelTop = gStarterChoose_LabelCoords[selection][1] * 8;
@@ -372,15 +557,14 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection)
REG_WIN0V = WIN_RANGE(labelTop, labelBottom);
}
-void nullsub_72(struct Sprite *sprite)
+static void nullsub_72(struct Sprite *sprite)
{
-
}
static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
{
u8 spriteId;
-
+
DecompressPicFromTable_2(
&gMonFrontPicTable[species],
gMonFrontPicCoords[species].x, gMonFrontPicCoords[species].y,
@@ -395,33 +579,33 @@ static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y)
}
//Sprite callback
-void sub_810A62C(struct Sprite *sprite)
+static void sub_810A62C(struct Sprite *sprite)
{
- sprite->pos1.x = gUnknown_083F76E4[gTasks[sprite->data0].data[TD_STARTERSELECTION]][0];
- sprite->pos1.y = gUnknown_083F76E4[gTasks[sprite->data0].data[TD_STARTERSELECTION]][1];
+ sprite->pos1.x = gUnknown_083F76E4[gTasks[sprite->data0].tStarterSelection][0];
+ sprite->pos1.y = gUnknown_083F76E4[gTasks[sprite->data0].tStarterSelection][1];
sprite->pos2.y = Sin(sprite->data1, 8);
sprite->data1 = (u8)sprite->data1 + 4;
}
//Sprite callback
-void sub_810A68C(struct Sprite *sprite)
+static void sub_810A68C(struct Sprite *sprite)
{
- if(gTasks[sprite->data0].data[TD_STARTERSELECTION] == sprite->data1)
+ if (gTasks[sprite->data0].tStarterSelection == sprite->data1)
StartSpriteAnimIfDifferent(sprite, 1);
else
StartSpriteAnimIfDifferent(sprite, 0);
}
//Sprite callback
-void StarterPokemonSpriteAnimCallback(struct Sprite *sprite)
+static void StarterPokemonSpriteAnimCallback(struct Sprite *sprite)
{
//Move sprite to upper center of screen
- if(sprite->pos1.x > STARTER_PKMN_POS_X)
+ if (sprite->pos1.x > STARTER_PKMN_POS_X)
sprite->pos1.x -= 4;
- if(sprite->pos1.x < STARTER_PKMN_POS_X)
+ if (sprite->pos1.x < STARTER_PKMN_POS_X)
sprite->pos1.x += 4;
- if(sprite->pos1.y > STARTER_PKMN_POS_Y)
+ if (sprite->pos1.y > STARTER_PKMN_POS_Y)
sprite->pos1.y -= 2;
- if(sprite->pos1.y < STARTER_PKMN_POS_Y)
+ if (sprite->pos1.y < STARTER_PKMN_POS_Y)
sprite->pos1.y += 2;
}
diff --git a/src/string_util.c b/src/string_util.c
index a7f9c3d1f..e537cff3a 100644
--- a/src/string_util.c
+++ b/src/string_util.c
@@ -2,29 +2,12 @@
#include "string_util.h"
#include "text.h"
-#define MAX_PLACEHOLDER_ID 0xD
-
-static u8 *ExpandPlaceholder_UnknownStringVar(void);
-static u8 *ExpandPlaceholder_PlayerName(void);
-static u8 *ExpandPlaceholder_StringVar1(void);
-static u8 *ExpandPlaceholder_StringVar2(void);
-static u8 *ExpandPlaceholder_StringVar3(void);
-static u8 *ExpandPlaceholder_KunChan(void);
-static u8 *ExpandPlaceholder_RivalName(void);
-static u8 *ExpandPlaceholder_Version(void);
-static u8 *ExpandPlaceholder_EvilTeam(void);
-static u8 *ExpandPlaceholder_GoodTeam(void);
-static u8 *ExpandPlaceholder_EvilLeader(void);
-static u8 *ExpandPlaceholder_GoodLeader(void);
-static u8 *ExpandPlaceholder_EvilLegendary(void);
-static u8 *ExpandPlaceholder_GoodLegendary(void);
-
u8 gUnknownStringVar[16];
-const u8 gEmptyString_81E72B0[] = _"";
-const u8 gRightPointingTriangleString[] = _"▶";
+const u8 gEmptyString_81E72B0[] = _("");
+const u8 gRightPointingTriangleString[] = _("▶");
-static const u8 sDigits[] = @"0123456789ABCDEF";
+static const u8 sDigits[] = __("0123456789ABCDEF");
static const s32 sPowersOfTen[] =
{
@@ -40,29 +23,6 @@ static const s32 sPowersOfTen[] =
1000000000,
};
-static const u8 sSetBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF };
-static const u8 sGotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF };
-
-typedef u8 *(*ExpandPlaceholderFunc)(void);
-
-static const ExpandPlaceholderFunc sExpandPlaceholderFuncs[] =
-{
- ExpandPlaceholder_UnknownStringVar,
- ExpandPlaceholder_PlayerName,
- ExpandPlaceholder_StringVar1,
- ExpandPlaceholder_StringVar2,
- ExpandPlaceholder_StringVar3,
- ExpandPlaceholder_KunChan,
- ExpandPlaceholder_RivalName,
- ExpandPlaceholder_Version,
- ExpandPlaceholder_EvilTeam,
- ExpandPlaceholder_GoodTeam,
- ExpandPlaceholder_EvilLeader,
- ExpandPlaceholder_GoodLeader,
- ExpandPlaceholder_EvilLegendary,
- ExpandPlaceholder_GoodLegendary,
-};
-
extern u8 gExpandedPlaceholder_Empty[];
extern u8 gExpandedPlaceholder_Kun[];
extern u8 gExpandedPlaceholder_Chan[];
@@ -445,11 +405,8 @@ u8 *StringExpandPlaceholders(u8 *dest, const u8 *src)
u8 *StringBraille(u8 *dest, const u8 *src)
{
- u8 setBrailleFont[4];
- u8 gotoLine2[5];
-
- memcpy(setBrailleFont, sSetBrailleFont, 4);
- memcpy(gotoLine2, sGotoLine2, 5);
+ u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF };
+ u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF };
dest = StringCopy(dest, setBrailleFont);
@@ -473,32 +430,32 @@ u8 *StringBraille(u8 *dest, const u8 *src)
}
}
-u8 *ExpandPlaceholder_UnknownStringVar(void)
+static u8 *ExpandPlaceholder_UnknownStringVar(void)
{
return gUnknownStringVar;
}
-u8 *ExpandPlaceholder_PlayerName(void)
+static u8 *ExpandPlaceholder_PlayerName(void)
{
return gSaveBlock2.playerName;
}
-u8 *ExpandPlaceholder_StringVar1(void)
+static u8 *ExpandPlaceholder_StringVar1(void)
{
return gStringVar1;
}
-u8 *ExpandPlaceholder_StringVar2(void)
+static u8 *ExpandPlaceholder_StringVar2(void)
{
return gStringVar2;
}
-u8 *ExpandPlaceholder_StringVar3(void)
+static u8 *ExpandPlaceholder_StringVar3(void)
{
return gStringVar3;
}
-u8 *ExpandPlaceholder_KunChan(void)
+static u8 *ExpandPlaceholder_KunChan(void)
{
if (gSaveBlock2.playerGender == MALE)
return gExpandedPlaceholder_Kun;
@@ -506,7 +463,7 @@ u8 *ExpandPlaceholder_KunChan(void)
return gExpandedPlaceholder_Chan;
}
-u8 *ExpandPlaceholder_RivalName(void)
+static u8 *ExpandPlaceholder_RivalName(void)
{
if (gSaveBlock2.playerGender == MALE)
return gExpandedPlaceholder_May;
@@ -537,10 +494,30 @@ VERSION_DEPENDENT_PLACEHOLDER_LIST
u8 *GetExpandedPlaceholder(u32 id)
{
- if (id > MAX_PLACEHOLDER_ID)
+ typedef u8 *(*ExpandPlaceholderFunc)(void);
+
+ static const ExpandPlaceholderFunc funcs[] =
+ {
+ ExpandPlaceholder_UnknownStringVar,
+ ExpandPlaceholder_PlayerName,
+ ExpandPlaceholder_StringVar1,
+ ExpandPlaceholder_StringVar2,
+ ExpandPlaceholder_StringVar3,
+ ExpandPlaceholder_KunChan,
+ ExpandPlaceholder_RivalName,
+ ExpandPlaceholder_Version,
+ ExpandPlaceholder_EvilTeam,
+ ExpandPlaceholder_GoodTeam,
+ ExpandPlaceholder_EvilLeader,
+ ExpandPlaceholder_GoodLeader,
+ ExpandPlaceholder_EvilLegendary,
+ ExpandPlaceholder_GoodLegendary,
+ };
+
+ if (id >= ARRAY_COUNT(funcs))
return gExpandedPlaceholder_Empty;
else
- return sExpandPlaceholderFuncs[id]();
+ return funcs[id]();
}
u8 *StringFill(u8 *dest, u8 c, u16 n)
diff --git a/src/strings.c b/src/strings.c
new file mode 100644
index 000000000..fed0c86e2
--- /dev/null
+++ b/src/strings.c
@@ -0,0 +1,923 @@
+#include "global.h"
+
+// placeholder strings
+const u8 gExpandedPlaceholder_Empty[] = _("");
+const u8 gExpandedPlaceholder_Kun[] = _("");
+const u8 gExpandedPlaceholder_Chan[] = _("");
+const u8 gExpandedPlaceholder_Sapphire[] = _("SAPPHIRE");
+const u8 gExpandedPlaceholder_Ruby[] = _("RUBY");
+const u8 gExpandedPlaceholder_Aqua[] = _("AQUA");
+const u8 gExpandedPlaceholder_Magma[] = _("MAGMA");
+const u8 gExpandedPlaceholder_Archie[] = _("ARCHIE");
+const u8 gExpandedPlaceholder_Maxie[] = _("MAXIE");
+const u8 gExpandedPlaceholder_Kyogre[] = _("KYOGRE");
+const u8 gExpandedPlaceholder_Groudon[] = _("GROUDON");
+const u8 gExpandedPlaceholder_Brendan[] = _("BRENDAN");
+const u8 gExpandedPlaceholder_May[] = _("MAY");
+
+// system text
+const u8 gSystemText_Egg[] = _("EGG");
+const u8 gSystemText_Pokemon2[] = _("POKéMON");
+
+// main menu text
+const u8 gMainMenuString_NewGame[] = _("NEW GAME");
+const u8 gMainMenuString_Continue[] = _("CONTINUE");
+const u8 gMainMenuString_Option[] = _("OPTION");
+const u8 gMainMenuString_MysteryEvents[] = _("MYSTERY EVENTS");
+
+// system text 2
+const u8 SystemText_UpdatingSaveExternal[] = _("Updating save file using external\ndata. Please wait.");
+const u8 SystemText_SaveUpdated[] = _("The save file has been updated.");
+const u8 SystemText_SaveUpdatedExchangeBackup[] = _("The save file has been updated.\pFurther game data cannot be saved\nto the backup memory.\pPlease exchange the backup memory.\pFor details, please contact the\nNintendo Service Center.");
+const u8 SystemText_SaveNotUpdated[] = _("The save file could not be updated.\pPlease exchange the backup\nmemory.\pFor details, please contact the\nNintendo Service Center.");
+
+// save file text
+const u8 gSaveFileCorruptMessage[] = _("The save file is corrupt. The\nprevious save file will be loaded.");
+const u8 gSaveFileDeletedMessage[] = _(" The save file has been deleted...");
+
+// system text 3
+const u8 gBoardNotInstalledMessage[] = _("The 1M sub-circuit board is\nnot installed.");
+const u8 gBatteryDryMessage[] = _("The internal battery has run dry.\nThe game can be played.\pHowever, clock-based events will\nno longer occur.");
+
+// main menu text 2
+const u8 gMainMenuString_Player[] = _("PLAYER");
+const u8 gMainMenuString_Pokedex[] = _("POKéDEX");
+const u8 gMainMenuString_Time[] = _("TIME");
+const u8 gMainMenuString_Badges[] = _("BADGES");
+
+// birch text
+const u8 gBirchText_Boy[] = _("BOY");
+const u8 gBirchText_Girl[] = _("GIRL");
+const u8 gBirchText_NewName[] = _("NEW NAME");
+
+#ifdef SAPPHIRE
+const u8 gDefaultBoyName1[] = _("SEAN");
+#else
+const u8 gDefaultBoyName1[] = _("LANDON");
+#endif
+const u8 gDefaultBoyName2[] = _("TERRY");
+const u8 gDefaultBoyName3[] = _("SETH");
+const u8 gDefaultBoyName4[] = _("TOM");
+
+#ifdef SAPPHIRE
+const u8 gDefaultGirlName1[] = _("MARINA");
+#else
+const u8 gDefaultGirlName1[] = _("TERRA");
+#endif
+const u8 gDefaultGirlName2[] = _("KIMMY");
+const u8 gDefaultGirlName3[] = _("NICOLA");
+const u8 gDefaultGirlName4[] = _("SARA");
+
+const u8 gSystemText_IntroWeCall[] = _("This is what we call\na POKéMON.");
+const u8 gSystemText_NewPara[] = _("\p");
+
+const u8 gDexText_UnknownPoke[] = _(" ????? POKéMON");
+const u8 gDexText_UnknownHeight[] = _("{CLEAR_TO 0x0C}??’??”");
+const u8 gDexText_UnknownWeight[] = _("????.? lbs.$"); // extra terminator?
+const u8 gDexText_CryOf[] = _("{CLEAR_TO 2}CRY OF$"); // extra terminator?
+const u8 gDexText_SizeComparedTo[] = _("SIZE COMPARED TO ");
+const u8 gDexText_RegisterComplete[] = _("POKéDEX registration completed.");
+const u8 gDexText_Searching[] = _("Searching...\nPlease wait.");
+const u8 gDexText_SearchComplete[] = _("Search completed.");
+const u8 gDexText_NoMatching[] = _("No matching POKéMON were found.");
+
+const u8 DexText_SearchForPoke[] = _("Search for POKéMON based on\nselected parameters.");
+const u8 DexText_SwitchDex[] = _("Switch POKéDEX listings.");
+const u8 DexText_ReturnToDex[] = _("Return to the POKéDEX.");
+const u8 DexText_SelectDexMode[] = _("Select the POKéDEX mode.");
+const u8 DexText_SelectDexList[] = _("Select the POKéDEX listing mode.");
+const u8 DexText_ListByABC[] = _("List by the first letter in the name.\n/Spotted POKéMON only.");
+const u8 DexText_ListByColor[] = _("List by body color.\n/Spotted POKéMON only.");
+const u8 DexText_ListByType[] = _("List by type.\n/Owned POKéMON only.");
+const u8 DexText_ExecuteSearchSwitch[] = _("Execute search/switch.");
+const u8 DexText_HoennDex[] = _("HOENN DEX");
+const u8 DexText_NationalDex[] = _("NATIONAL DEX");
+const u8 DexText_NumericalMode[] = _("NUMERICAL MODE");
+const u8 DexText_ABCMode[] = _("A TO Z MODE");
+const u8 DexText_HeaviestMode[] = _("HEAVIEST MODE");
+const u8 DexText_LightestMode[] = _("LIGHTEST MODE");
+const u8 DexText_TallestMode[] = _("TALLEST MODE");
+const u8 DexText_SmallestMode[] = _("SMALLEST MODE");
+const u8 DexText_ABC[] = _("ABC");
+const u8 DexText_DEF[] = _("DEF");
+const u8 DexText_GHI[] = _("GHI");
+const u8 DexText_JKL[] = _("JKL");
+const u8 DexText_MNO[] = _("MNO");
+const u8 DexText_PQR[] = _("PQR");
+const u8 DexText_STU[] = _("STU");
+const u8 DexText_VWX[] = _("VWX");
+const u8 DexText_YZ[] = _("YZ");
+const u8 DexText_Red[] = _("RED");
+const u8 DexText_Blue[] = _("BLUE");
+const u8 DexText_Yellow[] = _("YELLOW");
+const u8 DexText_Green[] = _("GREEN");
+const u8 DexText_Black[] = _("BLACK");
+const u8 DexText_Brown[] = _("BROWN");
+const u8 DexText_Purple[] = _("PURPLE");
+const u8 DexText_Gray[] = _("GRAY");
+const u8 DexText_White[] = _("WHITE");
+const u8 DexText_Pink[] = _("PINK");
+const u8 DexText_HoennDex2[] = _("HOENN region’s POKéDEX");
+const u8 DexText_NationalDex2[] = _("National edition POKéDEX");
+const u8 DexText_ListByNumber[] = _("POKéMON are listed according to their\nnumber.");
+const u8 DexText_ListByABC2[] = _("Spotted and owned POKéMON are listed\nalphabetically.");
+const u8 DexText_ListByHeavyToLightest[] = _("Owned POKéMON are listed from the\nheaviest to the lightest.");
+const u8 DexText_ListByLightToHeaviest[] = _("Owned POKéMON are listed from the\nlightest to the heaviest.");
+const u8 DexText_ListByTallToSmallest[] = _("Owned POKéMON are listed from the\ntallest to the smallest.");
+const u8 DexText_ListBySmallToTallest[] = _("Owned POKéMON are listed from the\nsmallest to the tallest.");
+const u8 DexText_Terminator5[] = _("");
+const u8 DexText_DontSpecify[] = _("DON’T SPECIFY.");
+const u8 DexText_None[] = _("NONE");
+const u8 DexText_RightPointingTriangle[] = _("▶"); // right pointing triangle
+const u8 DexText_Terminator6[] = _(" ");
+
+const u8 gMenuText_WelcomeToHOFAndDexRating[] = _("Welcome to the HALL OF FAME!$Spotted POKéMON: {STR_VAR_1}!\nOwned POKéMON: {STR_VAR_2}!\pPROF. BIRCH’s POKéDEX rating!\pPROF. BIRCH: Let’s see...\p");
+const u8 gMenuText_HOFSaving[] = _("SAVING...\nDON’T TURN OFF THE POWER.");
+const u8 gMenuText_HOFCorrupt[] = _("The HALL OF FAME data is corrupt.");
+const u8 gMenuText_HOFNumber[] = _("HALL OF FAME No. ");
+const u8 gMenuText_HOFCongratulations[] = _("LEAGUE CHAMPION!\nCONGRATULATIONS!");
+
+const u8 gOtherText_Number2[] = _("No. ");
+const u8 gOtherText_Level3[] = _("Lv. ");
+const u8 gOtherText_IDNumber[] = _("IDNo. /");
+const u8 gOtherText_Name[] = _("NAME /");
+const u8 gOtherText_IDNumber2[] = _("IDNo. /");
+const u8 gOtherText_BirchInTrouble[] = _("{HIGHLIGHT WHITE2}{COLOR DARK_GREY}PROF. BIRCH is in trouble!\nRelease a POKéMON and rescue him!");
+const u8 gOtherText_DoYouChoosePoke[] = _("{HIGHLIGHT WHITE2}{COLOR DARK_GREY}Do you choose this POKéMON?");
+const u8 gOtherText_Poke[] = _("POKéMON");
+
+const u8 gSystemText_SaveErrorExchangeBackup[] = _("Save error.\pPlease exchange the\nbackup memory.");
+const u8 gOtherText_FlyToWhere[] = _("FLY to where?");
+
+const u8 OtherText_Use[] = _("USE");
+const u8 OtherText_Toss[] = _("TOSS");
+const u8 OtherText_Register[] = _("REGISTER");
+const u8 OtherText_Give2[] = _("GIVE");
+const u8 OtherText_CheckTag[] = _("CHECK TAG");
+const u8 OtherText_Confirm[] = _("CONFIRM");
+const u8 gOtherText_Walk[] = _("WALK");
+
+const u8 gUnknownText_Exit[] = _("EXIT");
+const u8 gOtherText_CancelNoTerminator[] = _("CANCEL");
+const u8 gOtherText_CancelWithTerminator[] = _("$CANCEL"); // with terminator at beginning?
+
+const u8 OtherText_Item[] = _("ITEM");
+const u8 OtherText_Mail[] = _("MAIL");
+const u8 OtherText_Take2[] = _("TAKE");
+const u8 OtherText_Store[] = _("STORE");
+
+const u8 gOtherText_Check[] = _("CHECK");
+const u8 gOtherText_None[] = _("NONE");
+
+const u8 gOtherText_ThreeQuestions2[] = _("???");
+
+const u8 gOtherText_FiveQuestionsAndSlash[] = _("?????$/");
+
+const u8 gOtherText_OneDash[] = _("-");
+const u8 gOtherText_TwoDashes[] = _("--");
+const u8 gOtherText_ThreeDashes2[] = _("---");
+const u8 gOtherText_MaleSymbol2[] = _("♂");
+const u8 gOtherText_FemaleSymbolAndLv[] = _("♀$Lv.");
+const u8 gOtherText_TallPlusAndRightArrow[] = _("{TALL_PLUS}${RIGHT_ARROW}");
+const u8 gMenuText_GoBackToPrev[] = _("Go back to the\nprevious menu.");
+const u8 gOtherText_WhatWillYouDo[] = _("What would you like to do?");
+
+const u8 gOtherText_xString1[] = _("×{STR_VAR_1}");
+const u8 gOtherText_Berry2[] = _(" BERRY");
+const u8 gOtherText_Coins2[] = _("{STR_VAR_1} COINS");
+const u8 gOtherText_CloseBag[] = _("CLOSE BAG");
+
+const u8 OtherText_TheField3[] = _("the field.");
+const u8 OtherText_TheBattle[] = _("the battle.");
+const u8 OtherText_ThePokeList[] = _("the POKéMON LIST.");
+const u8 OtherText_TheShop[] = _("the shop.");
+const u8 OtherText_TheField[] = _("the field.");
+const u8 OtherText_TheField2[] = _("the field.");
+const u8 OtherText_ThePC[] = _("the PC.");
+
+const struct TextStruct gUnknown_0840E740[7] =
+{
+ OtherText_TheField3,
+ OtherText_TheBattle,
+ OtherText_ThePokeList,
+ OtherText_TheShop,
+ OtherText_TheField,
+ OtherText_TheField2,
+ OtherText_ThePC,
+};
+
+const u8 gOtherText_ReturnTo[] = _("Return to");
+const u8 gOtherText_WhatWillYouDo2[] = _("What would you\nlike to do?");
+const u8 gOtherText_CantWriteMail[] = _("You can’t write\nMAIL here.");
+const u8 gOtherText_NoPokemon[] = _("There is no\nPOKéMON.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_SwitchWhichItem[] = _("Switch with which\nitem?");
+const u8 gOtherText_CantBeHeld[] = _("{STR_VAR_1} can’t be held.");
+const u8 gOtherText_CantBeHeldHere[] = _("{STR_VAR_1} can’t be held here.");
+const u8 gOtherText_HowManyToDeposit[] = _("How many do you\nwant to deposit?");
+const u8 gOtherText_DepositedItems[] = _("Deposited {STR_VAR_2}\n{STR_VAR_1}(s).");
+const u8 gOtherText_NoRoomForItems[] = _("There’s no room to\nstore items.");
+const u8 gOtherText_CantStoreSomeoneItem[] = _("You can’t store\nsomeone else’s item\nin the PC.");
+const u8 gOtherText_TooImportant[] = _("That’s much too\nimportant to toss\nout!");
+const u8 gOtherText_HowManyToToss[] = _("Toss out how many?");
+const u8 gOtherText_ThrewAwayItem[] = _("Threw away {STR_VAR_2}\n{STR_VAR_1}(s).");
+const u8 gOtherText_OkayToThrowAwayPrompt[] = _("Is it okay to\nthrow away {STR_VAR_2}\n{STR_VAR_1}(s)?");
+const u8 gOtherText_DadsAdvice[] = _("DAD’s advice...\n{PLAYER}, there’s a time and place for\leverything!{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_CantGetOffBike[] = _("You can’t dismount your BIKE here.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_ItemfinderResponding[] = _("Oh!\nThe machine’s responding!\pThere’s an item buried around here!{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_ItemfinderItemUnderfoot[] = _("The machine’s indicating something\nright underfoot!{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_NoResponse[] = _("... ... ... ... Nope!\nThere’s no response.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_Coins3[] = _("Your COINS:\n{STR_VAR_1}{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_BootedTM[] = _("Booted up a TM.");
+const u8 gOtherText_BootedHM[] = _("Booted up an HM.");
+const u8 gOtherText_ContainsMove[] = _("It contained\n{STR_VAR_1}.\pTeach {STR_VAR_1}\nto a POKéMON?");
+const u8 gOtherText_UsedItem[] = _("{PLAYER} used the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_RepelLingers[] = _("But the effects of a REPEL lingered\nfrom earlier.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_UsedFlute[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be lured.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_UsedRepel[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be repelled.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_BoxIsFull[] = _("The BOX is full.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_Size[] = _("SIZE /");
+const u8 gOtherText_Firm[] = _("FIRM /");
+
+const u8 gContestStatsText_Unknown1[] = _("{STR_VAR_1}.{STR_VAR_2}”");
+
+const u8 ContestStatsText_VerySoft[] = _("Very soft");
+const u8 ContestStatsText_Soft[] = _("Soft");
+const u8 ContestStatsText_Hard[] = _("Hard");
+const u8 ContestStatsText_VeryHard[] = _("Very hard");
+const u8 ContestStatsText_SuperHard[] = _("Super hard");
+
+const u8 ContestStatsText_RedPokeBlock[] = _("RED {POKEBLOCK}");
+const u8 ContestStatsText_BluePokeBlock[] = _("BLUE {POKEBLOCK}");
+const u8 ContestStatsText_PinkPokeBlock[] = _("PINK {POKEBLOCK}");
+const u8 ContestStatsText_GreenPokeBlock[] = _("GREEN {POKEBLOCK}");
+const u8 ContestStatsText_YellowPokeBlock[] = _("YELLOW {POKEBLOCK}");
+const u8 ContestStatsText_PurplePokeBlock[] = _("PURPLE {POKEBLOCK}");
+const u8 ContestStatsText_IndigoPokeBlock[] = _("INDIGO {POKEBLOCK}");
+const u8 ContestStatsText_BrownPokeBlock[] = _("BROWN {POKEBLOCK}");
+const u8 ContestStatsText_LiteBluePokeBlock[] = _("LITEBLUE {POKEBLOCK}");
+const u8 ContestStatsText_OlivePokeBlock[] = _("OLIVE {POKEBLOCK}");
+const u8 ContestStatsText_GrayPokeBlock[] = _("GRAY {POKEBLOCK}");
+const u8 ContestStatsText_BlackPokeBlock[] = _("BLACK {POKEBLOCK}");
+const u8 ContestStatsText_WhitePokeBlock[] = _("WHITE {POKEBLOCK}");
+const u8 ContestStatsText_GoldPokeBlock[] = _("GOLD {POKEBLOCK}");
+
+const u8 gContestStatsText_Spicy[] = _("SPICY");
+const u8 gContestStatsText_Dry[] = _("DRY");
+const u8 gContestStatsText_Sweet[] = _("SWEET");
+const u8 gContestStatsText_Bitter[] = _("BITTER");
+const u8 gContestStatsText_Sour[] = _("SOUR$TASTY$FEEL"); // tasty is unused, feel might not be
+
+const u8 gContestStatsText_StowCase[] = _("Stow CASE.");
+const u8 gContestStatsText_ThrowAwayPrompt[] = _("Throw away this\n{STR_VAR_1}?");
+const u8 gContestStatsText_WasThrownAway[] = _("The {STR_VAR_1}\nwas thrown away.");
+const u8 gContestStatsText_NormallyAte[] = _("{STR_VAR_1} ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gContestStatsText_HappilyAte[] = _("{STR_VAR_1} happily ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gContestStatsText_DisdainfullyAte[] = _("{STR_VAR_1} disdainfully ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+
+const u8 MartText_Buy[] = _("BUY");
+const u8 MartText_Sell[] = _("SELL");
+const u8 MartText_Quit2[] = _("QUIT");
+
+const u8 gOtherText_QuitShopping[] = _("Quit shopping.");
+
+const u8 gOtherText_HowManyYouWant[] = _("{STR_VAR_1}? Certainly.\nHow many would you like?");
+const u8 gOtherText_ThatWillBe[] = _("{STR_VAR_1}? And you wanted {STR_VAR_2}?\nThat will be ¥{STR_VAR_3}.");
+const u8 gOtherText_ThatWillBe2[] = _("{STR_VAR_1}, is it?\nThat’ll be ¥{STR_VAR_2}. Do you want it?");
+const u8 gOtherText_ThatWillBe3[] = _("You wanted {STR_VAR_1}?\nThat’ll be ¥{STR_VAR_2}. Will that be okay?");
+const u8 gOtherText_HereYouGo[] = _("Here you go!\nThank you very much.");
+const u8 gOtherText_HereYouGo2[] = _("Thank you!\nI’ll send it to your home PC.");
+const u8 gOtherText_HereYouGo3[] = _("Thanks!\nI’ll send it to your PC at home.");
+const u8 gOtherText_NotEnoughMoney[] = _("You don’t have enough money.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_NoRoomFor[] = _("You have no more room for items.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_SpaceForIsFull[] = _("The space for {STR_VAR_1} is full.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_AnythingElse[] = _("Is there anything else I can help\nyou with?");
+const u8 gOtherText_CanIHelpYou[] = _("Can I help you with anything else?");
+const u8 gOtherText_FreePremierBall[] = _("I’ll throw in a PREMIER BALL, too.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_CantBuyThat[] = _("{STR_VAR_2}? Oh, no.\nI can’t buy that.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_HowManyToSell[] = _("{STR_VAR_2}?\nHow many would you like to sell?");
+const u8 gOtherText_CanPay[] = _("I can pay ¥{STR_VAR_1}.\nWould that be okay?");
+const u8 gOtherText_SoldItem[] = _("Turned over the {STR_VAR_2}\nand received ¥{STR_VAR_1}.");
+
+const u8 OtherText_Money[] = _("¥{STR_VAR_1}");
+const u8 OtherText_Shift[] = _("SHIFT");
+const u8 OtherText_SendOut[] = _("SEND OUT");
+const u8 OtherText_Switch2[] = _("SWITCH");
+const u8 OtherText_Summary[] = _("SUMMARY");
+const u8 OtherText_Moves[] = _("MOVES");
+const u8 OtherText_Enter2[] = _("ENTER");
+const u8 OtherText_NoEntry[] = _("NO ENTRY");
+const u8 OtherText_Take[] = _("TAKE");
+const u8 OtherText_Read2[] = _("READ");
+
+const u8 gOtherText_Hp2[] = _("HP");
+const u8 gOtherText_SpAtk2[] = _("SP. ATK");
+const u8 gOtherText_SpDef2[] = _("SP. DEF");
+const u8 gOtherText_WontHaveAnyEffect[] = _("It won’t have any effect.{PAUSE_UNTIL_PRESS}");
+
+#if REVISION >= 1
+const u8 gOtherText_CantUseOnPoke[] = _("This can’t be used on\nthat POKéMON.{PAUSE_UNTIL_PRESS}");
+#else
+const u8 gOtherText_CantUseOnPoke[] = _("This item can’t be used on\nthat POKéMON.{PAUSE_UNTIL_PRESS}");
+#endif
+
+const u8 gOtherText_CantBeSwitched[] = _("{STR_VAR_1} can’t be switched\nout!{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_AlreadyBattle[] = _("{STR_VAR_1} is already\nin battle!{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_AlreadySelected[] = _("{STR_VAR_1} has already been\nselected.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_NoEnergyLeft[] = _("{STR_VAR_1} has no energy\nleft to battle!{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_CantSwitchPokeWithYours[] = _("You can’t switch {STR_VAR_1}’s\nPOKéMON with one of yours!{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_EGGCantBattle[] = _("An EGG can’t battle!{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_CantBeUsedBadge[] = _("This can’t be used until a new\nBADGE is obtained.");
+const u8 gOtherText_NoMoreThreePoke[] = _("No more than three POKéMON\nmay enter.");
+const u8 gOtherText_SendRemovedMailPrompt[] = _("Send the removed MAIL to\nyour PC?");
+const u8 gOtherText_MailWasSent[] = _("The MAIL was sent to your PC.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_MailboxIsFull[] = _("Your PC’s MAILBOX is full.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_MailRemovedMessageLost[] = _("If the MAIL is removed, the\nmessage will be lost. Okay?");
+const u8 gOtherText_MailMustBeRemoved[] = _("MAIL must be removed before\nholding an item.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_WasGivenToHold[] = _("{STR_VAR_1} was given the\n{STR_VAR_2} to hold.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_AlreadyHolding[] = _("{STR_VAR_1} is already holding\none {STR_VAR_2}.\pWould you like to switch the\ntwo items?");
+const u8 gOtherText_NotHoldingAnything[] = _("{STR_VAR_1} isn’t\nholding anything.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_ReceivedTheThingFrom[] = _("Received the {STR_VAR_2}\nfrom {STR_VAR_1}.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_MailTaken[] = _("MAIL was taken from the\nPOKéMON.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_TakenAndReplaced[] = _("The {STR_VAR_2} was taken and\nreplaced with the {STR_VAR_1}.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_PokeHoldingItemCantMail[] = _("This POKéMON is holding an item.\nIt cannot hold MAIL.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_MailTransferredMailbox[] = _("MAIL was transferred from\nthe MAILBOX.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_BagFullCannotRemoveItem[] = _("The BAG is full. The POKéMON’s\nitem could not be removed.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_LearnedMove[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!");
+const u8 gOtherText_NotCompatible[] = _("{STR_VAR_1} and {STR_VAR_2}\nare not compatible.\p{STR_VAR_2} can’t be learned.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_WantsToLearn[] = _("{STR_VAR_1} wants to learn the\nmove {STR_VAR_2}.\pHowever, {STR_VAR_1} already\nknows four moves.\pShould a move be deleted and\nreplaced with {STR_VAR_2}?");
+const u8 gOtherText_StopTryingTo[] = _("Stop trying to teach\n{STR_VAR_2}?");
+const u8 gOtherText_DidNotLearnMove2[] = _("{STR_VAR_1} did not learn the\nmove {STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_WhichMoveToForget2[] = _("Which move should be forgotten?{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_ForgetMove123_2[] = _("{PAUSE 32}1, {PAUSE 15}2, and{PAUSE 15}... {PAUSE 15}... {PAUSE 15}... {PAUSE 15}{PLAY_SE SE_KON}Poof!\p{STR_VAR_1} forgot how to\nuse {STR_VAR_2}.\pAnd...{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_AlreadyKnows[] = _("{STR_VAR_1} already knows\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_HPRestoredBy[] = _("{STR_VAR_1}’s HP was restored by\n{STR_VAR_2} points.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_CuredPoisoning[] = _("{STR_VAR_1} was cured of its\npoisoning.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_CuredParalysis[] = _("{STR_VAR_1} was cured of\nparalysis.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_WokeUp[] = _("{STR_VAR_1} woke up.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_BurnHealed[] = _("{STR_VAR_1}’s burn was healed.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_ThawedOut[] = _("{STR_VAR_1} was thawed out.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_PPRestored[] = _("PP was restored.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_RegainedHealth[] = _("{STR_VAR_1} regained health.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_BecameHealthy[] = _("{STR_VAR_1} became healthy.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_PPIncreased[] = _("{STR_VAR_1}’s PP increased.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_ElevatedTo[] = _("{STR_VAR_1} was elevated to\nLv. {STR_VAR_2}.");
+const u8 gOtherText_WasRaised[] = _("{STR_VAR_1}’s {STR_VAR_2} was\nraised.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_SnapConfusion[] = _("{STR_VAR_1} snapped out of its\nconfusion.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_GotOverLove[] = _("{STR_VAR_1} got over its\ninfatuation.{PAUSE_UNTIL_PRESS}");
+const u8 OtherText_ChoosePoke[] = _("Choose a POKéMON.");
+const u8 OtherText_MovePokeTo[] = _("Move to where?");
+const u8 OtherText_TeachWhat[] = _("Teach which POKéMON?");
+const u8 OtherText_UseWhat[] = _("Use on which POKéMON?");
+const u8 OtherText_GiveWhat[] = _("Give to which POKéMON?");
+const u8 OtherText_DoWhat[] = _("Do what with {STR_VAR_1}?");
+const u8 OtherText_NothingToCut[] = _("There’s nothing to CUT.");
+const u8 OtherText_CantSurf[] = _("You can’t SURF here.");
+const u8 OtherText_AlreadySurfing[] = _("You’re already SURFING.");
+const u8 OtherText_CantUseThatHere[] = _("Can’t use that here.");
+const u8 OtherText_RestoreWhatMove[] = _("Restore which move?");
+const u8 OtherText_BoostPP[] = _("Boost PP of which move?");
+const u8 OtherText_DoWhatWithItem[] = _("Do what with an item?");
+const u8 OtherText_NoPokeForBattle[] = _("No POKéMON for battle!");
+const u8 OtherText_ChoosePoke2[] = _("Choose a POKéMON.");
+const u8 OtherText_NotEnoughHP[] = _("Not enough HP...");
+const u8 OtherText_ThreePokeNeeded[] = _("Three POKéMON are needed.");
+const u8 OtherText_PokeCantBeSame[] = _("POKéMON can’t be the same.");
+const u8 OtherText_NoIdenticalHoldItems[] = _("No identical hold items.");
+const u8 OtherText_TeachWhichPoke[] = _("Teach which POKéMON?");
+const u8 gOtherText_Attack[] = _("ATTACK");
+const u8 gOtherText_Defense[] = _("DEFENSE");
+const u8 gOtherText_SpAtk[] = _("SP. ATK");
+const u8 gOtherText_SpDef[] = _("SP. DEF");
+const u8 gOtherText_Speed[] = _("SPEED");
+const u8 gOtherText_HP[] = _("HP");
+const u8 gOtherText_Terminator18[] = _("");
+const u8 gOtherText_OriginalTrainer[] = _("OT/");
+const u8 gOtherText_Type2[] = _("TYPE/");
+const u8 gOtherText_Power2[] = _("POWER");
+const u8 gOtherText_Accuracy2[] = _("ACCURACY");
+const u8 gOtherText_Appeal2[] = _("APPEAL");
+const u8 gOtherText_Jam2[] = _("JAM");
+const u8 gOtherText_Status[] = _("STATUS");
+const u8 gOtherText_ExpPoints[] = _("EXP. POINTS");
+const u8 gOtherText_NextLv[] = _("NEXT LV.");
+const u8 gOtherText_Ribbons00[] = _("RIBBONS: 00");
+
+const u8 OtherText_Event[] = _("EVENT");
+const u8 OtherText_Switch[] = _("SWITCH");
+const u8 OtherText_PokeInfo[] = _("POKéMON INFO");
+const u8 OtherText_PokeSkills[] = _("POKéMON SKILLS");
+const u8 OtherText_BattleMoves[] = _("BATTLE MOVES");
+const u8 OtherText_ContestMoves[] = _("C0NTEST MOVES"); // why the l33t 0, that's stupid
+const u8 OtherText_Info[] = _("INFO");
+
+const u8 gOtherText_EggLongTime[] = _("It looks like this EGG will\ntake a long time to hatch.");
+const u8 gOtherText_EggSomeTime[] = _("What will hatch from this?\nIt will take some time.");
+const u8 gOtherText_EggSoon[] = _("It moves occasionally.\nIt should hatch soon.");
+const u8 gOtherText_EggAbout[] = _("It’s making sounds.\nIt’s about to hatch!");
+const u8 gOtherText_CantForgetHMs[] = _("HM moves can’t be\nforgotten now.");
+const u8 gOtherText_PlayersBase[] = _("’s BASE");
+const u8 gOtherText_OkayToDeleteFromRegistry[] = _("Is it okay to delete {STR_VAR_1}\nfrom the REGISTRY?");
+const u8 gOtherText_RegisteredDataDeleted[] = _("The registered data was deleted.{PAUSE_UNTIL_PRESS}");
+
+const u8 gSecretBaseText_NoRegistry[] = _("There is no REGISTRY.{PAUSE_UNTIL_PRESS}");
+const u8 SecretBaseText_DelRegist[] = _("DEL REGIST.");
+const u8 SecretBaseText_Decorate[] = _("DECORATE");
+const u8 SecretBaseText_PutAway[] = _("PUT AWAY");
+const u8 SecretBaseText_Toss[] = _("TOSS");
+const u8 SecretBaseText_PutOutDecor[] = _("Put out the selected decoration item.");
+const u8 SecretBaseText_StoreChosenDecor[] = _("Store the chosen decoration in the PC.");
+const u8 SecretBaseText_ThrowAwayDecor[] = _("Throw away unwanted decorations.");
+const u8 gSecretBaseText_NoDecors[] = _("There are no decorations.{PAUSE_UNTIL_PRESS}");
+const u8 SecretBaseText_Desk[] = _("DESK");
+const u8 SecretBaseText_Chair[] = _("CHAIR");
+const u8 SecretBaseText_Plant[] = _("PLANT");
+const u8 SecretBaseText_Ornament[] = _("ORNAMENT");
+const u8 SecretBaseText_Mat[] = _("MAT");
+const u8 SecretBaseText_Poster[] = _("POSTER");
+const u8 SecretBaseText_Doll[] = _("DOLL");
+const u8 SecretBaseText_Cushion[] = _("CUSHION");
+const u8 gSecretBaseText_GoldRank[] = _("GOLD");
+const u8 gSecretBaseText_SilverRank[] = _("SILVER");
+const u8 gSecretBaseText_PlaceItHere[] = _("Place it here?");
+const u8 gSecretBaseText_CantBePlacedHere[] = _("It can’t be placed here.");
+const u8 gSecretBaseText_CancelDecorating[] = _("Cancel decorating?");
+const u8 gSecretBaseText_InUseAlready[] = _("This is in use already.");
+const u8 gSecretBaseText_NoMoreDecor[] = _("No more decorations can be placed.\nThe most that can be placed is {STR_VAR_1}.");
+const u8 gSecretBaseText_NoMoreDecor2[] = _("No more decorations can be placed.\nThe most that can be placed is {STR_VAR_1}.$This can’t be placed here.\nIt must be on a DESK, etc.");
+const u8 gSecretBaseText_DecorCantPlace[] = _("This decoration can’t be placed in\nyour own room.");
+const u8 gSecretBaseText_DecorInUse[] = _("This decoration is in use.\nIt can’t be thrown away.");
+const u8 gSecretBaseText_WillBeDiscarded[] = _("This {STR_VAR_1} will be discarded.\nIs that okay?");
+const u8 gSecretBaseText_DecorThrownAway[] = _("The decoration item was thrown away.");
+const u8 gSecretBaseText_StopPuttingAwayDecor[] = _("Stop putting away decorations?");
+const u8 gSecretBaseText_NoDecor[] = _("There is no decoration item here.");
+const u8 gSecretBaseText_ReturnDecor[] = _("Return this decoration to the PC?");
+const u8 gSecretBaseText_DecorReturned[] = _("The decoration was returned to the PC.");
+const u8 gSecretBaseText_NoDecorInUse[] = _("There are no decorations in use.{PAUSE_UNTIL_PRESS}");
+const u8 SecretBaseText_Tristan[] = _("TRISTAN");
+const u8 SecretBaseText_Philip[] = _("PHILIP");
+const u8 SecretBaseText_Dennis[] = _("DENNIS");
+const u8 SecretBaseText_Roberto[] = _("ROBERTO");
+const u8 SecretBaseText_TurnOff[] = _("TURN OFF");
+const u8 SecretBaseText_Decoration[] = _("DECORATION");
+const u8 SecretBaseText_ItemStorage[] = _("ITEM STORAGE");
+
+const u8 gPCText_Mailbox[] = _("MAILBOX");
+const u8 PCText_DepositItem[] = _("DEPOSIT ITEM");
+const u8 PCText_WithdrawItem[] = _("WITHDRAW ITEM");
+const u8 PCText_TossItem[] = _("TOSS ITEM");
+const u8 PCText_StoreItems[] = _("Store items in the PC.");
+const u8 PCText_TakeOutItems[] = _("Take out items from the PC.");
+const u8 PCText_ThrowAwayItems[] = _("Throw away items stored in the PC.");
+
+const u8 gOtherText_NoItems[] = _("There are no items.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_NoMoreRoom[] = _("There is no more\nroom in the BAG.");
+const u8 gOtherText_HowManyToWithdraw[] = _("How many do you\nwant to withdraw?");
+const u8 gOtherText_WithdrewThing[] = _("Withdrew {STR_VAR_2}\n{STR_VAR_1}(s).");
+const u8 OtherText_Read[] = _("READ");
+const u8 gOtherText_MoveToBag[] = _("MOVE TO BAG");
+const u8 OtherText_Give[] = _("GIVE");
+const u8 gOtherText_NoMailHere[] = _("There’s no MAIL here.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_WhatWillYouDoMail[] = _("What would you like to do with\n{STR_VAR_1}’s MAIL?");
+const u8 gOtherText_MessageWillBeLost[] = _("The message will be lost.\nIs that okay?");
+const u8 gOtherText_BagIsFull[] = _("The BAG is full.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_MailWasReturned[] = _("The MAIL was returned to the BAG\nwith its message erased.{PAUSE_UNTIL_PRESS}");
+const u8 gOtherText_Dad[] = _("DAD");
+const u8 gOtherText_Mom[] = _("MOM");
+const u8 gOtherText_Wallace[] = _("WALLACE");
+const u8 gOtherText_Steven[] = _("STEVEN");
+const u8 gOtherText_Brawly[] = _("BRAWLY");
+const u8 gOtherText_Winona[] = _("WINONA");
+const u8 gOtherText_Phoebe[] = _("PHOEBE");
+const u8 gOtherText_Glacia[] = _("GLACIA");
+const u8 gContestText_ContestWinner[] = _("CONTEST WINNER\n");
+const u8 gOtherText_Unknown1[] = _("’s ");
+const u8 OtherText_Cool[] = _("COOL ");
+const u8 OtherText_Beauty2[] = _("BEAUTY ");
+const u8 OtherText_Cute[] = _("CUTE ");
+const u8 OtherText_Smart[] = _("SMART ");
+const u8 OtherText_Tough[] = _("TOUGH ");
+const u8 OtherText_NonstopSuperCool[] = _("Nonstop super-cool -\nthe inestimable ");
+const u8 OtherText_Terminator6[] = _("");
+const u8 OtherText_GoodLookingPoke[] = _("Hey, there!\nThe good-looking POKéMON ");
+const u8 OtherText_Terminator7[] = _("");
+const u8 OtherText_MarvelousGreat[] = _("The marvelous, wonderful, and\nvery great ");
+const u8 OtherText_Terminator8[]= _("");
+const u8 OtherText_CenturyLastVenus[]= _("This century’s last Venus -\nthe beautiful ");
+const u8 OtherText_Terminator9[]= _("");
+const u8 OtherText_Terminator10[]= _("");
+const u8 OtherText_DazzlingSmile[]= _("’s dazzling,\nglittering smile");
+const u8 OtherText_PokeCenterIdol[]= _("POKéMON CENTER’s super idol -\nthe incomparable ");
+const u8 OtherText_Terminator11[]= _("");
+const u8 OtherText_LovelyAndSweet[]= _("The lovely and sweet ");
+const u8 OtherText_Terminator12[]= _("");
+const u8 OtherText_ThePretty[]= _("The pretty ");
+const u8 OtherText_WinningPortrait[] = _("’s\nwinning portrait");
+const u8 OtherText_GiveUsWink[] = _("Give us a wink!\nThe cutie POKéMON ");
+const u8 OtherText_Terminator13[] = _("");
+const u8 OtherText_SmartnessMaestro[] = _("The smartness maestro -\nThe wise POKéMON ");
+const u8 OtherText_Terminator14[] = _("");
+const u8 OtherText_ChosenPokeAmong[] = _("The chosen POKéMON -\nThe one among POKéMON ");
+const u8 OtherText_Terminator15[] = _("");
+const u8 OtherText_TheExcellent[] = _("The excellent ");
+const u8 OtherText_ItsMomentOfElegance[] = _("’s\nmoment of elegance");
+const u8 OtherText_PowerfullyMuscular[] = _("The powerfully muscular\nspeedster ");
+const u8 OtherText_Terminator16[] = _("");
+const u8 OtherText_StrongErEst[] = _("The strong, stronger, and\nstrongest ");
+const u8 OtherText_Terminator17[] = _("");
+const u8 OtherText_MightyTough[] = _("The mighty tough\nhyper POKéMON ");
+const u8 OtherText_Exclamation[] = _("!");
+const u8 OtherText_Petalburg[] = _("PETALBURG");
+const u8 OtherText_Slateport[] = _("SLATEPORT");
+const u8 OtherText_Littleroot[] = _("LITTLEROOT"); // unused contest location?
+const u8 OtherText_Lilycove[] = _("LILYCOVE");
+const u8 OtherText_Dewford[] = _("DEWFORD");
+const u8 OtherText_Enter[] = _("ENTER");
+const u8 OtherText_Info3[] = _("INFO");
+const u8 OtherText_WhatsAContest[] = _("What’s a CONTEST?");
+const u8 OtherText_TypesOfContest[] = _("Types of CONTESTS");
+const u8 OtherText_Ranks[] = _("Ranks");
+const u8 OtherText_Judging[] = _("Judging");
+const u8 OtherText_CoolContest[] = _("COOL CONTEST");
+const u8 OtherText_BeautyContest[] = _("BEAUTY CONTEST");
+const u8 OtherText_CuteContest[] = _("CUTE CONTEST");
+const u8 OtherText_SmartContest[] = _("SMART CONTEST");
+const u8 OtherText_ToughContest[] = _("TOUGH CONTEST");
+const u8 OtherText_Decoration[] = _("DECORATION");
+const u8 OtherText_PackUp[] = _("PACK UP");
+const u8 OtherText_Count[] = _("COUNT");
+const u8 OtherText_Registry[] = _("REGISTRY");
+const u8 OtherText_Information[] = _("INFORMATION");
+const u8 OtherText_Mach[] = _("MACH");
+const u8 OtherText_Acro[] = _("ACRO");
+const u8 OtherText_Poison[] = _("PSN");
+const u8 OtherText_Paralysis[] = _("PAR");
+const u8 OtherText_Sleep[] = _("SLP");
+const u8 OtherText_Burn[] = _("BRN");
+const u8 OtherText_Frozen[] = _("FRZ");
+const u8 OtherText_Quit[] = _("QUIT");
+const u8 OtherText_SawIt[] = _("Saw it");
+const u8 OtherText_NotYet[] = _("Not yet");
+const u8 OtherText_Yes[] = _("YES");
+const u8 OtherText_No[] = _("NO");
+const u8 OtherText_Info2[] = _("INFO");
+const u8 OtherText_SingleBattle[] = _("SINGLE BATTLE");
+const u8 OtherText_DoubleBattle[] = _("DOUBLE BATTLE");
+const u8 OtherText_MultiBattle[] = _("MULTI BATTLE");
+const u8 OtherText_MrBriney[] = _("MR. BRINEY");
+const u8 OtherText_MakeAChallenge[] = _("Make a challenge.");
+const u8 OtherText_ObtainInformation[] = _("Obtain information.");
+const u8 OtherText_Lv50_2[] = _("LV. 50");
+const u8 OtherText_Lv100_2[] = _("LV. 100");
+const u8 OtherText_Zigzagoon[] = _("ZIGZAGOON");
+const u8 OtherText_Nincada[] = _("NINCADA");
+const u8 OtherText_Poochyena[] = _("POOCHYENA");
+const u8 OtherText_Nincada2[] = _("NINCADA");
+const u8 OtherText_Lotad[] = _("LOTAD");
+const u8 OtherText_Roselia[] = _("ROSELIA");
+const u8 OtherText_Shroomish[] = _("SHROOMISH");
+const u8 OtherText_Nincada3[] = _("NINCADA");
+const u8 OtherText_Surskit[] = _("SURSKIT");
+const u8 OtherText_Treecko[] = _("TREECKO");
+const u8 OtherText_Torchic[] = _("TORCHIC");
+const u8 OtherText_Mudkip[] = _("MUDKIP");
+const u8 OtherText_Seedot[] = _("SEEDOT");
+const u8 OtherText_Shroomish2[] = _("SHROOMISH");
+const u8 OtherText_Spinda[] = _("SPINDA");
+const u8 OtherText_Shroomish3[] = _("SHROOMISH");
+const u8 OtherText_Zigzagoon2[] = _("ZIGZAGOON");
+const u8 OtherText_Wurmple[] = _("WURMPLE");
+const u8 OtherText_PokeBall[] = _("POKé BALL");
+const u8 OtherText_SuperPotion[] = _("SUPER POTION");
+const u8 OtherText_SamePrice[] = _("Same price");
+const u8 OtherText_Yen135[] = _("¥135");
+const u8 OtherText_Yen155[] = _("¥155");
+const u8 OtherText_Yen175[] = _("¥175");
+const u8 OtherText_CostMore[] = _("They will cost more.");
+const u8 OtherText_CostLess[] = _("They will cost less.");
+const u8 OtherText_SamePrice2[] = _("Same price");
+const u8 OtherText_MaleSymbol[] = _("♂");
+const u8 OtherText_FemaleSymbol[] = _("♀");
+const u8 OtherText_Neither[] = _("Neither");
+const u8 OtherText_Males[] = _("Males");
+const u8 OtherText_Females[] = _("Females");
+const u8 OtherText_SameNumber[] = _("Same number");
+const u8 OtherText_Male[] = _("Male");
+const u8 OtherText_Female[] = _("Female");
+const u8 OtherText_ItDepends[] = _("It depends");
+const u8 OtherText_Six2[] = _("6");
+const u8 OtherText_Eight2[] = _("8");
+const u8 OtherText_Ten[] = _("10");
+const u8 OtherText_One[] = _("1");
+const u8 OtherText_Two[] = _("2");
+const u8 OtherText_Three[] = _("3");
+const u8 OtherText_Six[] = _("6");
+const u8 OtherText_Seven[] = _("7");
+const u8 OtherText_Eight[] = _("8");
+const u8 OtherText_FreshWater[] = _("FRESH WATER{CLEAR_TO 0x48}¥200");
+const u8 OtherText_SodaPop[] = _("SODA POP{CLEAR_TO 0x48}¥300");
+const u8 OtherText_Lemonade[] = _("LEMONADE{CLEAR_TO 0x48}¥350");
+const u8 OtherText_HowToRide[] = _("HOW TO RIDE");
+const u8 OtherText_HowToTurn[] = _("HOW TO TURN");
+const u8 OtherText_SandySlopes[] = _("SANDY SLOPES");
+const u8 OtherText_Wheelies[] = _("WHEELIES");
+const u8 OtherText_BunnyHops[] = _("BUNNY-HOPS");
+const u8 OtherText_Jumping[] = _("JUMPING");
+const u8 OtherText_Satisfied[] = _("Satisfied");
+const u8 OtherText_Dissatisfied[] = _("Dissatisfied");
+const u8 OtherText_Deepseatooth[] = _("DEEPSEATOOTH");
+const u8 OtherText_Deepseascale[] = _("DEEPSEASCALE");
+const u8 OtherText_BlueFlute2[] = _("BLUE FLUTE");
+const u8 OtherText_YellowFlute2[] = _("YELLOW FLUTE");
+const u8 OtherText_RedFlute2[] = _("RED FLUTE");
+const u8 OtherText_WhiteFlute2[] = _("WHITE FLUTE");
+const u8 OtherText_BlackFlute2[] = _("BLACK FLUTE");
+const u8 OtherText_GlassChair[] = _("GLASS CHAIR");
+const u8 OtherText_GlassDesk[] = _("GLASS DESK");
+const u8 OtherText_TreeckoDoll[] = _("TREECKO DOLL 1,000 COINS");
+const u8 OtherText_TorchicDoll[] = _("TORCHIC DOLL 1,000 COINS");
+const u8 OtherText_MudkipDoll[] = _("MUDKIP DOLL 1,000 COINS");
+const u8 OtherText_50Coins[] = _(" 50 COINS ¥1,000");
+const u8 OtherText_500Coins[] = _("500 COINS ¥10,000");
+const u8 OtherText_Excellent[] = _("Excellent!");
+const u8 OtherText_NotSoHot[] = _("Not so hot");
+const u8 OtherText_RedShard[] = _("RED SHARD");
+const u8 OtherText_YellowShard[] = _("YELLOW SHARD");
+const u8 OtherText_BlueShard[] = _("BLUE SHARD");
+const u8 OtherText_GreenShard[] = _("GREEN SHARD");
+const u8 OtherText_BattleTower[] = _("BATTLE TOWER");
+const u8 OtherText_Right[] = _("Right");
+const u8 OtherText_Left[] = _("Left");
+const u8 OtherText_TM32[] = _("TM32 1,500 COINS");
+const u8 OtherText_TM29[] = _("TM29 3,500 COINS");
+const u8 OtherText_TM35[] = _("TM35 4,000 COINS");
+const u8 OtherText_TM24[] = _("TM24 4,000 COINS");
+const u8 OtherText_TM13[] = _("TM13 4,000 COINS");
+const u8 OtherText_1F_2[] = _("1F");
+const u8 OtherText_2F_2[] = _("2F");
+const u8 OtherText_3F_2[] = _("3F");
+const u8 OtherText_4F_2[] = _("4F");
+const u8 OtherText_5F_2[] = _("5F");
+const u8 OtherText_Cool2[] = _("COOL");
+const u8 OtherText_Beauty3[] = _("BEAUTY");
+const u8 OtherText_Cute2[] = _("CUTE");
+const u8 OtherText_Smart2[] = _("SMART");
+const u8 OtherText_Tough2[] = _("TOUGH");
+const u8 OtherText_Normal[] = _("NORMAL");
+const u8 OtherText_Super[] = _("SUPER");
+const u8 OtherText_Hyper[] = _("HYPER");
+const u8 OtherText_Master[] = _("MASTER");
+const u8 OtherText_Cool3[] = _("COOL");
+const u8 OtherText_Beauty4[] = _("BEAUTY");
+const u8 OtherText_Cute3[] = _("CUTE");
+const u8 OtherText_Smart3[] = _("SMART");
+const u8 OtherText_Tough3[] = _("TOUGH");
+const u8 OtherText_Items[] = _("ITEMS");
+const u8 OtherText_KeyItems[] = _("KEY ITEMS");
+const u8 OtherText_Balls[] = _("BALLS");
+const u8 OtherText_TMsHMs[] = _("TMs & HMs");
+const u8 OtherText_Berries[] = _("BERRIES");
+
+const u8 gPCText_SomeonesPC[] = _("SOMEONE’S PC");
+const u8 gPCText_LanettesPC[] = _("LANETTE’S PC");
+const u8 gPCText_PlayersPC[] = _("{PLAYER}’s PC");
+const u8 gPCText_HallOfFame[] = _("HALL OF FAME");
+const u8 gPCText_LogOff[] = _("LOG OFF");
+
+const u8 gOtherText_99Times[] = _("99 times +");
+const u8 gOtherText_1Minute[] = _("1 minute +");
+const u8 gOtherText_Seconds[] = _(" seconds");
+const u8 gOtherText_Times[] = _(" times$.");
+const u8 gOtherText_BigGuy[] = _("Big guy");
+const u8 gOtherText_BigGirl[] = _("Big girl");
+const u8 gOtherText_Son[] = _("son");
+const u8 gOtherText_Daughter[] = _("daughter");
+const u8 OtherText_BlueFlute[] = _("BLUE FLUTE");
+const u8 OtherText_YellowFlute[] = _("YELLOW FLUTE");
+const u8 OtherText_RedFlute[] = _("RED FLUTE");
+const u8 OtherText_WhiteFlute[] = _("WHITE FLUTE");
+const u8 OtherText_BlackFlute[] = _("BLACK FLUTE");
+const u8 OtherText_PrettyChair[] = _("PRETTY CHAIR");
+const u8 OtherText_PrettyDesk[] = _("PRETTY DESK");
+const u8 OtherText_1F[] = _("1F");
+const u8 OtherText_2F[] = _("2F");
+const u8 OtherText_3F[] = _("3F");
+const u8 OtherText_4F[] = _("4F");
+const u8 OtherText_5F[] = _("5F");
+const u8 OtherText_6F[] = _("6F");
+const u8 OtherText_7F[] = _("7F");
+const u8 OtherText_8F[] = _("8F");
+const u8 OtherText_9F[] = _("9F");
+const u8 OtherText_10F[] = _("10F");
+const u8 OtherText_11F[] = _("11F");
+const u8 OtherText_B1F[] = _("B1F");
+const u8 OtherText_B2F[] = _("B2F");
+const u8 OtherText_B3F[] = _("B3F");
+const u8 OtherText_B4F[] = _("B4F");
+const u8 OtherText_Rooftop[] = _("ROOFTOP");
+
+const u8 gOtherText_NowOn[] = _("Now on:");
+
+const u8 gPCText_Cancel[] = _("CANCEL");
+
+const u8 PCText_ExitBox[] = _("Exit from the BOX.");
+const u8 PCText_WhatYouDo[] = _("What would you like to do?");
+const u8 PCText_PickATheme[] = _("Please pick a theme.");
+const u8 PCText_PickAWallpaper[] = _("Please pick out wallpaper.");
+const u8 PCText_IsSelected[] = _(" is selected.");
+const u8 PCText_JumpToWhichBox[] = _("Jump to which BOX?");
+const u8 PCText_DepositInWhichBox[] = _("Deposit in which BOX?");
+const u8 PCText_WasDeposited[] = _(" was deposited.");
+const u8 PCText_BoxIsFull[] = _("The BOX is full.");
+const u8 PCText_ReleasePoke[] = _("Release this POKéMON?");
+const u8 PCText_WasReleased[] = _(" was released.");
+const u8 PCText_ByeBye[] = _("Bye-bye, !");
+const u8 PCText_MarkPoke[] = _("Mark your POKéMON.");
+const u8 PCText_LastPoke[] = _("That’s your last POKéMON!");
+const u8 PCText_PartyFull[] = _("Your party’s full!");
+const u8 PCText_HoldingPoke[] = _("You’re holding a POKéMON!");
+const u8 PCText_WhichOneWillTake[] = _("Which one will you take?");
+const u8 PCText_CantReleaseEgg[] = _("You can’t release an EGG.");
+const u8 PCText_ContinueBox[] = _("Continue BOX operations?");
+const u8 PCText_CameBack[] = _(" came back!");
+const u8 PCText_Worried[] = _("Was it worried about you?");
+const u8 PCText_Surprise[] = _("... ... ... ... ...!");
+const u8 PCText_PleaseRemoveMail[] = _("Please remove the MAIL.");
+const u8 PCText_Cancel2[] = _("CANCEL");
+const u8 PCText_Deposit[] = _("DEPOSIT");
+const u8 PCText_Withdraw[] = _("WITHDRAW");
+const u8 PCText_Switch[] = _("SWITCH");
+const u8 PCText_Move[] = _("MOVE");
+const u8 PCText_Place[] = _("PLACE");
+const u8 PCText_Summary[] = _("SUMMARY");
+const u8 PCText_Release[] = _("RELEASE");
+const u8 PCText_Mark[] = _("MARK");
+const u8 PCText_Name[] = _("NAME");
+const u8 PCText_Jump[] = _("JUMP");
+const u8 PCText_Wallpaper[] = _("WALLPAPER");
+const u8 PCText_Scenery1[] = _("SCENERY 1");
+const u8 PCText_Scenery2[] = _("SCENERY 2");
+const u8 PCText_Scenery3[] = _("SCENERY 3");
+const u8 PCText_Etc[] = _("ETCETERA");
+const u8 PCText_Forest[] = _("FOREST");
+const u8 PCText_City[] = _("CITY");
+const u8 PCText_Desert[] = _("DESERT");
+const u8 PCText_Savanna[] = _("SAVANNA");
+const u8 PCText_Crag[] = _("CRAG");
+const u8 PCText_Volcano[] = _("VOLCANO");
+const u8 PCText_Snow[] = _("SNOW");
+const u8 PCText_Cave[] = _("CAVE");
+const u8 PCText_Beach[] = _("BEACH");
+const u8 PCText_Seafloor[] = _("SEAFLOOR");
+const u8 PCText_River[] = _("RIVER");
+const u8 PCText_Sky[] = _("SKY");
+const u8 PCText_Polka[] = _("POLKA-DOT");
+const u8 PCText_PokeCenter[] = _("POKéCENTER");
+const u8 PCText_Machine[] = _("MACHINE");
+const u8 PCText_Plain[] = _("PLAIN");
+const u8 PCText_WhatDoYouWant[] = _("What do you want?");
+const u8 PCText_WithdrawPoke[] = _("WITHDRAW POKéMON");
+const u8 PCText_DepositPoke[] = _("DEPOSIT POKéMON");
+const u8 PCText_MovePoke[] = _("MOVE POKéMON");
+const u8 PCText_SeeYa[] = _("SEE YA!");
+const u8 PCText_MovePokeToParty[] = _("Move POKéMON stored in BOXES to\nyour party.");
+const u8 PCText_StorePokeInBox[] = _("Store POKéMON in your party in BOXES.");
+const u8 PCText_OrganizeBoxesParty[] = _("Organize the POKéMON in BOXES and\nin your party.");
+const u8 PCText_ReturnToPrevMenu[] = _("Return to the previous menu.");
+
+const u8 gPCText_OnlyOne[] = _("There is just one POKéMON with you.");
+const u8 gPCText_PartyFull2[] = _("Your party is full!");
+const u8 gPCText_BOX[] = _("BOX");
+
+// pokenav
+const u8 PCText_CheckMap[] = _("{CLEAR 0}Check the map of the HOENN region.");
+const u8 PCText_CheckPoke[] = _("{CLEAR 0}Check POKéMON in detail.");
+const u8 PCText_CheckTrainer[] = _("{CLEAR 0}Check TRAINER information.");
+const u8 PCText_CheckRibbons[] = _("{CLEAR 0}Check obtained RIBBONS.");
+const u8 PCText_PutAwayNav[] = _("{CLEAR 0}Put away the POKéNAV.");
+const u8 PCText_NoRibbonWin[] = _("{CLEAR 0}There are no RIBBON winners.");
+const u8 PCText_NoTrainers[] = _("{CLEAR 0}No TRAINERS are registered.");
+const u8 PCText_CheckParty[] = _("{CLEAR 0}Check party POKéMON in detail.");
+const u8 PCText_CheckPokeAll[] = _("{CLEAR 0}Check all POKéMON in detail.");
+const u8 PCText_ReturnToNav[] = _("{CLEAR 0}Return to the POKéNAV menu.");
+const u8 PCText_FindCool[] = _("{CLEAR 0}Find cool POKéMON.");
+const u8 PCText_FindBeauty[] = _("{CLEAR 0}Find beautiful POKéMON.");
+const u8 PCText_FindCute[] = _("{CLEAR 0}Find cute POKéMON.");
+const u8 PCText_FindSmart[] = _("{CLEAR 0}Find smart POKéMON.");
+const u8 PCText_FindTough[] = _("{CLEAR 0}Find tough POKéMON.");
+const u8 PCText_ReturnToCondition[] = _("{CLEAR 0}Return to the CONDITION menu.");
+
+const u8 gOtherText_NumberRegistered[] = _("No. registered");
+const u8 gOtherText_NumberBattles[] = _("No. of battles");
+const u8 gOtherText_Strategy[] = _("{PALETTE 5}STRATEGY");
+const u8 gOtherText_TrainersPokemon[] = _("{PALETTE 5}TRAINER’S POKéMON");
+const u8 gOtherText_SelfIntroduction[] = _("{PALETTE 5}SELF-INTRODUCTION");
+const u8 gOtherText_Nature2[] = _("NATURE/");
+const u8 gOtherText_InParty[] = _("IN PARTY");
+const u8 gOtherText_Number[] = _("No. ");
+const u8 gOtherText_Ribbons[] = _("RIBBONS");
+const u8 OtherText_MakeProfilePage1[] = _("Make your profile by combining");
+const u8 OtherText_MakeProfilePage2[] = _("four words or phrases.");
+const u8 OtherText_MakeMessagePage1[] = _("Make a message with 6 phrases.");
+const u8 OtherText_MakeMessagePage2[] = _("Max. two 12-letter phrases/line.");
+const u8 OtherText_DescribeFeelingsPage1[] = _("Find words that describe your");
+const u8 OtherText_DescribeFeelingsPage2[] = _("feelings right now.");
+const u8 OtherText_WithFourPhrases[] = _("With four phrases,");
+const u8 OtherText_CombineNinePhrasesPage1[] = _("Combine nine phrases and");
+const u8 OtherText_CombineNinePhrasesPage2[] = _("make a message.");
+const u8 OtherText_ImproveBardSongPage1[] = _("Change just one word or phrase");
+const u8 OtherText_ImproveBardSongPage2[] = _("and improve the BARD’s song.");
+const u8 OtherText_YourProfile[] = _("Your profile ");
+const u8 OtherText_YourFeelingBattle[] = _("Your feeling at the battle’s start");
+const u8 OtherText_SetWinMessage[] = _("What you say if you win a battle");
+const u8 OtherText_SetLossMessage[] = _("What you say if you lose a battle");
+const u8 OtherText_TheAnswer[] = _("The answer");
+const u8 OtherText_MailMessage[] = _("The MAIL message");
+const u8 OtherText_MailSalutation[] = _("The MAIL salutation");
+const u8 OtherText_NewSong[] = _("The new song");
+const u8 OtherText_CombineTwoPhrasesPage1[] = _("Combine two phrases and");
+const u8 OtherText_CombineTwoPhrasesPage2[] = _("make a trendy saying.");
+const u8 OtherText_ConfirmTrendyPage1[] = _("The trendy saying");
+const u8 OtherText_ConfirmTrendyPage2[] = _("is as shown. Okay?");
+const u8 OtherText_HipsterPage1[] = _("I’ll combine two phrases and");
+const u8 OtherText_HipsterPage2[] = _("teach you a good saying.");
+
+const u8 gOtherText_TextDeletedConfirmPage1[] = _("All the text being edited will");
+const u8 gOtherText_TextDeletedConfirmPage2[] = _("be deleted. Is that okay?");
+const u8 gOtherText_QuitEditing[] = _("Quit editing?");
+const u8 gOtherText_EditedTextNoSavePage1[] = _("The edited text will not be saved.");
+const u8 gOtherText_EditedTextNoSavePage2[] = _("Is that okay?");
+const u8 gOtherText_EnterAPhraseOrWord[] = _("Please enter a phrase or word.");
+const u8 gOtherText_TextNoDelete[] = _("The entire text can’t be deleted.");
+const u8 gOtherText_OnlyOnePhrase[] = _("Only one phrase may be changed.");
+const u8 gOtherText_OriginalSongRestored[] = _("The original song will be restored.");
+const u8 gOtherText_TrendyAlready[] = _("That’s trendy already!");
+const u8 gOtherText_CombineTwoPhrases[] = _("Combine two words or phrases.");
+const u8 gOtherText_QuitGivingInfo[] = _("Quit giving information?");
+const u8 gOtherText_StopGivingMail[] = _("Stop giving the POKéMON MAIL?");
+const u8 gOtherText_Profile[] = _("PROFILE");
+const u8 gOtherText_AtBattleStart[] = _("At the battle’s start.");
+const u8 gOtherText_UponWinningBattle[] = _("Upon winning a battle.");
+const u8 gOtherText_UponLosingBattle[] = _("Upon losing a battle.");
+
+// mauville_old_man?
+const u8 gOtherText_TheBardsSong[] = _("The BARD’s Song");
+const u8 gOtherText_WhatsHipHappening[] = _("What’s hip and happening?");
+const u8 gOtherText_Interview[] = _("Interview");
+const u8 gOtherText_GoodSaying[] = _("Good saying");
+const u8 OtherText_SoPretty[] = _(" so pretty!");
+const u8 OtherText_SoDarling[] = _(" so darling!");
+const u8 OtherText_SoRelaxed[] = _(" so relaxed!");
+const u8 OtherText_SoSunny[] = _(" so sunny!");
+const u8 OtherText_SoDesirable[] = _(" so desirable!");
+const u8 OtherText_SoExciting[] = _(" so exciting!");
+const u8 OtherText_SoAmusing[] = _(" so amusing!");
+const u8 OtherText_SoMagical[] = _(" so magical!");
+
+const u8 gOtherText_Is[] = _(" is");
+const u8 gOtherText_DontYouAgree[] = _("\nDon’t you agree?");
+
+const u8 OtherText_WantVacationNicePlace[] = _("I so want to go on a vacation.\nWould you happen to know a nice place?");
+const u8 OtherText_BoughtCrayonsIsNice[] = _("I bought crayons with 120 colors!\nDon’t you think that’s nice?");
+const u8 OtherText_IfWeCouldFloat[] = _("Wouldn’t it be nice if we could float\naway on a cloud of bubbles?");
+const u8 OtherText_SandWashesAwayMakeSad[] = _("When you write on a sandy beach,\nthey wash away. It makes me sad.");
+const u8 OtherText_WhatsBottomSeaLike[] = _("What’s the bottom of the sea like?\nJust once I would so love to go!");
+const u8 OtherText_SeeSettingSun[] = _("When you see the setting sun, does it\nmake you want to go home?");
+const u8 OtherText_LyingInGreenGrass[] = _("Lying back in the green grass...\nOh, it’s so, so nice!");
+const u8 OtherText_SecretBasesWonderful[] = _("SECRET BASES are so wonderful!\nCan’t you feel the excitement?");
+
+const u8 OtherText_PokeLeague[] = _("POKéMON LEAGUE");
+const u8 OtherText_PokeCenter[] = _("POKéMON CENTER");
+
+const u8 gOtherText_GetsAPokeBlock[] = _(" gets a {POKEBLOCK}?");
+
+const u8 OtherText_Coolness[] = _("Coolness ");
+const u8 OtherText_Beauty[] = _("Beauty ");
+const u8 OtherText_Cuteness[] = _("Cuteness ");
+const u8 OtherText_Smartness[] = _("Smartness ");
+const u8 OtherText_Toughness[] = _("Toughness ");
+
+const u8 gOtherText_WasEnhanced[] = _("was enhanced!");
+const u8 gOtherText_NothingChanged[] = _("Nothing changed!");
+const u8 gOtherText_WontEat[] = _("It won’t eat anymore...");
+
+const u8 gSystemText_SaveFailedBackupCheck[] = _("Save failed.\nChecking the backup memory...\nPlease wait.\n{COLOR RED}“Time required: 1 minute”");
+const u8 gSystemText_BackupDamagedGameContinue[] = _("The backup memory is damaged or\nthe internal battery has run dry.\nThe game can be played. However,\nprogress cannot be saved.");
+const u8 gSystemText_GameplayEnded[] = _("{COLOR RED}“Gameplay cannot be continued.\nReturning to the title screen...”");
+const u8 gSystemText_CheckCompleteSaveAttempt[] = _("Check completed.\nAttempting to save again.\nPlease wait.");
+const u8 gSystemText_SaveCompletedGameEnd[] = _("Save completed.\n{COLOR RED}“Gameplay cannot be continued.\nReturning to the title screen.”");
+const u8 gSystemText_SaveCompletedPressA[] = _("Save completed.\n{COLOR RED}“Please press the A Button.”");
+
+const u8 gOtherText_Ferry[] = _("FERRY");
+const u8 gOtherText_SecretBase[] = _("SECRET BASE");
+const u8 gOtherText_Hideout[] = _("HIDEOUT");
+
+const u8 gSystemText_ResetRTCPrompt[] = _("Reset RTC?\nA: Confirm, B: Cancel");
+const u8 gSystemText_PresentTime[] = _("Present time in game");
+const u8 gSystemText_PreviousTime[] = _("Previous time in game");
+const u8 gSystemText_PleaseResetTime[] = _("Please reset the time.");
+const u8 gSystemText_ClockResetDataSave[] = _("The clock has been reset.\nData will be saved. Please wait.");
+const u8 gSystemText_SaveCompleted[] = _("Save completed.");
+const u8 gSystemText_SaveFailed[] = _("Save failed...");
+const u8 gSystemText_NoSaveFileNoTime[] = _("There is no save file, so the time\ncan’t be set.");
+const u8 gSystemText_ClockAdjustmentUsable[] = _("The in-game clock adjustment system\nis now useable.");
+const u8 gSystemText_Saving[] = _("SAVING...\nDON’T TURN OFF THE POWER.");
diff --git a/src/task.c b/src/task.c
index e79929c63..3c28a66d9 100644
--- a/src/task.c
+++ b/src/task.c
@@ -1,48 +1,48 @@
#include "global.h"
#include "task.h"
-#define NUM_TASKS 16
-
+#define ACTIVE_SENTINEL 0x10
#define HEAD_SENTINEL 0xFE
#define TAIL_SENTINEL 0xFF
-struct Task gTasks[NUM_TASKS];
+// gTasks is a queue of the active 16 tasks
+struct Task gTasks[ACTIVE_SENTINEL];
static void InsertTask(u8 newTaskId);
static u8 FindFirstActiveTask();
void ResetTasks()
{
- u8 i;
+ u8 taskId;
- for (i = 0; i < NUM_TASKS; i++)
+ for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++)
{
- gTasks[i].isActive = FALSE;
- gTasks[i].func = TaskDummy;
- gTasks[i].prev = i;
- gTasks[i].next = i + 1;
- gTasks[i].priority = -1;
- memset(gTasks[i].data, 0, sizeof(gTasks[i].data));
+ gTasks[taskId].isActive = FALSE;
+ gTasks[taskId].func = TaskDummy;
+ gTasks[taskId].prev = taskId;
+ gTasks[taskId].next = taskId + 1;
+ gTasks[taskId].priority = -1;
+ memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data));
}
gTasks[0].prev = HEAD_SENTINEL;
- gTasks[NUM_TASKS - 1].next = TAIL_SENTINEL;
+ gTasks[ACTIVE_SENTINEL - 1].next = TAIL_SENTINEL;
}
u8 CreateTask(TaskFunc func, u8 priority)
{
- u8 i;
+ u8 taskId;
- for (i = 0; i < NUM_TASKS; i++)
+ for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++)
{
- if (!gTasks[i].isActive)
+ if (!gTasks[taskId].isActive)
{
- gTasks[i].func = func;
- gTasks[i].priority = priority;
- InsertTask(i);
- memset(gTasks[i].data, 0, sizeof(gTasks[i].data));
- gTasks[i].isActive = TRUE;
- return i;
+ gTasks[taskId].func = func;
+ gTasks[taskId].priority = priority;
+ InsertTask(taskId);
+ memset(gTasks[taskId].data, 0, sizeof(gTasks[taskId].data));
+ gTasks[taskId].isActive = TRUE;
+ return taskId;
}
}
@@ -53,9 +53,9 @@ static void InsertTask(u8 newTaskId)
{
u8 taskId = FindFirstActiveTask();
- if (taskId == NUM_TASKS)
+ if (taskId == ACTIVE_SENTINEL)
{
- // The new task is the only task.
+ // The task system inserts from the top downwards starting from the end (0xFF) to 0. If FindFirstActiveTask returned the value equivalent to ACTIVE_SENTINEL, it means it is the only task because it searched the entire queue.
gTasks[newTaskId].prev = HEAD_SENTINEL;
gTasks[newTaskId].next = TAIL_SENTINEL;
return;
@@ -69,12 +69,14 @@ static void InsertTask(u8 newTaskId)
// so we insert the new task before it.
gTasks[newTaskId].prev = gTasks[taskId].prev;
gTasks[newTaskId].next = taskId;
+
if (gTasks[taskId].prev != HEAD_SENTINEL)
- gTasks[gTasks[taskId].prev].next = newTaskId;
+ gTasks[gTasks[taskId].prev].next = newTaskId; // as long as we are not at the end, insert the newTask appropriately.
+
gTasks[taskId].prev = newTaskId;
return;
}
- if (gTasks[taskId].next == TAIL_SENTINEL)
+ if (gTasks[taskId].next == TAIL_SENTINEL) // we did not find a space for the task, so overwrite the last task as it is the lowest priority.
{
// We've reached the end.
gTasks[newTaskId].prev = taskId;
@@ -82,7 +84,7 @@ static void InsertTask(u8 newTaskId)
gTasks[taskId].next = newTaskId;
return;
}
- taskId = gTasks[taskId].next;
+ taskId = gTasks[taskId].next; // neither the priority was lower, nor the end. check the next task.
}
}
@@ -112,11 +114,11 @@ void DestroyTask(u8 taskId)
}
}
-void RunTasks()
+void RunTasks(void)
{
u8 taskId = FindFirstActiveTask();
- if (taskId != NUM_TASKS)
+ if (taskId != ACTIVE_SENTINEL)
{
do
{
@@ -126,11 +128,11 @@ void RunTasks()
}
}
-static u8 FindFirstActiveTask()
+static u8 FindFirstActiveTask(void)
{
u8 taskId;
- for (taskId = 0; taskId < NUM_TASKS; taskId++)
+ for (taskId = 0; taskId < ACTIVE_SENTINEL; taskId++)
if (gTasks[taskId].isActive == TRUE && gTasks[taskId].prev == HEAD_SENTINEL)
break;
@@ -173,7 +175,7 @@ bool8 FuncIsActiveTask(TaskFunc func)
{
u8 i;
- for (i = 0; i < NUM_TASKS; i++)
+ for (i = 0; i < ACTIVE_SENTINEL; i++)
if (gTasks[i].isActive == TRUE && gTasks[i].func == func)
return TRUE;
@@ -184,19 +186,19 @@ u8 FindTaskIdByFunc(TaskFunc func)
{
s32 i;
- for (i = 0; i < NUM_TASKS; i++)
+ for (i = 0; i < ACTIVE_SENTINEL; i++)
if (gTasks[i].isActive == TRUE && gTasks[i].func == func)
return (u8)i;
return -1;
}
-u8 GetTaskCount()
+u8 GetTaskCount(void)
{
u8 i;
u8 count = 0;
- for (i = 0; i < NUM_TASKS; i++)
+ for (i = 0; i < ACTIVE_SENTINEL; i++)
if (gTasks[i].isActive == TRUE)
count++;
diff --git a/src/text.c b/src/text.c
index 6089fdba8..cc3dab547 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1,11 +1,11 @@
#include "global.h"
#include "text.h"
+#include "battle.h"
#include "main.h"
-#include "string_util.h"
-#include "songs.h"
#include "palette.h"
+#include "songs.h"
#include "sound.h"
-#include "battle.h"
+#include "string_util.h"
enum
{
@@ -211,20 +211,22 @@ const u16 gUnknown_081E29D8[] = { 0x100, 0x200, 0x400, 0x800 };
const u16 gUnknown_081E29E0[] = { 0x100, 0x200, 0x400, 0x800 };
const u16 gUnknown_081E29E8[] = { 1, 2, 4, 8 };
-#include "fonts/font0_lat_glyphs.h"
-#include "fonts/font1_lat_glyphs.h"
-#include "fonts/font0_jpn_glyphs.h"
-#include "fonts/font1_jpn_glyphs.h"
-#include "fonts/braille_glyphs.h"
-#include "fonts/down_arrow_tiles.h"
+static const u8 sFont0LatinGlyphs[] = INCBIN_U8("graphics/fonts/font0_lat.1bpp");
+static const u8 sFont1LatinGlyphs[] = INCBIN_U8("graphics/fonts/font1_lat.1bpp");
+static const u8 sFont0JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font0_jpn.1bpp");
+static const u8 sFont1JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font1_jpn.1bpp");
+static const u8 sBrailleGlyphs[] = INCBIN_U8("graphics/fonts/font6_braille.1bpp");
+static const u32 sDownArrowTiles[] = INCBIN_U32("graphics/fonts/down_arrow.4bpp");
+
#include "fonts/type1_map.h"
#include "fonts/type3_map.h"
#include "fonts/font1_widths.h"
#include "fonts/font4_widths.h"
#include "fonts/font0_widths.h"
#include "fonts/font3_widths.h"
-#include "fonts/unknown_palette_81E6692.h"
-#include "fonts/default_palette.h"
+
+const u16 gUnknownPalette_81E6692[] = INCBIN_U16("graphics/fonts/unknown_81E6692.gbapal");
+const u16 gFontDefaultPalette[] = INCBIN_U16("graphics/fonts/default.gbapal");
const u8 sBlankTile[8] = { 0, 0, 0, 0, 0, 0, 0, 0, };
diff --git a/src/text_window.c b/src/text_window.c
index 1ac624dd0..9a88789d1 100644
--- a/src/text_window.c
+++ b/src/text_window.c
@@ -1,8 +1,8 @@
#include "global.h"
#include "text_window.h"
#include "main.h"
-#include "text.h"
#include "palette.h"
+#include "text.h"
#define STD_MSG_BOX_LEFT 0
#define STD_MSG_BOX_TOP 14
diff --git a/src/tileset_anim.c b/src/tileset_anim.c
index 415b69cfe..34685381d 100644
--- a/src/tileset_anim.c
+++ b/src/tileset_anim.c
@@ -30,10 +30,11 @@ extern u8 *gTilesetAnimTable_EliteFour_1[];
extern u8 *gTilesetAnimTable_MauvilleGym[];
extern u8 *gTilesetAnimTable_BikeShop[];
-struct Dma {
- u8 *src;
- u8 *dest;
- u16 size;
+struct Dma
+{
+ u8 *src;
+ u8 *dest;
+ u16 size;
};
EWRAM_DATA static struct Dma gTilesetAnimDmas[20] = {0};
@@ -88,510 +89,542 @@ static void sub_807399C(u16);
static void sub_8073974(u16);
static void sub_80739EC(u16);
-static void ClearTilesetAnimDmas(void) {
- gNumTilesetAnimDmas = 0;
- CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas));
-}
-
-static void QueueTilesetAnimDma(u8 *src, u8 *dest, u16 size) {
- if (gNumTilesetAnimDmas < 20) {
- gTilesetAnimDmas[gNumTilesetAnimDmas].src = src;
- gTilesetAnimDmas[gNumTilesetAnimDmas].dest = dest;
- gTilesetAnimDmas[gNumTilesetAnimDmas].size = size;
- gNumTilesetAnimDmas++;
- }
-}
-
-void sub_8072E74(void) {
- int i;
- for (i = 0; i < gNumTilesetAnimDmas; i++) {
- DmaCopy16(3,
- gTilesetAnimDmas[i].src,
- gTilesetAnimDmas[i].dest,
- gTilesetAnimDmas[i].size);
- }
- gNumTilesetAnimDmas = 0;
-}
-
-void cur_mapheader_run_tileset_funcs_after_some_cpuset(void) {
- ClearTilesetAnimDmas();
- StartTileset1Animation();
- StartTileset2Animation();
-}
-
-void sub_8072ED0(void) {
- StartTileset2Animation();
-}
-
-void sub_8072EDC(void) {
- ClearTilesetAnimDmas();
- if (++gTileset1AnimFrame >= gTileset1AnimLength) {
- gTileset1AnimFrame = 0;
- }
- if (++gTileset2AnimFrame >= gTileset2AnimLength) {
- gTileset2AnimFrame = 0;
- }
- if (gTileset1AnimCallback) {
- gTileset1AnimCallback(gTileset1AnimFrame);
- }
- if (gTileset2AnimCallback) {
- gTileset2AnimCallback(gTileset2AnimFrame);
- }
-}
-
-static void StartTileset1Animation(void) {
- gTileset1AnimFrame = 0;
- gTileset1AnimLength = 0;
- gTileset1AnimCallback = 0;
- if (gMapHeader.mapData->primaryTileset) {
- if (gMapHeader.mapData->primaryTileset->callback) {
- gMapHeader.mapData->primaryTileset->callback();
- }
- }
-}
-
-static void StartTileset2Animation(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = 0;
- gTileset2AnimCallback = 0;
- if (gMapHeader.mapData->secondaryTileset) {
- if (gMapHeader.mapData->secondaryTileset->callback) {
- gMapHeader.mapData->secondaryTileset->callback();
- }
- }
+static void ClearTilesetAnimDmas(void)
+{
+ gNumTilesetAnimDmas = 0;
+ CpuFill32(0, &gTilesetAnimDmas, sizeof(gTilesetAnimDmas));
+}
+
+static void QueueTilesetAnimDma(u8 *src, u8 *dest, u16 size)
+{
+ if (gNumTilesetAnimDmas < 20)
+ {
+ gTilesetAnimDmas[gNumTilesetAnimDmas].src = src;
+ gTilesetAnimDmas[gNumTilesetAnimDmas].dest = dest;
+ gTilesetAnimDmas[gNumTilesetAnimDmas].size = size;
+ gNumTilesetAnimDmas++;
+ }
+}
+
+void sub_8072E74(void)
+{
+ int i;
+ for (i = 0; i < gNumTilesetAnimDmas; i++)
+ {
+ DmaCopy16(3,
+ gTilesetAnimDmas[i].src,
+ gTilesetAnimDmas[i].dest,
+ gTilesetAnimDmas[i].size);
+ }
+ gNumTilesetAnimDmas = 0;
+}
+
+void cur_mapheader_run_tileset_funcs_after_some_cpuset(void)
+{
+ ClearTilesetAnimDmas();
+ StartTileset1Animation();
+ StartTileset2Animation();
+}
+
+void sub_8072ED0(void)
+{
+ StartTileset2Animation();
+}
+
+void sub_8072EDC(void)
+{
+ ClearTilesetAnimDmas();
+ if (++gTileset1AnimFrame >= gTileset1AnimLength)
+ {
+ gTileset1AnimFrame = 0;
+ }
+ if (++gTileset2AnimFrame >= gTileset2AnimLength)
+ {
+ gTileset2AnimFrame = 0;
+ }
+ if (gTileset1AnimCallback)
+ {
+ gTileset1AnimCallback(gTileset1AnimFrame);
+ }
+ if (gTileset2AnimCallback)
+ {
+ gTileset2AnimCallback(gTileset2AnimFrame);
+ }
+}
+
+static void StartTileset1Animation(void)
+{
+ gTileset1AnimFrame = 0;
+ gTileset1AnimLength = 0;
+ gTileset1AnimCallback = 0;
+ if (gMapHeader.mapData->primaryTileset)
+ {
+ if (gMapHeader.mapData->primaryTileset->callback)
+ {
+ gMapHeader.mapData->primaryTileset->callback();
+ }
+ }
+}
+
+static void StartTileset2Animation(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0;
+ gTileset2AnimCallback = 0;
+ if (gMapHeader.mapData->secondaryTileset)
+ {
+ if (gMapHeader.mapData->secondaryTileset->callback)
+ {
+ gMapHeader.mapData->secondaryTileset->callback();
+ }
+ }
+}
+
+void TilesetCB_General(void)
+{
+ gTileset1AnimFrame = 0;
+ gTileset1AnimLength = 0x100;
+ gTileset1AnimCallback = sub_8073014;
+}
+
+void TilesetCB_Building(void)
+{
+ gTileset1AnimFrame = 0;
+ gTileset1AnimLength = 0x100;
+ gTileset1AnimCallback = sub_8073058;
+}
+
+static void sub_8073014(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_8073070(a1 / 0x10);
+ if (v1 == 1) sub_8073098(a1 / 0x10);
+ if (v1 == 2) sub_80730C0(a1 / 0x10);
+ if (v1 == 3) sub_80730E8(a1 / 0x10);
+ if (v1 == 4) sub_807361C(a1 / 0x10);
+}
+
+static void sub_8073058(u16 a1)
+{
+ if (a1 % 8 == 0)
+ {
+ sub_8073904(a1 / 8);
+ }
+}
+
+static void sub_8073070(u16 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1], (u8 *)(BG_VRAM + 0x3f80), 0x80);
+}
+
+static void sub_8073098(u16 a1)
+{
+ u8 v1;
+ v1 = a1 % 8;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1], (u8 *)(BG_VRAM + 0x3600), 0x3c0);
+}
+
+static void sub_80730C0(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1], (u8 *)(BG_VRAM + 0x3a00), 0x140);
+}
+
+static void sub_80730E8(u16 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1], (u8 *)(BG_VRAM + 0x3e00), 0xc0);
}
-void TilesetCB_General(void) {
- gTileset1AnimFrame = 0;
- gTileset1AnimLength = 0x100;
- gTileset1AnimCallback = sub_8073014;
+void TilesetCB_Petalburg(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
}
-void TilesetCB_Building(void) {
- gTileset1AnimFrame = 0;
- gTileset1AnimLength = 0x100;
- gTileset1AnimCallback = sub_8073058;
+void TilesetCB_Rustboro(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073424;
}
-static void sub_8073014(u16 a1) {
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 0) sub_8073070(a1 / 0x10);
- if (v1 == 1) sub_8073098(a1 / 0x10);
- if (v1 == 2) sub_80730C0(a1 / 0x10);
- if (v1 == 3) sub_80730E8(a1 / 0x10);
- if (v1 == 4) sub_807361C(a1 / 0x10);
+void TilesetCB_Dewford(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
}
-static void sub_8073058(u16 a1) {
- if (a1 % 8 == 0) {
- sub_8073904(a1 / 8);
- }
+void TilesetCB_Slateport(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
}
-static void sub_8073070(u16 a1) {
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_General_0[v1],
- (u8 *)(BG_VRAM + 0x3f80),
- 0x80);
+void TilesetCB_Mauville(void)
+{
+ gTileset2AnimFrame = gTileset1AnimFrame;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_80734A0;
}
-static void sub_8073098(u16 a1) {
- u8 v1;
- v1 = a1 % 8;
- QueueTilesetAnimDma(gTilesetAnimTable_General_1[v1],
- (u8 *)(BG_VRAM + 0x3600),
- 0x3c0);
+void TilesetCB_Lavaridge(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073514;
}
-static void sub_80730C0(u16 a1) {
- int v1;
- v1 = a1 % 8;
- QueueTilesetAnimDma(gTilesetAnimTable_General_2[v1],
- (u8 *)(BG_VRAM + 0x3a00),
- 0x140);
+void TilesetCB_Fallarbor(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
}
-static void sub_80730E8(u16 a1) {
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_General_3[v1],
- (u8 *)(BG_VRAM + 0x3e00),
- 0xc0);
+void TilesetCB_Fortree(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
}
-void TilesetCB_Petalburg(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
+void TilesetCB_Lilycove(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
}
-void TilesetCB_Rustboro(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073424;
+void TilesetCB_Mossdeep(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
}
-void TilesetCB_Dewford(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
+void TilesetCB_EverGrande(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073540;
}
-void TilesetCB_Slateport(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
+void TilesetCB_Pacifidlog(void)
+{
+ gTileset2AnimFrame = gTileset1AnimFrame;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_80735B4;
}
-void TilesetCB_Mauville(void) {
- gTileset2AnimFrame = gTileset1AnimFrame;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_80734A0;
+void TilesetCB_Sootopolis(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = 0;
}
-void TilesetCB_Lavaridge(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073514;
+void TilesetCB_Underwater(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0x80;
+ gTileset2AnimCallback = sub_80735E4;
}
-void TilesetCB_Fallarbor(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
+void TilesetCB_SootopolisGym(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0xf0;
+ gTileset2AnimCallback = sub_80738A8;
}
-void TilesetCB_Fortree(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
+void TilesetCB_Cave(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073600;
}
-void TilesetCB_Lilycove(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
+void TilesetCB_EliteFour(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = 0x80;
+ gTileset2AnimCallback = sub_80738C0;
}
-void TilesetCB_Mossdeep(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
+void TilesetCB_MauvilleGym(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_8073890;
}
-void TilesetCB_EverGrande(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073540;
+void TilesetCB_BikeShop(void)
+{
+ gTileset2AnimFrame = 0;
+ gTileset2AnimLength = gTileset1AnimLength;
+ gTileset2AnimCallback = sub_80738EC;
}
-void TilesetCB_Pacifidlog(void) {
- gTileset2AnimFrame = gTileset1AnimFrame;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_80735B4;
-}
-
-void TilesetCB_Sootopolis(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = 0;
-}
-
-void TilesetCB_Underwater(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = 0x80;
- gTileset2AnimCallback = sub_80735E4;
-}
+static void sub_8073424(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ if (v1 == 0)
+ {
+ sub_80737A4(a1 / 8, 0);
+ sub_80737E0(a1 / 8);
+ }
+ if (v1 == 1) sub_80737A4(a1 / 8, 1);
+ if (v1 == 2) sub_80737A4(a1 / 8, 2);
+ if (v1 == 3) sub_80737A4(a1 / 8, 3);
+ if (v1 == 4) sub_80737A4(a1 / 8, 4);
+ if (v1 == 5) sub_80737A4(a1 / 8, 5);
+ if (v1 == 6) sub_80737A4(a1 / 8, 6);
+ if (v1 == 7) sub_80737A4(a1 / 8, 7);
+}
+
+static void sub_80734A0(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ if (v1 == 0) sub_8073704(a1 / 8, 0);
+ if (v1 == 1) sub_8073704(a1 / 8, 1);
+ if (v1 == 2) sub_8073704(a1 / 8, 2);
+ if (v1 == 3) sub_8073704(a1 / 8, 3);
+ if (v1 == 4) sub_8073704(a1 / 8, 4);
+ if (v1 == 5) sub_8073704(a1 / 8, 5);
+ if (v1 == 6) sub_8073704(a1 / 8, 6);
+ if (v1 == 7) sub_8073704(a1 / 8, 7);
+}
+
+static void sub_8073514(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_8073644(a1 / 0x10);
+ if (v1 == 1) sub_8073808(a1 / 0x10);
+}
+
+static void sub_8073540(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ if (v1 == 0) sub_8073830(a1 / 8, 0);
+ if (v1 == 1) sub_8073830(a1 / 8, 1);
+ if (v1 == 2) sub_8073830(a1 / 8, 2);
+ if (v1 == 3) sub_8073830(a1 / 8, 3);
+ if (v1 == 4) sub_8073830(a1 / 8, 4);
+ if (v1 == 5) sub_8073830(a1 / 8, 5);
+ if (v1 == 6) sub_8073830(a1 / 8, 6);
+ if (v1 == 7) sub_8073830(a1 / 8, 7);
+}
+
+static void sub_80735B4(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_807368C(a1 / 0x10);
+ if (v1 == 1) sub_80736DC(a1 / 0x10);
+}
+
+static void sub_80735E4(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 0) sub_80736B4(a1 / 0x10);
+}
+
+static void sub_8073600(u16 a1)
+{
+ int v1;
+ v1 = a1 % 0x10;
+ if (v1 == 1) sub_8073868(a1 / 0x10);
+}
+
+static void sub_807361C(u16 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1], (u8 *)(BG_VRAM + 0x3c00), 0x140);
+}
+
+static void sub_8073644(u8 a1)
+{
+ u8 v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6400), 0x80);
+ v1 = (a1 + 2) % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1], (u8 *)(BG_VRAM + 0x6480), 0x80);
+}
+
+static void sub_807368C(u8 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1], (u8 *)(BG_VRAM + 0x7a00), 0x3c0);
+}
+
+static void sub_80736B4(u8 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1], (u8 *)(BG_VRAM + 0x7e00), 0x80);
+}
+
+static void sub_80736DC(u8 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1], (u8 *)(BG_VRAM + 0x7e00), 0x100);
+}
+
+static void sub_8073704(u16 a1, u8 a2)
+{
+ int v1;
+ a1 -= a2;
+ if (a1 < 12)
+ {
+ v1 = a1 % 12;
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0A[v1], gUnknown_0837BAE4[a2], 0x80);
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1A[v1], gUnknown_0837BB04[a2], 0x80);
+ }
+ else
+ {
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0B[v1], gUnknown_0837BAE4[a2], 0x80);
+ QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1B[v1], gUnknown_0837BB04[a2], 0x80);
+ }
+}
+
+static void sub_80737A4(u16 a1, u8 a2)
+{
+ int v1;
+ a1 -= a2;
+
+ v1 = a1 % 8;
+ if (gTilesetAnimTable_Rustboro_0[v1])
+ {
+ QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_0[v1], gUnknown_0837BFA4[a2], 0x80);
+ }
+}
+
+static void sub_80737E0(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1], (u8 *)(BG_VRAM + 0x7800), 0x80);
+}
+
+static void sub_8073808(u16 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x5400), 0x80);
+}
+
+static void sub_8073830(u16 a1, u8 a2)
+{
+ int v1;
+ a1 -= a2;
+ v1 = a1 % 8;
+ QueueTilesetAnimDma(gTilesetAnimTable_EverGrande[v1], gUnknown_0837C93C[a2], 0x80);
+}
+
+static void sub_8073868(u16 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1], (u8 *)(BG_VRAM + 0x7400), 0x80);
+}
+
+static void sub_8073890(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ if (!v1)
+ {
+ sub_80739C4(a1 / 2);
+ }
+}
+
+static void sub_80738A8(u16 a1)
+{
+ int v1;
+ v1 = a1 % 8;
+ if (!v1)
+ {
+ sub_807392C(a1 / 8);
+ }
+}
+
+static void sub_80738C0(u16 a1)
+{
+ if (a1 % 0x40 == 0)
+ {
+ sub_807399C(a1 / 0x40);
+ }
+ if (a1 % 8 == 1)
+ {
+ sub_8073974(a1 / 8);
+ }
+}
+
+static void sub_80738EC(u16 a1)
+{
+ if (a1 % 4 == 0)
+ {
+ sub_80739EC(a1 / 4);
+ }
+}
+
+static void sub_8073904(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_Building[v1], (u8 *)(BG_VRAM + 0x3e00), 0x80);
+}
+
+static void sub_807392C(u16 a1)
+{
+ int v1;
+ v1 = a1 % 3;
+ QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_0[v1], (u8 *)(BG_VRAM + 0x7e00), 0x180);
+ QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_1[v1], (u8 *)(BG_VRAM + 0x7a00), 0x280);
+}
-void TilesetCB_SootopolisGym(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = 0xf0;
- gTileset2AnimCallback = sub_80738A8;
+static void sub_8073974(u16 a1)
+{
+ int v1;
+ v1 = a1 % 4;
+ QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1], (u8 *)(BG_VRAM + 0x7f00), 0x20);
+}
+
+static void sub_807399C(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1], (u8 *)(BG_VRAM + 0x7c00), 0x80);
}
-void TilesetCB_Cave(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073600;
-}
-
-void TilesetCB_EliteFour(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = 0x80;
- gTileset2AnimCallback = sub_80738C0;
-}
-
-void TilesetCB_MauvilleGym(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_8073890;
-}
-
-void TilesetCB_BikeShop(void) {
- gTileset2AnimFrame = 0;
- gTileset2AnimLength = gTileset1AnimLength;
- gTileset2AnimCallback = sub_80738EC;
-}
-
-static void sub_8073424(u16 a1) {
- int v1;
- v1 = a1 % 8;
- if (v1 == 0) {
- sub_80737A4(a1 / 8, 0);
- sub_80737E0(a1 / 8);
- }
- if (v1 == 1) sub_80737A4(a1 / 8, 1);
- if (v1 == 2) sub_80737A4(a1 / 8, 2);
- if (v1 == 3) sub_80737A4(a1 / 8, 3);
- if (v1 == 4) sub_80737A4(a1 / 8, 4);
- if (v1 == 5) sub_80737A4(a1 / 8, 5);
- if (v1 == 6) sub_80737A4(a1 / 8, 6);
- if (v1 == 7) sub_80737A4(a1 / 8, 7);
-}
-
-static void sub_80734A0(u16 a1) {
- int v1;
- v1 = a1 % 8;
- if (v1 == 0) sub_8073704(a1 / 8, 0);
- if (v1 == 1) sub_8073704(a1 / 8, 1);
- if (v1 == 2) sub_8073704(a1 / 8, 2);
- if (v1 == 3) sub_8073704(a1 / 8, 3);
- if (v1 == 4) sub_8073704(a1 / 8, 4);
- if (v1 == 5) sub_8073704(a1 / 8, 5);
- if (v1 == 6) sub_8073704(a1 / 8, 6);
- if (v1 == 7) sub_8073704(a1 / 8, 7);
-}
-
-static void sub_8073514(u16 a1) {
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 0) sub_8073644(a1 / 0x10);
- if (v1 == 1) sub_8073808(a1 / 0x10);
-}
-
-static void sub_8073540(u16 a1) {
- int v1;
- v1 = a1 % 8;
- if (v1 == 0) sub_8073830(a1 / 8, 0);
- if (v1 == 1) sub_8073830(a1 / 8, 1);
- if (v1 == 2) sub_8073830(a1 / 8, 2);
- if (v1 == 3) sub_8073830(a1 / 8, 3);
- if (v1 == 4) sub_8073830(a1 / 8, 4);
- if (v1 == 5) sub_8073830(a1 / 8, 5);
- if (v1 == 6) sub_8073830(a1 / 8, 6);
- if (v1 == 7) sub_8073830(a1 / 8, 7);
-}
-
-static void sub_80735B4(u16 a1) {
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 0) sub_807368C(a1 / 0x10);
- if (v1 == 1) sub_80736DC(a1 / 0x10);
-}
-
-static void sub_80735E4(u16 a1) {
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 0) sub_80736B4(a1 / 0x10);
-}
-
-static void sub_8073600(u16 a1) {
- int v1;
- v1 = a1 % 0x10;
- if (v1 == 1) sub_8073868(a1 / 0x10);
-}
-
-static void sub_807361C(u16 a1) {
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_General_4[v1],
- (u8 *)(BG_VRAM + 0x3c00),
- 0x140);
-}
-
-static void sub_8073644(u8 a1) {
- u8 v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1],
- (u8 *)(BG_VRAM + 0x6400),
- 0x80);
- v1 = (a1 + 2) % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Lavaridge[v1],
- (u8 *)(BG_VRAM + 0x6480),
- 0x80);
-}
-
-static void sub_807368C(u8 a1) {
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_0[v1],
- (u8 *)(BG_VRAM + 0x7a00),
- 0x3c0);
-}
-
-static void sub_80736B4(u8 a1) {
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Underwater[v1],
- (u8 *)(BG_VRAM + 0x7e00),
- 0x80);
-}
-
-static void sub_80736DC(u8 a1) {
- int v1;
- v1 = a1 % 8;
- QueueTilesetAnimDma(gTilesetAnimTable_Pacifidlog_1[v1],
- (u8 *)(BG_VRAM + 0x7e00),
- 0x100);
-}
-
-static void sub_8073704(u16 a1, u8 a2) {
- int v1;
- a1 -= a2;
- if (a1 < 12) {
- v1 = a1 % 12;
- QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0A[v1],
- gUnknown_0837BAE4[a2],
- 0x80);
- QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1A[v1],
- gUnknown_0837BB04[a2],
- 0x80);
- } else {
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Mauville_0B[v1],
- gUnknown_0837BAE4[a2],
- 0x80);
- QueueTilesetAnimDma(gTilesetAnimTable_Mauville_1B[v1],
- gUnknown_0837BB04[a2],
- 0x80);
- }
-}
-
-static void sub_80737A4(u16 a1, u8 a2) {
- int v1;
- a1 -= a2;
-
- v1 = a1 % 8;
- if (gTilesetAnimTable_Rustboro_0[v1]) {
- QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_0[v1],
- gUnknown_0837BFA4[a2],
- 0x80);
- }
-}
-
-static void sub_80737E0(u16 a1) {
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_Rustboro_1[v1],
- (u8 *)(BG_VRAM + 0x7800),
- 0x80);
-}
-
-static void sub_8073808(u16 a1) {
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1],
- (u8 *)(BG_VRAM + 0x5400),
- 0x80);
-}
-
-static void sub_8073830(u16 a1, u8 a2) {
- int v1;
- a1 -= a2;
- v1 = a1 % 8;
- QueueTilesetAnimDma(gTilesetAnimTable_EverGrande[v1],
- gUnknown_0837C93C[a2],
- 0x80);
-}
-
-static void sub_8073868(u16 a1) {
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_Cave[v1],
- (u8 *)(BG_VRAM + 0x7400),
- 0x80);
-}
-
-static void sub_8073890(u16 a1) {
- int v1;
- v1 = a1 % 2;
- if (!v1) {
- sub_80739C4(a1 / 2);
- }
-}
-
-static void sub_80738A8(u16 a1) {
- int v1;
- v1 = a1 % 8;
- if (!v1) {
- sub_807392C(a1 / 8);
- }
-}
-
-static void sub_80738C0(u16 a1) {
- if (a1 % 0x40 == 0) {
- sub_807399C(a1 / 0x40);
- }
- if (a1 % 8 == 1) {
- sub_8073974(a1 / 8);
- }
-}
-
-static void sub_80738EC(u16 a1) {
- if (a1 % 4 == 0) {
- sub_80739EC(a1 / 4);
- }
-}
-
-static void sub_8073904(u16 a1) {
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_Building[v1],
- (u8 *)(BG_VRAM + 0x3e00),
- 0x80);
-}
-
-static void sub_807392C(u16 a1) {
- int v1;
- v1 = a1 % 3;
- QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_0[v1],
- (u8 *)(BG_VRAM + 0x7e00),
- 0x180);
- QueueTilesetAnimDma(gTilesetAnimTable_SootopolisGym_1[v1],
- (u8 *)(BG_VRAM + 0x7a00),
- 0x280);
-}
-
-static void sub_8073974(u16 a1) {
- int v1;
- v1 = a1 % 4;
- QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_0[v1],
- (u8 *)(BG_VRAM + 0x7f00),
- 0x20);
-}
-
-static void sub_807399C(u16 a1) {
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_EliteFour_1[v1],
- (u8 *)(BG_VRAM + 0x7c00),
- 0x80);
-}
-
-static void sub_80739C4(u16 a1) {
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1],
- (u8 *)(BG_VRAM + 0x5200),
- 0x200);
+static void sub_80739C4(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_MauvilleGym[v1], (u8 *)(BG_VRAM + 0x5200), 0x200);
}
-static void sub_80739EC(u16 a1) {
- int v1;
- v1 = a1 % 2;
- QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1],
- (u8 *)(BG_VRAM + 0x7e00),
- 0x120);
+static void sub_80739EC(u16 a1)
+{
+ int v1;
+ v1 = a1 % 2;
+ QueueTilesetAnimDma(gTilesetAnimTable_BikeShop[v1], (u8 *)(BG_VRAM + 0x7e00), 0x120);
}
diff --git a/src/title_screen.c b/src/title_screen.c
index ffa803d2e..1565abf62 100644
--- a/src/title_screen.c
+++ b/src/title_screen.c
@@ -2,49 +2,287 @@
#include "title_screen.h"
#include "asm.h"
#include "clear_save_data_menu.h"
-#include "m4a.h"
-#include "main_menu.h"
-#include "intro.h"
+#include "decompress.h"
+#include "event_data.h"
#include "gba/m4a_internal.h"
+#include "intro.h"
+#include "m4a.h"
#include "main.h"
+#include "main_menu.h"
#include "palette.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
-#include "decompress.h"
-#include "event_data.h"
extern u8 gReservedSpritePaletteCount;
extern struct MusicPlayerInfo gMPlay_BGM;
extern u8 gUnknown_0202F7E4;
extern u16 gUnknown_030041B4;
extern u16 gUnknown_030042C0;
-extern u8 gUnknown_08393210[];
-extern u8 gUnknown_08393250[];
-extern u8 gUnknown_083939EC[];
-extern u8 gUnknown_08393BF8[];
-extern u16 gUnknown_08393E64[];
-extern struct SpriteTemplate gSpriteTemplate_8393ECC;
-extern struct SpriteTemplate gSpriteTemplate_8393EE4;
-extern struct SpriteSheet gUnknown_08393EFC;
-extern struct SpriteTemplate gSpriteTemplate_8393F74;
-extern struct SpriteSheet gUnknown_08393F8C;
-extern const struct SpritePalette gUnknown_08393F9C[];
-extern struct SpriteTemplate gSpriteTemplate_8393FC0;
-extern struct SpriteSheet gUnknown_08393FD8;
-extern u8 gUnknown_08E9D8CC[];
-extern u8 gUnknown_08E9F624[];
-extern u8 gUnknown_08E9F7E4[];
+extern const u8 gUnknown_08E9D8CC[];
+extern const u16 gUnknown_08E9F624[];
+extern const u8 gUnknown_08E9F7E4[];
+extern const u8 gVersionTiles[];
+extern const u8 gTitleScreenPressStart_Gfx[];
+extern const u16 gTitleScreenLogoShinePalette[];
-static void MainCB2(void);
-static void Task_TitleScreenPhase1(u8);
-static void Task_TitleScreenPhase2(u8);
-static void Task_TitleScreenPhase3(u8);
-static void CB2_GoToMainMenu(void);
-static void CB2_GoToClearSaveDataScreen(void);
-static void CB2_GoToResetRtcScreen(void);
-static void CB2_GoToCopyrightScreen(void);
-static void UpdateLegendaryMarkingColor(u8);
+#ifdef SAPPHIRE
+static const u16 sLegendaryMonPalettes[][16] =
+{
+ INCBIN_U16("graphics/title_screen/kyogre_dark.gbapal"),
+ INCBIN_U16("graphics/title_screen/kyogre_glow.gbapal"),
+};
+static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/kyogre.4bpp.lz");
+static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/kyogre_map.bin.lz");
+static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/water_map.bin.lz");
+#else
+static const u16 sLegendaryMonPalettes[][16] =
+{
+ INCBIN_U16("graphics/title_screen/groudon_dark.gbapal"),
+ INCBIN_U16("graphics/title_screen/groudon_glow.gbapal"),
+};
+static const u8 sLegendaryMonPixelData[] = INCBIN_U8("graphics/title_screen/groudon.4bpp.lz");
+static const u8 sLegendaryMonTilemap[] = INCBIN_U8("graphics/title_screen/groudon_map.bin.lz");
+static const u8 sBackdropTilemap[] = INCBIN_U8("graphics/title_screen/lava_map.bin.lz");
+#endif
+static const u8 sLogoShineTiles[] = INCBIN_U8("graphics/title_screen/logo_shine.4bpp.lz");
+const u16 gUnknown_08393E64[] =
+{
+ 0x10,
+ 0x110,
+ 0x210,
+ 0x310,
+ 0x410,
+ 0x510,
+ 0x610,
+ 0x710,
+ 0x810,
+ 0x910,
+ 0xA10,
+ 0xB10,
+ 0xC10,
+ 0xD10,
+ 0xE10,
+ 0xF10,
+ 0x100F,
+ 0x100E,
+ 0x100D,
+ 0x100C,
+ 0x100B,
+ 0x100A,
+ 0x1009,
+ 0x1008,
+ 0x1007,
+ 0x1006,
+ 0x1005,
+ 0x1004,
+ 0x1003,
+ 0x1002,
+ 0x1001,
+ 0x1000,
+};
+static const struct OamData sVersionBannerLeftOamData =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 1,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const struct OamData sVersionBannerRightOamData =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 1,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd sVersionBannerLeftAnimSequence[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+static const union AnimCmd sVersionBannerRightAnimSequence[] =
+{
+ ANIMCMD_FRAME(64, 30),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const sVersionBannerLeftAnimTable[] =
+{
+ sVersionBannerLeftAnimSequence,
+};
+static const union AnimCmd *const sVersionBannerRightAnimTable[] =
+{
+ sVersionBannerRightAnimSequence,
+};
+static const struct SpriteTemplate sVersionBannerLeftSpriteTemplate =
+{
+ .tileTag = 1000,
+ .paletteTag = 1000,
+ .oam = &sVersionBannerLeftOamData,
+ .anims = sVersionBannerLeftAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_VersionBannerLeft,
+};
+static const struct SpriteTemplate sVersionBannerRightSpriteTemplate =
+{
+ .tileTag = 1000,
+ .paletteTag = 1000,
+ .oam = &sVersionBannerRightOamData,
+ .anims = sVersionBannerRightAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_VersionBannerRight,
+};
+static const struct SpriteSheet gUnknown_08393EFC[] =
+{
+ {gVersionTiles, 0x1000, 1000},
+ {NULL},
+};
+static const struct OamData gOamData_8393F0C =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_8393F14[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_8393F1C[] =
+{
+ ANIMCMD_FRAME(4, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_8393F24[] =
+{
+ ANIMCMD_FRAME(8, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_8393F2C[] =
+{
+ ANIMCMD_FRAME(12, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_8393F34[] =
+{
+ ANIMCMD_FRAME(16, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_8393F3C[] =
+{
+ ANIMCMD_FRAME(20, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_8393F44[] =
+{
+ ANIMCMD_FRAME(24, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_8393F4C[] =
+{
+ ANIMCMD_FRAME(28, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const sStartCopyrightBannerAnimTable[] =
+{
+ gSpriteAnim_8393F14,
+ gSpriteAnim_8393F1C,
+ gSpriteAnim_8393F24,
+ gSpriteAnim_8393F2C,
+ gSpriteAnim_8393F34,
+ gSpriteAnim_8393F3C,
+ gSpriteAnim_8393F44,
+ gSpriteAnim_8393F4C,
+};
+static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate =
+{
+ .tileTag = 1001,
+ .paletteTag = 1001,
+ .oam = &gOamData_8393F0C,
+ .anims = sStartCopyrightBannerAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_PressStartCopyrightBanner,
+};
+static const struct SpriteSheet gUnknown_08393F8C[] =
+{
+ {gTitleScreenPressStart_Gfx, 0x520, 1001},
+ {NULL},
+};
+const struct SpritePalette sPokemonLogoShinePalette[] =
+{
+ {gTitleScreenLogoShinePalette, 1001},
+ {NULL},
+};
+static const struct OamData sPokemonLogoShineOamData =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd sPokemonLogoShineAnimSequence[] =
+{
+ ANIMCMD_FRAME(0, 4),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const sPokemonLogoShineAnimTable[] =
+{
+ sPokemonLogoShineAnimSequence,
+};
+static const struct SpriteTemplate sPokemonLogoShineSpriteTemplate =
+{
+ .tileTag = 1002,
+ .paletteTag = 1001,
+ .oam = &sPokemonLogoShineOamData,
+ .anims = sPokemonLogoShineAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallback_PokemonLogoShine,
+};
+static const struct SpriteSheet sPokemonLogoShineSpriteSheet[] =
+{
+ {sLogoShineTiles, 0x800, 1002},
+ {NULL},
+};
#define _RGB(r, g, b) ((((b) & 31) << 10) + (((g) & 31) << 5) + ((r) & 31))
@@ -66,10 +304,20 @@ static void UpdateLegendaryMarkingColor(u8);
#define RESET_RTC_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_LEFT)
#define A_B_START_SELECT (A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON)
+static void MainCB2(void);
+static void Task_TitleScreenPhase1(u8);
+static void Task_TitleScreenPhase2(u8);
+static void Task_TitleScreenPhase3(u8);
+static void CB2_GoToMainMenu(void);
+static void CB2_GoToClearSaveDataScreen(void);
+static void CB2_GoToResetRtcScreen(void);
+static void CB2_GoToCopyrightScreen(void);
+static void UpdateLegendaryMarkingColor(u8);
+
void SpriteCallback_VersionBannerLeft(struct Sprite *sprite)
{
struct Task *task = &gTasks[sprite->data1];
-
+
if (task->data[1] != 0)
{
sprite->oam.objMode = 0;
@@ -93,7 +341,7 @@ void SpriteCallback_VersionBannerLeft(struct Sprite *sprite)
void SpriteCallback_VersionBannerRight(struct Sprite *sprite)
{
struct Task *task = &gTasks[sprite->data1];
-
+
if (task->data[1] != 0)
{
sprite->oam.objMode = 0;
@@ -130,11 +378,11 @@ static void CreatePressStartBanner(s16 x, s16 y)
{
u8 i;
u8 spriteId;
-
+
x -= 32;
for (i = 0; i < 3; i++, x += 32)
{
- spriteId = CreateSprite(&gSpriteTemplate_8393F74, x, y, 0);
+ spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0);
StartSpriteAnim(&gSprites[spriteId], i);
gSprites[spriteId].data0 = 1;
}
@@ -144,11 +392,11 @@ static void CreateCopyrightBanner(s16 x, s16 y)
{
u8 i;
u8 spriteId;
-
+
x -= 64;
for (i = 0; i < 5; i++, x += 32)
{
- spriteId = CreateSprite(&gSpriteTemplate_8393F74, x, y, 0);
+ spriteId = CreateSprite(&sStartCopyrightBannerSpriteTemplate, x, y, 0);
StartSpriteAnim(&gSprites[spriteId], i + 3);
}
}
@@ -160,7 +408,7 @@ void SpriteCallback_PokemonLogoShine(struct Sprite *sprite)
if (sprite->data0) //Flash background
{
u16 backgroundColor;
-
+
if (sprite->pos1.x < DISPLAY_WIDTH / 2)
{
//Brighten background color
@@ -193,8 +441,8 @@ void SpriteCallback_PokemonLogoShine(struct Sprite *sprite)
static void StartPokemonLogoShine(bool8 flashBackground)
{
- u8 spriteId = CreateSprite(&gSpriteTemplate_8393FC0, 0, 68, 0);
-
+ u8 spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
+
gSprites[spriteId].oam.objMode = 2;
gSprites[spriteId].data0 = flashBackground;
}
@@ -208,11 +456,9 @@ static void VBlankCB(void)
REG_BG1VOFS = gUnknown_030041B4;
}
-enum
-{
- TD_COUNTER,
- TD_SKIP,
-};
+
+#define tCounter data[0]
+#define tSkipToNext data[1]
void CB2_InitTitleScreen(void)
{
@@ -245,28 +491,28 @@ void CB2_InitTitleScreen(void)
LZ77UnCompVram(gUnknown_08E9D8CC, (void *)VRAM);
LZ77UnCompVram(gUnknown_08E9F7E4, (void *)(VRAM + 0x4800));
LoadPalette(gUnknown_08E9F624, 0, 0x1C0);
- LZ77UnCompVram(gUnknown_08393250, (void *)(VRAM + 0x8000));
- LZ77UnCompVram(gUnknown_083939EC, (void *)(VRAM + 0xC000));
- LZ77UnCompVram(gUnknown_08393BF8, (void *)(VRAM + 0xC800));
- LoadPalette(gUnknown_08393210, 0xE0, 0x40);
+ LZ77UnCompVram(sLegendaryMonPixelData, (void *)(VRAM + 0x8000));
+ LZ77UnCompVram(sLegendaryMonTilemap, (void *)(VRAM + 0xC000));
+ LZ77UnCompVram(sBackdropTilemap, (void *)(VRAM + 0xC800));
+ LoadPalette(sLegendaryMonPalettes, 0xE0, sizeof(sLegendaryMonPalettes));
remove_some_task();
ResetTasks();
ResetSpriteData();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 14;
- LoadCompressedObjectPic(&gUnknown_08393EFC);
- LoadCompressedObjectPic(&gUnknown_08393F8C);
- LoadCompressedObjectPic(&gUnknown_08393FD8);
+ LoadCompressedObjectPic(&gUnknown_08393EFC[0]);
+ LoadCompressedObjectPic(&gUnknown_08393F8C[0]);
+ LoadCompressedObjectPic(&sPokemonLogoShineSpriteSheet[0]);
LoadPalette(gUnknown_08E9F624, 0x100, 0x1C0);
- LoadSpritePalette(&gUnknown_08393F9C[0]);
+ LoadSpritePalette(&sPokemonLogoShinePalette[0]);
gMain.state = 2;
break;
case 2:
{
u8 taskId = CreateTask(Task_TitleScreenPhase1, 0);
-
- gTasks[taskId].data[TD_COUNTER] = 0x100;
- gTasks[taskId].data[TD_SKIP] = FALSE;
+
+ gTasks[taskId].tCounter = 256;
+ gTasks[taskId].tSkipToNext = FALSE;
gTasks[taskId].data[2] = -16;
gTasks[taskId].data[3] = -32;
gUnknown_0202F7E4 = taskId;
@@ -281,7 +527,7 @@ void CB2_InitTitleScreen(void)
case 4:
{
u16 savedIme;
-
+
sub_813CE30(0x78, 0x50, 0x100, 0);
REG_BG2X = -29 * 256;
REG_BG2Y = -33 * 256;
@@ -294,9 +540,9 @@ void CB2_InitTitleScreen(void)
REG_BLDCNT = 0x84;
REG_BLDALPHA = 0;
REG_BLDY = 0x8;
- REG_BG0CNT = 0x180B;
- REG_BG1CNT = 0x190A;
- REG_BG2CNT = 0x4981;
+ REG_BG0CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(24) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG1CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(25) | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG2CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_256COLOR | BGCNT_AFF256x256;
savedIme = REG_IME;
REG_IME = 0;
REG_IE |= INTR_FLAG_VBLANK;
@@ -337,41 +583,41 @@ static void Task_TitleScreenPhase1(u8 taskId)
//Skip to next phase when A, B, Start, or Select is pressed
if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].data[1] != 0)
{
- gTasks[taskId].data[TD_SKIP] = TRUE;
- gTasks[taskId].data[TD_COUNTER] = 0;
+ gTasks[taskId].tSkipToNext = TRUE;
+ gTasks[taskId].tCounter = 0;
}
-
- if (gTasks[taskId].data[TD_COUNTER] != 0)
+
+ if (gTasks[taskId].tCounter != 0)
{
- u16 frameNum = gTasks[taskId].data[TD_COUNTER];
-
+ u16 frameNum = gTasks[taskId].tCounter;
+
if (frameNum == 160 || frameNum == 64)
StartPokemonLogoShine(TRUE);
- gTasks[taskId].data[TD_COUNTER]--;
+ gTasks[taskId].tCounter--;
}
else
{
u8 spriteId;
-
+
REG_DISPCNT = DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON;
REG_WININ = 0;
REG_WINOUT = 0;
REG_BLDCNT = 0x3F50;
REG_BLDALPHA = 0x1F;
REG_BLDY = 0;
-
+
//Create left side of version banner
- spriteId = CreateSprite(&gSpriteTemplate_8393ECC, 0x62, 0x1A, 0);
+ spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, 0x62, 0x1A, 0);
gSprites[spriteId].invisible = TRUE;
gSprites[spriteId].data1 = taskId;
-
+
//Create right side of version banner
- spriteId = CreateSprite(&gSpriteTemplate_8393EE4, 0xA2, 0x1A, 0);
+ spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, 0xA2, 0x1A, 0);
gSprites[spriteId].invisible = TRUE;
gSprites[spriteId].data1 = taskId;
-
+
gTasks[taskId].data[5] = 88;
- gTasks[taskId].data[TD_COUNTER] = 144;
+ gTasks[taskId].tCounter = 144;
gTasks[taskId].func = Task_TitleScreenPhase2;
}
}
@@ -380,17 +626,17 @@ static void Task_TitleScreenPhase1(u8 taskId)
static void Task_TitleScreenPhase2(u8 taskId)
{
//Skip to next phase when A, B, Start, or Select is pressed
- if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].data[TD_SKIP])
+ if ((gMain.newKeys & A_B_START_SELECT) || gTasks[taskId].tSkipToNext)
{
- gTasks[taskId].data[TD_SKIP] = TRUE;
- gTasks[taskId].data[TD_COUNTER] = 0;
+ gTasks[taskId].tSkipToNext = TRUE;
+ gTasks[taskId].tCounter = 0;
}
-
- if (gTasks[taskId].data[TD_COUNTER] != 0)
- gTasks[taskId].data[TD_COUNTER]--;
+
+ if (gTasks[taskId].tCounter != 0)
+ gTasks[taskId].tCounter--;
else
{
- gTasks[taskId].data[TD_SKIP] = TRUE;
+ gTasks[taskId].tSkipToNext = TRUE;
REG_DISPCNT = DISPCNT_MODE_1
| DISPCNT_OBJ_1D_MAP
| DISPCNT_BG0_ON
@@ -402,10 +648,10 @@ static void Task_TitleScreenPhase2(u8 taskId)
gTasks[taskId].data[4] = 0;
gTasks[taskId].func = Task_TitleScreenPhase3;
}
-
- if (!(gTasks[taskId].data[TD_COUNTER] & 1) && gTasks[taskId].data[3] != 0)
+
+ if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].data[3] != 0)
gTasks[taskId].data[3]++;
-
+
//Slide Pokemon logo up
REG_BG2Y = gTasks[taskId].data[3] * 256;
}
@@ -416,7 +662,7 @@ static void Task_TitleScreenPhase3(u8 taskId)
REG_BLDCNT = 0x2142;
REG_BLDALPHA = 0x1F0F;
REG_BLDY = 0;
-
+
if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & START_BUTTON))
{
FadeOutBGM(4);
@@ -437,14 +683,14 @@ static void Task_TitleScreenPhase3(u8 taskId)
else
{
REG_BG2Y = 0;
- gTasks[taskId].data[TD_COUNTER]++;
- if (gTasks[taskId].data[TD_COUNTER] & 1)
+ gTasks[taskId].tCounter++;
+ if (gTasks[taskId].tCounter & 1)
{
gTasks[taskId].data[4]++;
gUnknown_030041B4 = gTasks[taskId].data[4];
gUnknown_030042C0 = 0;
}
- UpdateLegendaryMarkingColor(gTasks[taskId].data[TD_COUNTER]);
+ UpdateLegendaryMarkingColor(gTasks[taskId].tCounter);
if ((gMPlay_BGM.status & 0xFFFF) == 0)
{
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF);
@@ -481,12 +727,12 @@ static void CB2_GoToResetRtcScreen(void)
static void UpdateLegendaryMarkingColor(u8 frameNum)
{
u16 palette;
-
+
if ((frameNum % 4) == 0) //Change color every 4th frame
{
u8 colorIntensity = (frameNum >> 2) & 31; //Take bits 2-6 of frameNum the color intensity
u8 fadeDarker = (frameNum >> 2) & 32;
-
+
if (!fadeDarker)
palette = LEGENDARY_MARKING_COLOR(colorIntensity);
else
diff --git a/src/trainer_card.c b/src/trainer_card.c
index 83551eb2b..0070e8a9a 100644
--- a/src/trainer_card.c
+++ b/src/trainer_card.c
@@ -14,10 +14,12 @@
#include "sprite.h"
#include "string_util.h"
#include "task.h"
+#include "script_pokemon_80C4.h"
typedef void (*Callback)(void);
-struct Struct2000000 {
+struct Struct2000000
+{
/*0x00*/ u8 var_0;
/*0x01*/ bool8 var_1;
/*0x02*/ u8 var_2;
@@ -70,7 +72,8 @@ void FormatPlayTime(u8 *playtime, u16 hours, u16 minutes, s16 colon);
u16 GetPokedexSeenCount(void);
-enum {
+enum
+{
TD_0,
TD_1,
TD_CALLBACK,
@@ -144,13 +147,15 @@ static void TrainerCard_Back_PrintPokemonTrades_Label(void);
static void TrainerCard_Back_PrintPokemonTrades(void);
void unref_sub_8094588(u16 left, u16 top);
-void sub_8093110(Callback arg1) {
+void sub_8093110(Callback arg1)
+{
sub_80932AC(arg1);
SetMainCallback2(sub_8093174);
unk_2000000.language = GAME_LANGUAGE;
}
-void sub_8093130(u8 playerIndex, Callback arg2) {
+void sub_8093130(u8 playerIndex, Callback arg2)
+{
struct Struct2000000* r2;
struct LinkPlayer* r3;
struct LinkPlayerMapObject* r4;
@@ -169,53 +174,57 @@ void sub_8093130(u8 playerIndex, Callback arg2) {
}
-static void sub_8093174(void) {
- switch (gMain.state) {
- case 0:
- sub_8093534();
- sub_8093688();
- gMain.state += 1;
- break;
- case 1:
- sub_8093598();
- gMain.state += 1;
- break;
- case 2:
- sub_80935EC();
- gMain.state += 1;
- break;
- case 3:
- sub_8093610();
- sub_80937A4();
- gMain.state += 1;
- break;
- case 4:
- sub_80937BC();
- gMain.state += 1;
- case 5:
- if (MultistepInitMenuWindowContinue() == FALSE) {
- return;
- }
- gMain.state += 1;
- break;
- case 6:
- sub_80937F0();
- gMain.state += 1;
- break;
- case 7:
- sub_80937D8();
- gMain.state += 1;
- break;
- case 8:
- nullsub_15();
- sub_8093800();
- sub_8093550();
- SetMainCallback2(sub_809323C);
- break;
+static void sub_8093174(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ sub_8093534();
+ sub_8093688();
+ gMain.state += 1;
+ break;
+ case 1:
+ sub_8093598();
+ gMain.state += 1;
+ break;
+ case 2:
+ sub_80935EC();
+ gMain.state += 1;
+ break;
+ case 3:
+ sub_8093610();
+ sub_80937A4();
+ gMain.state += 1;
+ break;
+ case 4:
+ sub_80937BC();
+ gMain.state += 1;
+ case 5:
+ if (MultistepInitMenuWindowContinue() == FALSE)
+ {
+ return;
+ }
+ gMain.state += 1;
+ break;
+ case 6:
+ sub_80937F0();
+ gMain.state += 1;
+ break;
+ case 7:
+ sub_80937D8();
+ gMain.state += 1;
+ break;
+ case 8:
+ nullsub_15();
+ sub_8093800();
+ sub_8093550();
+ SetMainCallback2(sub_809323C);
+ break;
}
}
-static void sub_809323C(void) {
+static void sub_809323C(void)
+{
RunTasks();
AnimateSprites();
BuildOamBuffer();
@@ -237,43 +246,51 @@ static void sub_8093254(void)
DmaCopy16(3, gUnknown_03004DE0, gUnknown_03004DE0 + 0x780, 320);
}
-static void sub_80932AC(Callback callBack) {
+static void sub_80932AC(Callback callBack)
+{
u8 taskId = CreateTask(nullsub_60, 0xFF);
struct Task *task = &gTasks[taskId];
task->data[TD_0] = FALSE;
- StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32) callBack);
+ StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack);
}
-static void sub_80932E4(u8 arg1, Callback callBack) {
+static void sub_80932E4(u8 arg1, Callback callBack)
+{
u8 taskId = CreateTask(nullsub_60, 0xFF);
struct Task *task = &gTasks[taskId];
task->data[TD_0] = TRUE;
task->data[TD_1] = arg1;
- StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32) callBack);
+ StoreWordInTwoHalfwords(&task->data[TD_CALLBACK], (u32)callBack);
}
-void sub_8093324(void) {
+void sub_8093324(void)
+{
u8 taskId = FindTaskIdByFunc(nullsub_60);
struct Task *task = &gTasks[taskId];
unk_2000000.var_1 = task->data[TD_0];
- LoadWordFromTwoHalfwords((u16 *) &task->data[TD_CALLBACK], (u32 *) &unk_2000000.var_60);
+ LoadWordFromTwoHalfwords((u16 *)&task->data[TD_CALLBACK], (u32 *)&unk_2000000.var_60);
- if (unk_2000000.var_1) {
- struct TrainerCard (*trainerCards)[4] = &gTrainerCards;
+ if (unk_2000000.var_1)
+ {
+ struct TrainerCard(*trainerCards)[4] = &gTrainerCards;
s16 var = task->data[TD_1];
struct TrainerCard *dest = &(*trainerCards)[var];
memcpy(&unk_2000000.var_64, dest, sizeof(struct TrainerCard));
- } else {
+ }
+ else
+ {
sub_8093390(&unk_2000000.var_64);
}
}
-static void nullsub_60(u8 taskid) {
+static void nullsub_60(u8 taskid)
+{
}
-void sub_8093390(struct TrainerCard *arg1) {
+void sub_8093390(struct TrainerCard *arg1)
+{
u32 playTime;
bool32 enteredHallOfFame;
bool8 r4;
@@ -285,7 +302,8 @@ void sub_8093390(struct TrainerCard *arg1) {
playTime = GetGameStat(GAME_STAT_FIRST_HOF_PLAY_TIME);
enteredHallOfFame = GetGameStat(GAME_STAT_ENTERED_HOF);
- if (!enteredHallOfFame) {
+ if (!enteredHallOfFame)
+ {
playTime = 0;
}
arg1->firstHallOfFameA = playTime >> 16;
@@ -314,82 +332,97 @@ void sub_8093390(struct TrainerCard *arg1) {
// Battle tower?
arg1->battleTowerWins = gSaveBlock2.filler_A8.var_4C8;
arg1->battleTowerLosses = gSaveBlock2.filler_A8.var_4CA;
- if (arg1->battleTowerWins > 9999) {
+ if (arg1->battleTowerWins > 9999)
+ {
arg1->battleTowerWins = 9999;
}
- if (arg1->battleTowerLosses > 9999) {
+ if (arg1->battleTowerLosses > 9999)
+ {
arg1->battleTowerLosses = 9999;
}
r4 = FALSE;
- if (sub_80C4D50() > 4) {
+ if (sub_80C4D50() > 4)
+ {
r4 = TRUE;
}
arg1->var_4 = r4;
arg1->money = gSaveBlock1.money;
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < 4; i++)
+ {
arg1->var_28[i] = gSaveBlock1.unk2B1C[i];
}
- for (i = 0; i < 8; i++) {
+ for (i = 0; i < 8; i++)
+ {
arg1->playerName[i] = gSaveBlock2.playerName[i];
}
arg1->stars = sub_80934F4(arg1);
}
-u8 sub_80934C4(u8 id) {
+u8 sub_80934C4(u8 id)
+{
return gTrainerCards[id].stars;
-}
+}
-static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal) {
+static u32 sav12_xor_get_clamped_above(u8 index, u32 maxVal)
+{
u32 value = GetGameStat(index);
- if (value > maxVal) {
+ if (value > maxVal)
+ {
value = maxVal;
}
return value;
}
-static u8 sub_80934F4(struct TrainerCard *trainerCard) {
+static u8 sub_80934F4(struct TrainerCard *trainerCard)
+{
u8 value = 0;
- if (trainerCard->firstHallOfFameA != 0 || trainerCard->firstHallOfFameB != 0 || trainerCard->firstHallOfFameC != 0) {
+ if (trainerCard->firstHallOfFameA != 0 || trainerCard->firstHallOfFameB != 0 || trainerCard->firstHallOfFameC != 0)
+ {
value += 1;
}
- if (trainerCard->var_3) {
+ if (trainerCard->var_3)
+ {
value += 1;
}
- if (trainerCard->battleTowerLosses > 49) {
+ if (trainerCard->battleTowerLosses > 49)
+ {
value += 1;
}
- if (trainerCard->var_4) {
+ if (trainerCard->var_4)
+ {
value += 1;
}
return value;
}
-static void sub_8093534(void) {
+static void sub_8093534(void)
+{
SetVBlankCallback(NULL);
SetHBlankCallback(NULL);
REG_DISPCNT = 0;
}
-static void sub_8093550(void) {
+static void sub_8093550(void)
+{
u16 backup;
SetVBlankCallback(sub_8093254);
backup = REG_IME;
REG_IME = 0;
- REG_IE |= INTR_FLAG_VBLANK| INTR_FLAG_HBLANK;
+ REG_IE |= INTR_FLAG_VBLANK | INTR_FLAG_HBLANK;
REG_IME = backup;
REG_DISPSTAT |= DISPSTAT_VBLANK_INTR | DISPSTAT_HBLANK_INTR;
@@ -397,121 +430,124 @@ static void sub_8093550(void) {
}
__attribute__((naked))
-void sub_8093598() {
+void sub_8093598()
+{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- sub sp, 0x4\n\
- movs r2, 0xC0\n\
- lsls r2, 19\n\
- movs r3, 0x80\n\
- lsls r3, 9\n\
- mov r4, sp\n\
- movs r6, 0\n\
- ldr r1, _080935E4 @ =0x040000d4\n\
- movs r5, 0x80\n\
- lsls r5, 5\n\
- ldr r7, _080935E8 @ =0x81000800\n\
- movs r0, 0x81\n\
- lsls r0, 24\n\
- mov r12, r0\n\
+ push {r4-r7,lr}\n\
+ sub sp, 0x4\n\
+ movs r2, 0xC0\n\
+ lsls r2, 19\n\
+ movs r3, 0x80\n\
+ lsls r3, 9\n\
+ mov r4, sp\n\
+ movs r6, 0\n\
+ ldr r1, _080935E4 @ =0x040000d4\n\
+ movs r5, 0x80\n\
+ lsls r5, 5\n\
+ ldr r7, _080935E8 @ =0x81000800\n\
+ movs r0, 0x81\n\
+ lsls r0, 24\n\
+ mov r12, r0\n\
_080935B6:\n\
- strh r6, [r4]\n\
- mov r0, sp\n\
- str r0, [r1]\n\
- str r2, [r1, 0x4]\n\
- str r7, [r1, 0x8]\n\
- ldr r0, [r1, 0x8]\n\
- adds r2, r5\n\
- subs r3, r5\n\
- cmp r3, r5\n\
- bhi _080935B6\n\
- strh r6, [r4]\n\
- mov r0, sp\n\
- str r0, [r1]\n\
- str r2, [r1, 0x4]\n\
- lsrs r0, r3, 1\n\
- mov r2, r12\n\
- orrs r0, r2\n\
- str r0, [r1, 0x8]\n\
- ldr r0, [r1, 0x8]\n\
- add sp, 0x4\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ strh r6, [r4]\n\
+ mov r0, sp\n\
+ str r0, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ str r7, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ adds r2, r5\n\
+ subs r3, r5\n\
+ cmp r3, r5\n\
+ bhi _080935B6\n\
+ strh r6, [r4]\n\
+ mov r0, sp\n\
+ str r0, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ lsrs r0, r3, 1\n\
+ mov r2, r12\n\
+ orrs r0, r2\n\
+ str r0, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ add sp, 0x4\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_080935E4: .4byte 0x040000d4\n\
_080935E8: .4byte 0x81000800\n\
.syntax divided\n");
}
__attribute__((naked))
-void sub_80935EC() {
+void sub_80935EC()
+{
asm(".syntax unified\n\
- sub sp, 0x4\n\
- movs r2, 0xE0\n\
- lsls r2, 19\n\
- mov r1, sp\n\
- movs r0, 0\n\
- strh r0, [r1]\n\
- ldr r0, _08093608 @ =0x040000d4\n\
- str r1, [r0]\n\
- str r2, [r0, 0x4]\n\
- ldr r1, _0809360C @ =0x81000200\n\
- str r1, [r0, 0x8]\n\
- ldr r0, [r0, 0x8]\n\
- add sp, 0x4\n\
- bx lr\n\
- .align 2, 0\n\
+ sub sp, 0x4\n\
+ movs r2, 0xE0\n\
+ lsls r2, 19\n\
+ mov r1, sp\n\
+ movs r0, 0\n\
+ strh r0, [r1]\n\
+ ldr r0, _08093608 @ =0x040000d4\n\
+ str r1, [r0]\n\
+ str r2, [r0, 0x4]\n\
+ ldr r1, _0809360C @ =0x81000200\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ add sp, 0x4\n\
+ bx lr\n\
+ .align 2, 0\n\
_08093608: .4byte 0x040000d4\n\
_0809360C: .4byte 0x81000200\n\
.syntax divided\n");
}
__attribute__((naked))
-void sub_8093610() {
+void sub_8093610()
+{
asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- ldr r5, _08093664 @ =REG_BG0CNT\n\
- movs r1, 0\n\
- strh r1, [r5]\n\
- ldr r2, _08093668 @ =REG_BG1CNT\n\
- strh r1, [r2]\n\
- ldr r3, _0809366C @ =REG_BG2CNT\n\
- strh r1, [r3]\n\
- ldr r4, _08093670 @ =REG_BG3CNT\n\
- strh r1, [r4]\n\
- ldr r0, _08093674 @ =REG_BG0HOFS\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- ldr r1, _08093678 @ =0x00001e08\n\
- adds r0, r1, 0\n\
- strh r0, [r5]\n\
- ldr r1, _0809367C @ =0x00000801\n\
- adds r0, r1, 0\n\
- strh r0, [r2]\n\
- ldr r1, _08093680 @ =0x00000902\n\
- adds r0, r1, 0\n\
- strh r0, [r3]\n\
- ldr r1, _08093684 @ =0x00000a03\n\
- adds r0, r1, 0\n\
- strh r0, [r4]\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ push {r4,r5,lr}\n\
+ ldr r5, _08093664 @ =REG_BG0CNT\n\
+ movs r1, 0\n\
+ strh r1, [r5]\n\
+ ldr r2, _08093668 @ =REG_BG1CNT\n\
+ strh r1, [r2]\n\
+ ldr r3, _0809366C @ =REG_BG2CNT\n\
+ strh r1, [r3]\n\
+ ldr r4, _08093670 @ =REG_BG3CNT\n\
+ strh r1, [r4]\n\
+ ldr r0, _08093674 @ =REG_BG0HOFS\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ ldr r1, _08093678 @ =0x00001e08\n\
+ adds r0, r1, 0\n\
+ strh r0, [r5]\n\
+ ldr r1, _0809367C @ =0x00000801\n\
+ adds r0, r1, 0\n\
+ strh r0, [r2]\n\
+ ldr r1, _08093680 @ =0x00000902\n\
+ adds r0, r1, 0\n\
+ strh r0, [r3]\n\
+ ldr r1, _08093684 @ =0x00000a03\n\
+ adds r0, r1, 0\n\
+ strh r0, [r4]\n\
+ pop {r4,r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_08093664: .4byte 0x4000008 @ REG_BG0CNT\n\
_08093668: .4byte 0x400000A @ REG_BG1CNT\n\
_0809366C: .4byte 0x400000C @ REG_BG2CNT\n\
@@ -525,7 +561,8 @@ _08093684: .4byte 0x00000a03\n\
}
#ifdef NONMATCHING
-static void sub_8093688(void) {
+static void sub_8093688(void)
+{
int i;
asm_comment("WIP");
@@ -540,7 +577,8 @@ static void sub_8093688(void) {
unk_2000000.var_5 = FALSE;
unk_2000000.var_6 = FALSE;
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < 4; i++)
+ {
sub_80EB3FC(unk_2000000.var_20[i], unk_2000000.var_64.var_28[i]);
}
@@ -549,50 +587,52 @@ static void sub_8093688(void) {
#else
__attribute__((naked))
-static void sub_8093688(void) {
+static void sub_8093688(void)
+{
asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- bl sub_8093324\n\
- ldr r2, _080936D0 @ =0x02000000\n\
- movs r1, 0\n\
- strb r1, [r2]\n\
- strb r1, [r2, 0x3]\n\
- strb r1, [r2, 0x4]\n\
- adds r0, r2, 0\n\
- adds r0, 0x65\n\
- ldrb r0, [r0]\n\
- strb r0, [r2, 0x2]\n\
- strb r1, [r2, 0x5]\n\
- strb r1, [r2, 0x6]\n\
- movs r4, 0\n\
- adds r6, r2, 0\n\
- adds r6, 0x20\n\
- adds r5, r2, 0\n\
- adds r5, 0x8C\n\
+ push {r4-r6,lr}\n\
+ bl sub_8093324\n\
+ ldr r2, _080936D0 @ =0x02000000\n\
+ movs r1, 0\n\
+ strb r1, [r2]\n\
+ strb r1, [r2, 0x3]\n\
+ strb r1, [r2, 0x4]\n\
+ adds r0, r2, 0\n\
+ adds r0, 0x65\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r2, 0x2]\n\
+ strb r1, [r2, 0x5]\n\
+ strb r1, [r2, 0x6]\n\
+ movs r4, 0\n\
+ adds r6, r2, 0\n\
+ adds r6, 0x20\n\
+ adds r5, r2, 0\n\
+ adds r5, 0x8C\n\
_080936AE:\n\
- lsls r0, r4, 4\n\
- adds r0, r6\n\
- lsls r1, r4, 1\n\
- adds r1, r5, r1\n\
- ldrh r1, [r1]\n\
- bl sub_80EB3FC\n\
- adds r0, r4, 0x1\n\
- lsls r0, 24\n\
- lsrs r4, r0, 24\n\
- cmp r4, 0x3\n\
- bls _080936AE\n\
- bl sub_80936D4\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ lsls r0, r4, 4\n\
+ adds r0, r6\n\
+ lsls r1, r4, 1\n\
+ adds r1, r5, r1\n\
+ ldrh r1, [r1]\n\
+ bl sub_80EB3FC\n\
+ adds r0, r4, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ cmp r4, 0x3\n\
+ bls _080936AE\n\
+ bl sub_80936D4\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_080936D0: .4byte 0x02000000\n\
.syntax divided\n");
}
#endif
-void sub_80936D4(void) {
+void sub_80936D4(void)
+{
unk_2000000.var_7 = FALSE;
unk_2000000.var_8 = FALSE;
unk_2000000.var_9 = FALSE;
@@ -603,86 +643,104 @@ void sub_80936D4(void) {
memset(unk_2000000.var_e, 0, sizeof(unk_2000000.var_e));
- if (unk_2000000.var_64.hasPokedex) {
+ if (unk_2000000.var_64.hasPokedex)
+ {
unk_2000000.var_7 += TRUE;
}
if (unk_2000000.var_64.firstHallOfFameA != 0 || unk_2000000.var_64.firstHallOfFameB != 0 ||
- unk_2000000.var_64.firstHallOfFameC != 0) {
+ unk_2000000.var_64.firstHallOfFameC != 0)
+ {
unk_2000000.var_8 += TRUE;
}
- if (unk_2000000.var_64.linkBattleWins != 0 || unk_2000000.var_64.linkBattleLosses != 0) {
+ if (unk_2000000.var_64.linkBattleWins != 0 || unk_2000000.var_64.linkBattleLosses != 0)
+ {
unk_2000000.var_9 += TRUE;
}
- if (unk_2000000.var_64.battleTowerWins != 0 || unk_2000000.var_64.battleTowerLosses != 0) {
+ if (unk_2000000.var_64.battleTowerWins != 0 || unk_2000000.var_64.battleTowerLosses != 0)
+ {
unk_2000000.var_a += TRUE;
}
- if (unk_2000000.var_64.contestsWithFriends != 0) {
+ if (unk_2000000.var_64.contestsWithFriends != 0)
+ {
unk_2000000.var_b += TRUE;
}
- if (unk_2000000.var_64.pokeblocksWithFriends != 0) {
+ if (unk_2000000.var_64.pokeblocksWithFriends != 0)
+ {
unk_2000000.var_c += TRUE;
}
- if (unk_2000000.var_64.pokemonTrades != 0) {
+ if (unk_2000000.var_64.pokemonTrades != 0)
+ {
unk_2000000.var_d += TRUE;
}
- if (!unk_2000000.var_1) {
+ if (!unk_2000000.var_1)
+ {
u32 badgeFlag;
int i;
i = 0;
badgeFlag = BADGE01_GET;
- while (TRUE) {
- if (FlagGet(badgeFlag)) {
+ while (TRUE)
+ {
+ if (FlagGet(badgeFlag))
+ {
unk_2000000.var_e[i] += TRUE;
}
badgeFlag += 1;
i += 1;
- if (badgeFlag > BADGE08_GET) {
+ if (badgeFlag > BADGE08_GET)
+ {
break;
}
}
}
}
-void sub_80937A4() {
+void sub_80937A4()
+{
ResetPaletteFade();
ResetSpriteData();
FreeAllSpritePalettes();
ResetTasks();
}
-void sub_80937BC() {
+void sub_80937BC()
+{
SetUpWindowConfig(&WindowConfig_TrainerCard_Back_Values);
MultistepInitMenuWindowBegin(&WindowConfig_TrainerCard_Back_Values);
}
-static void sub_80937D8() {
+static void sub_80937D8()
+{
sub_8093E04();
sub_8093E28();
sub_8093F64();
sub_8093DAC();
}
-static void sub_80937F0() {
+static void sub_80937F0()
+{
sub_8093EF8();
}
-static void nullsub_15(void) {
+static void nullsub_15(void)
+{
}
-static void sub_8093800() {
+static void sub_8093800()
+{
sub_809380C();
}
-static void sub_809380C() {
+static void sub_809380C()
+{
u8 taskId;
taskId = CreateTask(sub_809382C, 0);
@@ -690,31 +748,32 @@ static void sub_809380C() {
}
__attribute__((naked))
-static void sub_809382C(u8 taskId) {
+static void sub_809382C(u8 taskId)
+{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- ldr r7, _08093858 @ =gUnknown_083B5EBC\n\
- lsls r1, r0, 2\n\
- adds r1, r0\n\
- lsls r4, r1, 3\n\
- ldr r6, _0809385C @ =0x02000000\n\
- ldr r5, _08093860 @ =gTasks\n\
+ push {r4-r7,lr}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ ldr r7, _08093858 @ =gUnknown_083B5EBC\n\
+ lsls r1, r0, 2\n\
+ adds r1, r0\n\
+ lsls r4, r1, 3\n\
+ ldr r6, _0809385C @ =0x02000000\n\
+ ldr r5, _08093860 @ =gTasks\n\
_0809383E:\n\
- ldrb r0, [r6]\n\
- lsls r0, 2\n\
- adds r0, r7\n\
- ldr r1, [r0]\n\
- adds r0, r4, r5\n\
- bl _call_via_r1\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _0809383E\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ ldrb r0, [r6]\n\
+ lsls r0, 2\n\
+ adds r0, r7\n\
+ ldr r1, [r0]\n\
+ adds r0, r4, r5\n\
+ bl _call_via_r1\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _0809383E\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_08093858: .4byte gUnknown_083B5EBC\n\
_0809385C: .4byte 0x02000000\n\
_08093860: .4byte gTasks\n\
@@ -722,114 +781,118 @@ _08093860: .4byte gTasks\n\
}
__attribute__((naked))
-bool8 sub_8093864() {
+bool8 sub_8093864()
+{
asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- sub sp, 0x4\n\
- ldr r4, _080938A0 @ =0x02000000\n\
- ldr r2, _080938A4 @ =gSaveBlock2\n\
- ldrb r1, [r2, 0x11]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- movs r5, 0\n\
- strb r0, [r4, 0x5]\n\
- ldrb r0, [r2, 0x12]\n\
- strb r0, [r4, 0x6]\n\
- bl sub_80939A4\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- str r5, [sp]\n\
- movs r1, 0\n\
- movs r2, 0x10\n\
- movs r3, 0\n\
- bl BeginNormalPaletteFade\n\
- ldrb r0, [r4]\n\
- adds r0, 0x1\n\
- strb r0, [r4]\n\
- movs r0, 0\n\
- add sp, 0x4\n\
- pop {r4,r5}\n\
- pop {r1}\n\
- bx r1\n\
- .align 2, 0\n\
+ push {r4,r5,lr}\n\
+ sub sp, 0x4\n\
+ ldr r4, _080938A0 @ =0x02000000\n\
+ ldr r2, _080938A4 @ =gSaveBlock2\n\
+ ldrb r1, [r2, 0x11]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ movs r5, 0\n\
+ strb r0, [r4, 0x5]\n\
+ ldrb r0, [r2, 0x12]\n\
+ strb r0, [r4, 0x6]\n\
+ bl sub_80939A4\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ str r5, [sp]\n\
+ movs r1, 0\n\
+ movs r2, 0x10\n\
+ movs r3, 0\n\
+ bl BeginNormalPaletteFade\n\
+ ldrb r0, [r4]\n\
+ adds r0, 0x1\n\
+ strb r0, [r4]\n\
+ movs r0, 0\n\
+ add sp, 0x4\n\
+ pop {r4,r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
_080938A0: .4byte 0x02000000\n\
_080938A4: .4byte gSaveBlock2\n\
.syntax divided\n");
}
__attribute__((naked))
-bool8 sub_80938A8() {
+bool8 sub_80938A8()
+{
asm(".syntax unified\n\
- push {lr}\n\
- ldr r0, _080938C4 @ =gPaletteFade\n\
- ldrb r1, [r0, 0x7]\n\
- movs r0, 0x80\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _080938BE\n\
- ldr r1, _080938C8 @ =0x02000000\n\
- ldrb r0, [r1]\n\
- adds r0, 0x1\n\
- strb r0, [r1]\n\
+ push {lr}\n\
+ ldr r0, _080938C4 @ =gPaletteFade\n\
+ ldrb r1, [r0, 0x7]\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080938BE\n\
+ ldr r1, _080938C8 @ =0x02000000\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
_080938BE:\n\
- movs r0, 0\n\
- pop {r1}\n\
- bx r1\n\
- .align 2, 0\n\
+ movs r0, 0\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
_080938C4: .4byte gPaletteFade\n\
_080938C8: .4byte 0x02000000\n\
.syntax divided\n");
}
__attribute__((naked))
-bool8 sub_80938CC() {
+bool8 sub_80938CC()
+{
asm(".syntax unified\n\
- push {lr}\n\
- ldr r0, _080938E4 @ =gMain\n\
- ldrh r1, [r0, 0x2E]\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _080938EC\n\
- ldr r1, _080938E8 @ =0x02000000\n\
- movs r0, 0x5\n\
- strb r0, [r1]\n\
- movs r0, 0x1\n\
- b _08093914\n\
- .align 2, 0\n\
+ push {lr}\n\
+ ldr r0, _080938E4 @ =gMain\n\
+ ldrh r1, [r0, 0x2E]\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _080938EC\n\
+ ldr r1, _080938E8 @ =0x02000000\n\
+ movs r0, 0x5\n\
+ strb r0, [r1]\n\
+ movs r0, 0x1\n\
+ b _08093914\n\
+ .align 2, 0\n\
_080938E4: .4byte gMain\n\
_080938E8: .4byte 0x02000000\n\
_080938EC:\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _08093912\n\
- ldr r2, _08093900 @ =0x02000000\n\
- ldrb r1, [r2, 0x3]\n\
- cmp r1, 0\n\
- beq _08093904\n\
- movs r0, 0x5\n\
- b _0809390C\n\
- .align 2, 0\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _08093912\n\
+ ldr r2, _08093900 @ =0x02000000\n\
+ ldrb r1, [r2, 0x3]\n\
+ cmp r1, 0\n\
+ beq _08093904\n\
+ movs r0, 0x5\n\
+ b _0809390C\n\
+ .align 2, 0\n\
_08093900: .4byte 0x02000000\n\
_08093904:\n\
- movs r0, 0x1\n\
- eors r0, r1\n\
- strb r0, [r2, 0x3]\n\
- movs r0, 0x3\n\
+ movs r0, 0x1\n\
+ eors r0, r1\n\
+ strb r0, [r2, 0x3]\n\
+ movs r0, 0x3\n\
_0809390C:\n\
- strb r0, [r2]\n\
- movs r0, 0x1\n\
- b _08093914\n\
+ strb r0, [r2]\n\
+ movs r0, 0x1\n\
+ b _08093914\n\
_08093912:\n\
- movs r0, 0\n\
+ movs r0, 0\n\
_08093914:\n\
- pop {r1}\n\
- bx r1\n\
+ pop {r1}\n\
+ bx r1\n\
.syntax divided\n");
}
-bool8 sub_8093918() {
+bool8 sub_8093918()
+{
sub_8093A28();
PlaySE(SE_CARD);
@@ -838,8 +901,10 @@ bool8 sub_8093918() {
return FALSE;
}
-bool8 sub_8093938() {
- if (sub_8093A48()) {
+bool8 sub_8093938()
+{
+ if (sub_8093A48())
+ {
unk_2000000.var_0 = 2;
}
@@ -847,60 +912,68 @@ bool8 sub_8093938() {
}
__attribute__((naked))
-bool8 sub_8093954() {
+bool8 sub_8093954()
+{
asm(".syntax unified\n\
- push {lr}\n\
- sub sp, 0x4\n\
- bl sub_80939C0\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- movs r1, 0\n\
- str r1, [sp]\n\
- movs r2, 0\n\
- movs r3, 0x10\n\
- bl BeginNormalPaletteFade\n\
- ldr r1, _0809397C @ =0x02000000\n\
- ldrb r0, [r1]\n\
- adds r0, 0x1\n\
- strb r0, [r1]\n\
- movs r0, 0\n\
- add sp, 0x4\n\
- pop {r1}\n\
- bx r1\n\
- .align 2, 0\n\
+ push {lr}\n\
+ sub sp, 0x4\n\
+ bl sub_80939C0\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ movs r1, 0\n\
+ str r1, [sp]\n\
+ movs r2, 0\n\
+ movs r3, 0x10\n\
+ bl BeginNormalPaletteFade\n\
+ ldr r1, _0809397C @ =0x02000000\n\
+ ldrb r0, [r1]\n\
+ adds r0, 0x1\n\
+ strb r0, [r1]\n\
+ movs r0, 0\n\
+ add sp, 0x4\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
_0809397C: .4byte 0x02000000\n\
.syntax divided\n");
}
-bool8 sub_8093980() {
- if (!gPaletteFade.active) {
- SetMainCallback2((MainCallback) unk_2000000.var_60);
+bool8 sub_8093980()
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2((MainCallback)unk_2000000.var_60);
}
return FALSE;
}
-static void sub_80939A4(void) {
+static void sub_80939A4(void)
+{
CreateTask(sub_80939DC, 0);
BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values);
}
-static void sub_80939C0(void) {
+static void sub_80939C0(void)
+{
u8 taskId;
taskId = FindTaskIdByFunc(sub_80939DC);
- if (taskId != 0xFF) {
+ if (taskId != 0xFF)
+ {
DestroyTask(taskId);
}
}
-static void sub_80939DC(u8 taskId) {
+static void sub_80939DC(u8 taskId)
+{
u8 buffer[32];
struct Task *task;
task = &gTasks[taskId];
- if (unk_2000000.var_5 != task->data[TD_1]) {
+ if (unk_2000000.var_5 != task->data[TD_1])
+ {
task->data[TD_1] = unk_2000000.var_5;
task->data[TD_0] ^= TRUE;
}
@@ -909,7 +982,8 @@ static void sub_80939DC(u8 taskId) {
MenuPrint(buffer, 10, 12);
}
-static void sub_8093A28(void) {
+static void sub_8093A28(void)
+{
u8 taskId;
taskId = CreateTask(sub_8093A68, 0);
@@ -917,93 +991,96 @@ static void sub_8093A28(void) {
}
__attribute__((naked))
-static u8 sub_8093A48() {
+static u8 sub_8093A48()
+{
asm(".syntax unified\n\
- push {lr}\n\
- ldr r0, _08093A5C @ =sub_8093A68\n\
- bl FindTaskIdByFunc\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- cmp r0, 0xFF\n\
- beq _08093A60\n\
- movs r0, 0\n\
- b _08093A62\n\
- .align 2, 0\n\
+ push {lr}\n\
+ ldr r0, _08093A5C @ =sub_8093A68\n\
+ bl FindTaskIdByFunc\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0xFF\n\
+ beq _08093A60\n\
+ movs r0, 0\n\
+ b _08093A62\n\
+ .align 2, 0\n\
_08093A5C: .4byte sub_8093A68\n\
_08093A60:\n\
- movs r0, 0x1\n\
+ movs r0, 0x1\n\
_08093A62:\n\
- pop {r1}\n\
- bx r1\n\
+ pop {r1}\n\
+ bx r1\n\
.syntax divided\n");
}
__attribute__((naked))
-static void sub_8093A68(u8 taskId) {
+static void sub_8093A68(u8 taskId)
+{
asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- lsls r0, 24\n\
- lsrs r0, 24\n\
- ldr r5, _08093A98 @ =gUnknown_083B5ED8\n\
- ldr r2, _08093A9C @ =gTasks\n\
- lsls r1, r0, 2\n\
- adds r1, r0\n\
- lsls r1, 3\n\
- adds r4, r1, r2\n\
+ push {r4,r5,lr}\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ ldr r5, _08093A98 @ =gUnknown_083B5ED8\n\
+ ldr r2, _08093A9C @ =gTasks\n\
+ lsls r1, r0, 2\n\
+ adds r1, r0\n\
+ lsls r1, 3\n\
+ adds r4, r1, r2\n\
_08093A7A:\n\
- movs r1, 0x8\n\
- ldrsh r0, [r4, r1]\n\
- lsls r0, 2\n\
- adds r0, r5\n\
- ldr r1, [r0]\n\
- adds r0, r4, 0\n\
- bl _call_via_r1\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- bne _08093A7A\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ movs r1, 0x8\n\
+ ldrsh r0, [r4, r1]\n\
+ lsls r0, 2\n\
+ adds r0, r5\n\
+ ldr r1, [r0]\n\
+ adds r0, r4, 0\n\
+ bl _call_via_r1\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _08093A7A\n\
+ pop {r4,r5}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_08093A98: .4byte gUnknown_083B5ED8\n\
_08093A9C: .4byte gTasks\n\
.syntax divided\n");
}
__attribute__((naked))
-bool8 sub_8093AA0() {
+bool8 sub_8093AA0()
+{
asm(".syntax unified\n\
- push {r4,lr}\n\
- adds r4, r0, 0\n\
- ldr r0, _08093AE0 @ =0x02000000\n\
- movs r1, 0\n\
- strb r1, [r0, 0x4]\n\
- bl dp12_8087EA4\n\
- movs r1, 0\n\
- ldr r0, _08093AE4 @ =gUnknown_03004DE0\n\
- ldr r2, _08093AE8 @ =0x0000fffc\n\
- movs r3, 0xF0\n\
- lsls r3, 3\n\
- adds r0, r3\n\
+ push {r4,lr}\n\
+ adds r4, r0, 0\n\
+ ldr r0, _08093AE0 @ =0x02000000\n\
+ movs r1, 0\n\
+ strb r1, [r0, 0x4]\n\
+ bl dp12_8087EA4\n\
+ movs r1, 0\n\
+ ldr r0, _08093AE4 @ =gUnknown_03004DE0\n\
+ ldr r2, _08093AE8 @ =0x0000fffc\n\
+ movs r3, 0xF0\n\
+ lsls r3, 3\n\
+ adds r0, r3\n\
_08093ABA:\n\
- strh r2, [r0]\n\
- adds r0, 0x2\n\
- adds r1, 0x1\n\
- cmp r1, 0x9F\n\
- bls _08093ABA\n\
- ldr r0, _08093AEC @ =sub_8093D7C\n\
- bl SetHBlankCallback\n\
- ldr r1, _08093AE0 @ =0x02000000\n\
- movs r0, 0x1\n\
- strb r0, [r1, 0x4]\n\
- ldrh r0, [r4, 0x8]\n\
- adds r0, 0x1\n\
- strh r0, [r4, 0x8]\n\
- movs r0, 0\n\
- pop {r4}\n\
- pop {r1}\n\
- bx r1\n\
- .align 2, 0\n\
+ strh r2, [r0]\n\
+ adds r0, 0x2\n\
+ adds r1, 0x1\n\
+ cmp r1, 0x9F\n\
+ bls _08093ABA\n\
+ ldr r0, _08093AEC @ =sub_8093D7C\n\
+ bl SetHBlankCallback\n\
+ ldr r1, _08093AE0 @ =0x02000000\n\
+ movs r0, 0x1\n\
+ strb r0, [r1, 0x4]\n\
+ ldrh r0, [r4, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x8]\n\
+ movs r0, 0\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
_08093AE0: .4byte 0x02000000\n\
_08093AE4: .4byte gUnknown_03004DE0\n\
_08093AE8: .4byte 0x0000fffc\n\
@@ -1012,149 +1089,150 @@ _08093AEC: .4byte sub_8093D7C\n\
}
__attribute__((naked))
-bool8 sub_8093AF0() {
+bool8 sub_8093AF0()
+{
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\
- mov r8, r0\n\
- ldr r1, _08093BFC @ =0x02000000\n\
- movs r0, 0\n\
- strb r0, [r1, 0x4]\n\
- mov r2, r8\n\
- ldrh r0, [r2, 0xA]\n\
- adds r0, 0x3\n\
- strh r0, [r2, 0xA]\n\
- lsls r0, 16\n\
- asrs r0, 16\n\
- cmp r0, 0x4F\n\
- ble _08093B18\n\
- movs r0, 0x4F\n\
- strh r0, [r2, 0xA]\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\
+ mov r8, r0\n\
+ ldr r1, _08093BFC @ =0x02000000\n\
+ movs r0, 0\n\
+ strb r0, [r1, 0x4]\n\
+ mov r2, r8\n\
+ ldrh r0, [r2, 0xA]\n\
+ adds r0, 0x3\n\
+ strh r0, [r2, 0xA]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x4F\n\
+ ble _08093B18\n\
+ movs r0, 0x4F\n\
+ strh r0, [r2, 0xA]\n\
_08093B18:\n\
- mov r4, r8\n\
- movs r0, 0xA\n\
- ldrsh r7, [r4, r0]\n\
- movs r0, 0xA0\n\
- subs r0, r7\n\
- mov r9, r0\n\
- subs r4, r0, r7\n\
- negs r0, r7\n\
- lsls r6, r0, 16\n\
- movs r0, 0xA0\n\
- lsls r0, 16\n\
- adds r1, r4, 0\n\
- bl __udivsi3\n\
- adds r5, r0, 0\n\
- ldr r1, _08093C00 @ =0xffff0000\n\
- adds r5, r1\n\
- adds r0, r5, 0\n\
- muls r0, r4\n\
- adds r0, r6\n\
- mov r10, r0\n\
- adds r0, r5, 0\n\
- adds r1, r4, 0\n\
- bl __udivsi3\n\
- str r0, [sp]\n\
- lsls r5, 1\n\
- movs r3, 0\n\
- cmp r3, r7\n\
- bcs _08093B74\n\
- ldr r2, _08093C04 @ =gUnknown_03004DE0\n\
- mov r12, r2\n\
- ldr r0, _08093C08 @ =0x0000fffc\n\
- adds r4, r0, 0\n\
+ mov r4, r8\n\
+ movs r0, 0xA\n\
+ ldrsh r7, [r4, r0]\n\
+ movs r0, 0xA0\n\
+ subs r0, r7\n\
+ mov r9, r0\n\
+ subs r4, r0, r7\n\
+ negs r0, r7\n\
+ lsls r6, r0, 16\n\
+ movs r0, 0xA0\n\
+ lsls r0, 16\n\
+ adds r1, r4, 0\n\
+ bl __udivsi3\n\
+ adds r5, r0, 0\n\
+ ldr r1, _08093C00 @ =0xffff0000\n\
+ adds r5, r1\n\
+ adds r0, r5, 0\n\
+ muls r0, r4\n\
+ adds r0, r6\n\
+ mov r10, r0\n\
+ adds r0, r5, 0\n\
+ adds r1, r4, 0\n\
+ bl __udivsi3\n\
+ str r0, [sp]\n\
+ lsls r5, 1\n\
+ movs r3, 0\n\
+ cmp r3, r7\n\
+ bcs _08093B74\n\
+ ldr r2, _08093C04 @ =gUnknown_03004DE0\n\
+ mov r12, r2\n\
+ ldr r0, _08093C08 @ =0x0000fffc\n\
+ adds r4, r0, 0\n\
_08093B5C:\n\
- lsls r0, r3, 16\n\
- asrs r0, 16\n\
- lsls r1, r0, 1\n\
- add r1, r12\n\
- subs r2, r4, r0\n\
- strh r2, [r1]\n\
- adds r0, 0x1\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- asrs r0, 16\n\
- cmp r0, r7\n\
- bcc _08093B5C\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 16\n\
+ lsls r1, r0, 1\n\
+ add r1, r12\n\
+ subs r2, r4, r0\n\
+ strh r2, [r1]\n\
+ adds r0, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r7\n\
+ bcc _08093B5C\n\
_08093B74:\n\
- lsls r2, r3, 16\n\
- mov r1, r9\n\
- lsls r0, r1, 16\n\
- asrs r1, r0, 16\n\
- mov r4, r10\n\
- lsrs r7, r4, 16\n\
- cmp r2, r0\n\
- bge _08093BAE\n\
- ldr r0, _08093C04 @ =gUnknown_03004DE0\n\
- mov r9, r0\n\
- ldr r4, _08093C08 @ =0x0000fffc\n\
- mov r12, r4\n\
- adds r4, r1, 0\n\
+ lsls r2, r3, 16\n\
+ mov r1, r9\n\
+ lsls r0, r1, 16\n\
+ asrs r1, r0, 16\n\
+ mov r4, r10\n\
+ lsrs r7, r4, 16\n\
+ cmp r2, r0\n\
+ bge _08093BAE\n\
+ ldr r0, _08093C04 @ =gUnknown_03004DE0\n\
+ mov r9, r0\n\
+ ldr r4, _08093C08 @ =0x0000fffc\n\
+ mov r12, r4\n\
+ adds r4, r1, 0\n\
_08093B8E:\n\
- lsrs r1, r6, 16\n\
- adds r6, r5\n\
- ldr r0, [sp]\n\
- subs r5, r0\n\
- asrs r2, 16\n\
- lsls r0, r2, 1\n\
- add r0, r9\n\
- add r1, r12\n\
- strh r1, [r0]\n\
- adds r2, 0x1\n\
- lsls r2, 16\n\
- lsrs r3, r2, 16\n\
- lsls r2, r3, 16\n\
- asrs r0, r2, 16\n\
- cmp r0, r4\n\
- blt _08093B8E\n\
+ lsrs r1, r6, 16\n\
+ adds r6, r5\n\
+ ldr r0, [sp]\n\
+ subs r5, r0\n\
+ asrs r2, 16\n\
+ lsls r0, r2, 1\n\
+ add r0, r9\n\
+ add r1, r12\n\
+ strh r1, [r0]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ lsrs r3, r2, 16\n\
+ lsls r2, r3, 16\n\
+ asrs r0, r2, 16\n\
+ cmp r0, r4\n\
+ blt _08093B8E\n\
_08093BAE:\n\
- adds r1, r7, 0\n\
- lsls r0, r3, 16\n\
- asrs r0, 16\n\
- cmp r0, 0x9F\n\
- bgt _08093BD4\n\
- ldr r4, _08093C04 @ =gUnknown_03004DE0\n\
- ldr r0, _08093C08 @ =0x0000fffc\n\
- adds r2, r1, r0\n\
+ adds r1, r7, 0\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x9F\n\
+ bgt _08093BD4\n\
+ ldr r4, _08093C04 @ =gUnknown_03004DE0\n\
+ ldr r0, _08093C08 @ =0x0000fffc\n\
+ adds r2, r1, r0\n\
_08093BBE:\n\
- lsls r1, r3, 16\n\
- asrs r1, 16\n\
- lsls r0, r1, 1\n\
- adds r0, r4\n\
- strh r2, [r0]\n\
- adds r1, 0x1\n\
- lsls r1, 16\n\
- lsrs r3, r1, 16\n\
- asrs r1, 16\n\
- cmp r1, 0x9F\n\
- ble _08093BBE\n\
+ lsls r1, r3, 16\n\
+ asrs r1, 16\n\
+ lsls r0, r1, 1\n\
+ adds r0, r4\n\
+ strh r2, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r3, r1, 16\n\
+ asrs r1, 16\n\
+ cmp r1, 0x9F\n\
+ ble _08093BBE\n\
_08093BD4:\n\
- movs r0, 0x1\n\
- ldr r1, _08093BFC @ =0x02000000\n\
- strb r0, [r1, 0x4]\n\
- mov r2, r8\n\
- movs r4, 0xA\n\
- ldrsh r0, [r2, r4]\n\
- cmp r0, 0x4A\n\
- ble _08093BEA\n\
- ldrh r0, [r2, 0x8]\n\
- adds r0, 0x1\n\
- strh r0, [r2, 0x8]\n\
+ movs r0, 0x1\n\
+ ldr r1, _08093BFC @ =0x02000000\n\
+ strb r0, [r1, 0x4]\n\
+ mov r2, r8\n\
+ movs r4, 0xA\n\
+ ldrsh r0, [r2, r4]\n\
+ cmp r0, 0x4A\n\
+ ble _08093BEA\n\
+ ldrh r0, [r2, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2, 0x8]\n\
_08093BEA:\n\
- movs r0, 0\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 {r1}\n\
- bx r1\n\
- .align 2, 0\n\
+ movs r0, 0\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 {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
_08093BFC: .4byte 0x02000000\n\
_08093C00: .4byte 0xffff0000\n\
_08093C04: .4byte gUnknown_03004DE0\n\
@@ -1162,11 +1240,13 @@ _08093C08: .4byte 0x0000fffc\n\
.syntax divided\n");
}
-bool8 sub_8093C0C(struct TrainerCard *trainerCard) {
+bool8 sub_8093C0C(struct TrainerCard *trainerCard)
+{
sub_80939C0();
sub_8093DAC();
- if (!unk_2000000.var_3) {
+ if (!unk_2000000.var_3)
+ {
sub_80939A4();
}
@@ -1176,147 +1256,148 @@ bool8 sub_8093C0C(struct TrainerCard *trainerCard) {
}
__attribute__((naked))
-bool8 sub_8093C38() {
+bool8 sub_8093C38()
+{
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\
- mov r8, r0\n\
- ldr r1, _08093D40 @ =0x02000000\n\
- movs r2, 0\n\
- strb r2, [r1, 0x4]\n\
- ldrh r0, [r0, 0xA]\n\
- subs r0, 0x3\n\
- mov r3, r8\n\
- strh r0, [r3, 0xA]\n\
- lsls r0, 16\n\
- cmp r0, 0\n\
- bgt _08093C5C\n\
- strh r2, [r3, 0xA]\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\
+ mov r8, r0\n\
+ ldr r1, _08093D40 @ =0x02000000\n\
+ movs r2, 0\n\
+ strb r2, [r1, 0x4]\n\
+ ldrh r0, [r0, 0xA]\n\
+ subs r0, 0x3\n\
+ mov r3, r8\n\
+ strh r0, [r3, 0xA]\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ bgt _08093C5C\n\
+ strh r2, [r3, 0xA]\n\
_08093C5C:\n\
- mov r4, r8\n\
- movs r0, 0xA\n\
- ldrsh r7, [r4, r0]\n\
- movs r0, 0xA0\n\
- subs r0, r7\n\
- mov r9, r0\n\
- subs r4, r0, r7\n\
- negs r0, r7\n\
- lsls r6, r0, 16\n\
- movs r0, 0xA0\n\
- lsls r0, 16\n\
- adds r1, r4, 0\n\
- bl __udivsi3\n\
- adds r5, r0, 0\n\
- ldr r1, _08093D44 @ =0xffff0000\n\
- adds r5, r1\n\
- adds r0, r5, 0\n\
- muls r0, r4\n\
- adds r0, r6\n\
- mov r10, r0\n\
- adds r0, r5, 0\n\
- adds r1, r4, 0\n\
- bl __udivsi3\n\
- str r0, [sp]\n\
- lsrs r5, 1\n\
- movs r3, 0\n\
- cmp r3, r7\n\
- bcs _08093CB8\n\
- ldr r2, _08093D48 @ =gUnknown_03004DE0\n\
- mov r12, r2\n\
- ldr r0, _08093D4C @ =0x0000fffc\n\
- adds r4, r0, 0\n\
+ mov r4, r8\n\
+ movs r0, 0xA\n\
+ ldrsh r7, [r4, r0]\n\
+ movs r0, 0xA0\n\
+ subs r0, r7\n\
+ mov r9, r0\n\
+ subs r4, r0, r7\n\
+ negs r0, r7\n\
+ lsls r6, r0, 16\n\
+ movs r0, 0xA0\n\
+ lsls r0, 16\n\
+ adds r1, r4, 0\n\
+ bl __udivsi3\n\
+ adds r5, r0, 0\n\
+ ldr r1, _08093D44 @ =0xffff0000\n\
+ adds r5, r1\n\
+ adds r0, r5, 0\n\
+ muls r0, r4\n\
+ adds r0, r6\n\
+ mov r10, r0\n\
+ adds r0, r5, 0\n\
+ adds r1, r4, 0\n\
+ bl __udivsi3\n\
+ str r0, [sp]\n\
+ lsrs r5, 1\n\
+ movs r3, 0\n\
+ cmp r3, r7\n\
+ bcs _08093CB8\n\
+ ldr r2, _08093D48 @ =gUnknown_03004DE0\n\
+ mov r12, r2\n\
+ ldr r0, _08093D4C @ =0x0000fffc\n\
+ adds r4, r0, 0\n\
_08093CA0:\n\
- lsls r0, r3, 16\n\
- asrs r0, 16\n\
- lsls r1, r0, 1\n\
- add r1, r12\n\
- subs r2, r4, r0\n\
- strh r2, [r1]\n\
- adds r0, 0x1\n\
- lsls r0, 16\n\
- lsrs r3, r0, 16\n\
- asrs r0, 16\n\
- cmp r0, r7\n\
- bcc _08093CA0\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 16\n\
+ lsls r1, r0, 1\n\
+ add r1, r12\n\
+ subs r2, r4, r0\n\
+ strh r2, [r1]\n\
+ adds r0, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r7\n\
+ bcc _08093CA0\n\
_08093CB8:\n\
- lsls r2, r3, 16\n\
- mov r1, r9\n\
- lsls r0, r1, 16\n\
- asrs r1, r0, 16\n\
- mov r4, r10\n\
- lsrs r7, r4, 16\n\
- cmp r2, r0\n\
- bge _08093CF2\n\
- ldr r0, _08093D48 @ =gUnknown_03004DE0\n\
- mov r9, r0\n\
- ldr r3, _08093D4C @ =0x0000fffc\n\
- mov r12, r3\n\
- adds r4, r1, 0\n\
+ lsls r2, r3, 16\n\
+ mov r1, r9\n\
+ lsls r0, r1, 16\n\
+ asrs r1, r0, 16\n\
+ mov r4, r10\n\
+ lsrs r7, r4, 16\n\
+ cmp r2, r0\n\
+ bge _08093CF2\n\
+ ldr r0, _08093D48 @ =gUnknown_03004DE0\n\
+ mov r9, r0\n\
+ ldr r3, _08093D4C @ =0x0000fffc\n\
+ mov r12, r3\n\
+ adds r4, r1, 0\n\
_08093CD2:\n\
- lsrs r1, r6, 16\n\
- adds r6, r5\n\
- ldr r0, [sp]\n\
- adds r5, r0\n\
- asrs r2, 16\n\
- lsls r0, r2, 1\n\
- add r0, r9\n\
- add r1, r12\n\
- strh r1, [r0]\n\
- adds r2, 0x1\n\
- lsls r2, 16\n\
- lsrs r3, r2, 16\n\
- lsls r2, r3, 16\n\
- asrs r0, r2, 16\n\
- cmp r0, r4\n\
- blt _08093CD2\n\
+ lsrs r1, r6, 16\n\
+ adds r6, r5\n\
+ ldr r0, [sp]\n\
+ adds r5, r0\n\
+ asrs r2, 16\n\
+ lsls r0, r2, 1\n\
+ add r0, r9\n\
+ add r1, r12\n\
+ strh r1, [r0]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ lsrs r3, r2, 16\n\
+ lsls r2, r3, 16\n\
+ asrs r0, r2, 16\n\
+ cmp r0, r4\n\
+ blt _08093CD2\n\
_08093CF2:\n\
- adds r1, r7, 0\n\
- lsls r0, r3, 16\n\
- asrs r0, 16\n\
- cmp r0, 0x9F\n\
- bgt _08093D18\n\
- ldr r4, _08093D48 @ =gUnknown_03004DE0\n\
- ldr r0, _08093D4C @ =0x0000fffc\n\
- adds r2, r1, r0\n\
+ adds r1, r7, 0\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x9F\n\
+ bgt _08093D18\n\
+ ldr r4, _08093D48 @ =gUnknown_03004DE0\n\
+ ldr r0, _08093D4C @ =0x0000fffc\n\
+ adds r2, r1, r0\n\
_08093D02:\n\
- lsls r1, r3, 16\n\
- asrs r1, 16\n\
- lsls r0, r1, 1\n\
- adds r0, r4\n\
- strh r2, [r0]\n\
- adds r1, 0x1\n\
- lsls r1, 16\n\
- lsrs r3, r1, 16\n\
- asrs r1, 16\n\
- cmp r1, 0x9F\n\
- ble _08093D02\n\
+ lsls r1, r3, 16\n\
+ asrs r1, 16\n\
+ lsls r0, r1, 1\n\
+ adds r0, r4\n\
+ strh r2, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r3, r1, 16\n\
+ asrs r1, 16\n\
+ cmp r1, 0x9F\n\
+ ble _08093D02\n\
_08093D18:\n\
- movs r0, 0x1\n\
- ldr r1, _08093D40 @ =0x02000000\n\
- strb r0, [r1, 0x4]\n\
- mov r2, r8\n\
- movs r3, 0xA\n\
- ldrsh r0, [r2, r3]\n\
- cmp r0, 0\n\
- bgt _08093D2E\n\
- ldrh r0, [r2, 0x8]\n\
- adds r0, 0x1\n\
- strh r0, [r2, 0x8]\n\
+ movs r0, 0x1\n\
+ ldr r1, _08093D40 @ =0x02000000\n\
+ strb r0, [r1, 0x4]\n\
+ mov r2, r8\n\
+ movs r3, 0xA\n\
+ ldrsh r0, [r2, r3]\n\
+ cmp r0, 0\n\
+ bgt _08093D2E\n\
+ ldrh r0, [r2, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r2, 0x8]\n\
_08093D2E:\n\
- movs r0, 0\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 {r1}\n\
- bx r1\n\
- .align 2, 0\n\
+ movs r0, 0\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 {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
_08093D40: .4byte 0x02000000\n\
_08093D44: .4byte 0xffff0000\n\
_08093D48: .4byte gUnknown_03004DE0\n\
@@ -1324,7 +1405,8 @@ _08093D4C: .4byte 0x0000fffc\n\
.syntax divided\n");
}
-bool8 sub_8093D50(void) {
+bool8 sub_8093D50(void)
+{
u8 taskId;
unk_2000000.var_4 = FALSE;
@@ -1338,42 +1420,48 @@ bool8 sub_8093D50(void) {
}
__attribute__((naked))
-void sub_8093D7C(void) {
+void sub_8093D7C(void)
+{
asm(".syntax unified\n\
- ldr r1, _08093DA0 @ =gUnknown_03004DE0\n\
- ldr r0, _08093DA4 @ =REG_VCOUNT\n\
- ldrh r2, [r0]\n\
- movs r0, 0xFF\n\
- ands r0, r2\n\
- lsls r0, 1\n\
- movs r2, 0xF0\n\
- lsls r2, 3\n\
- adds r1, r2\n\
- adds r0, r1\n\
- ldrh r1, [r0]\n\
- ldr r0, _08093DA8 @ =REG_BG0VOFS\n\
- strh r1, [r0]\n\
- adds r0, 0x4\n\
- strh r1, [r0]\n\
- adds r0, 0x4\n\
- strh r1, [r0]\n\
- bx lr\n\
- .align 2, 0\n\
+ ldr r1, _08093DA0 @ =gUnknown_03004DE0\n\
+ ldr r0, _08093DA4 @ =REG_VCOUNT\n\
+ ldrh r2, [r0]\n\
+ movs r0, 0xFF\n\
+ ands r0, r2\n\
+ lsls r0, 1\n\
+ movs r2, 0xF0\n\
+ lsls r2, 3\n\
+ adds r1, r2\n\
+ adds r0, r1\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _08093DA8 @ =REG_BG0VOFS\n\
+ strh r1, [r0]\n\
+ adds r0, 0x4\n\
+ strh r1, [r0]\n\
+ adds r0, 0x4\n\
+ strh r1, [r0]\n\
+ bx lr\n\
+ .align 2, 0\n\
_08093DA0: .4byte gUnknown_03004DE0\n\
_08093DA4: .4byte 0x4000006 @ REG_VCOUNT\n\
_08093DA8: .4byte 0x4000012 @ REG_BG0VOFS\n\
.syntax divided\n");
}
-static void sub_8093DAC(void) {
- if (unk_2000000.var_3) {
+static void sub_8093DAC(void)
+{
+ if (unk_2000000.var_3)
+ {
sub_8093DEC();
- } else {
+ }
+ else
+ {
sub_8093DC8();
}
}
-static void sub_8093DC8(void) {
+static void sub_8093DC8(void)
+{
MenuZeroFillScreen();
sub_80940E4();
sub_8093F14();
@@ -1383,7 +1471,8 @@ static void sub_8093DC8(void) {
sub_8094140();
}
-static void sub_8093DEC(void) {
+static void sub_8093DEC(void)
+{
MenuZeroFillScreen();
sub_80940E4();
sub_8093F48();
@@ -1391,76 +1480,78 @@ static void sub_8093DEC(void) {
}
__attribute__((naked))
-static void sub_8093E04() {
+static void sub_8093E04()
+{
asm(".syntax unified\n\
- ldr r0, _08093E20 @ =REG_BG0VOFS\n\
- ldr r2, _08093E24 @ =0x0000fffc\n\
- adds r1, r2, 0\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- movs r2, 0\n\
- strh r2, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- adds r0, 0x2\n\
- strh r2, [r0]\n\
- adds r0, 0x2\n\
- strh r1, [r0]\n\
- bx lr\n\
- .align 2, 0\n\
+ ldr r0, _08093E20 @ =REG_BG0VOFS\n\
+ ldr r2, _08093E24 @ =0x0000fffc\n\
+ adds r1, r2, 0\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ movs r2, 0\n\
+ strh r2, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ adds r0, 0x2\n\
+ strh r2, [r0]\n\
+ adds r0, 0x2\n\
+ strh r1, [r0]\n\
+ bx lr\n\
+ .align 2, 0\n\
_08093E20: .4byte 0x4000012 @ REG_BG0VOFS\n\
_08093E24: .4byte 0x0000fffc\n\
.syntax divided\n");
}
__attribute__((naked))
-static void sub_8093E28(void) {
+static void sub_8093E28(void)
+{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- bl sub_8093EA0\n\
- ldr r0, _08093E84 @ =gUnknown_083B5F6C\n\
- movs r1, 0xE0\n\
- movs r2, 0x20\n\
- bl LoadPalette\n\
- ldr r3, _08093E88 @ =gMenuTrainerCard_Gfx\n\
- movs r4, 0xC0\n\
- lsls r4, 19\n\
- movs r5, 0xA4\n\
- lsls r5, 5\n\
- ldr r1, _08093E8C @ =0x040000d4\n\
- ldr r6, _08093E90 @ =0x80000800\n\
- movs r2, 0x80\n\
- lsls r2, 5\n\
- movs r7, 0x80\n\
- lsls r7, 24\n\
+ push {r4-r7,lr}\n\
+ bl sub_8093EA0\n\
+ ldr r0, _08093E84 @ =gUnknown_083B5F6C\n\
+ movs r1, 0xE0\n\
+ movs r2, 0x20\n\
+ bl LoadPalette\n\
+ ldr r3, _08093E88 @ =gMenuTrainerCard_Gfx\n\
+ movs r4, 0xC0\n\
+ lsls r4, 19\n\
+ movs r5, 0xA4\n\
+ lsls r5, 5\n\
+ ldr r1, _08093E8C @ =0x040000d4\n\
+ ldr r6, _08093E90 @ =0x80000800\n\
+ movs r2, 0x80\n\
+ lsls r2, 5\n\
+ movs r7, 0x80\n\
+ lsls r7, 24\n\
_08093E4E:\n\
- str r3, [r1]\n\
- str r4, [r1, 0x4]\n\
- str r6, [r1, 0x8]\n\
- ldr r0, [r1, 0x8]\n\
- adds r3, r2\n\
- adds r4, r2\n\
- subs r5, r2\n\
- cmp r5, r2\n\
- bhi _08093E4E\n\
- str r3, [r1]\n\
- str r4, [r1, 0x4]\n\
- lsrs r0, r5, 1\n\
- orrs r0, r7\n\
- str r0, [r1, 0x8]\n\
- ldr r0, [r1, 0x8]\n\
- ldr r1, _08093E94 @ =gBadgesTiles\n\
- ldr r2, _08093E98 @ =0x06001480\n\
- ldr r0, _08093E8C @ =0x040000d4\n\
- str r1, [r0]\n\
- str r2, [r0, 0x4]\n\
- ldr r1, _08093E9C @ =0x80000200\n\
- str r1, [r0, 0x8]\n\
- ldr r0, [r0, 0x8]\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ str r3, [r1]\n\
+ str r4, [r1, 0x4]\n\
+ str r6, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ adds r3, r2\n\
+ adds r4, r2\n\
+ subs r5, r2\n\
+ cmp r5, r2\n\
+ bhi _08093E4E\n\
+ str r3, [r1]\n\
+ str r4, [r1, 0x4]\n\
+ lsrs r0, r5, 1\n\
+ orrs r0, r7\n\
+ str r0, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ ldr r1, _08093E94 @ =gBadgesTiles\n\
+ ldr r2, _08093E98 @ =0x06001480\n\
+ ldr r0, _08093E8C @ =0x040000d4\n\
+ str r1, [r0]\n\
+ str r2, [r0, 0x4]\n\
+ ldr r1, _08093E9C @ =0x80000200\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_08093E84: .4byte gUnknown_083B5F6C\n\
_08093E88: .4byte gMenuTrainerCard_Gfx\n\
_08093E8C: .4byte 0x040000d4\n\
@@ -1471,157 +1562,165 @@ _08093E9C: .4byte 0x80000200\n\
.syntax divided\n");
}
-void sub_8093EA0(void) {
+void sub_8093EA0(void)
+{
LoadPalette(gUnknown_083B5EF8[unk_2000000.var_2], 0, 48 * 2);
LoadPalette(gBadgesPalette, 48, 16 * 2);
LoadPalette(gUnknown_083B5F4C, 64, 16 * 2);
- if (unk_2000000.var_64.gender != MALE) {
+ if (unk_2000000.var_64.gender != MALE)
+ {
LoadPalette(gUnknown_083B5F0C, 16, 16 * 2);
}
}
-static void sub_8093EF8(void) {
- LoadTrainerGfx_TrainerCard(unk_2000000.var_64.gender, 80, (void *) (VRAM + 0x1880));
+static void sub_8093EF8(void)
+{
+ LoadTrainerGfx_TrainerCard(unk_2000000.var_64.gender, 80, (void *)(VRAM + 0x1880));
}
__attribute__((naked))
-static void sub_8093F14(void) {
+static void sub_8093F14(void)
+{
asm(".syntax unified\n\
- push {lr}\n\
- sub sp, 0x8\n\
- ldr r0, _08093F3C @ =gUnknown_083B5EEC\n\
- ldr r1, [r0, 0x4]\n\
- ldr r0, [r0]\n\
- str r0, [sp]\n\
- str r1, [sp, 0x4]\n\
- ldr r0, _08093F40 @ =0x02000000\n\
- ldrb r0, [r0, 0x1]\n\
- lsls r0, 2\n\
- add r0, sp\n\
- ldr r0, [r0]\n\
- ldr r1, _08093F44 @ =0x06004800\n\
- movs r2, 0xA0\n\
- lsls r2, 1\n\
- bl CpuFastSet\n\
- add sp, 0x8\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ push {lr}\n\
+ sub sp, 0x8\n\
+ ldr r0, _08093F3C @ =gUnknown_083B5EEC\n\
+ ldr r1, [r0, 0x4]\n\
+ ldr r0, [r0]\n\
+ str r0, [sp]\n\
+ str r1, [sp, 0x4]\n\
+ ldr r0, _08093F40 @ =0x02000000\n\
+ ldrb r0, [r0, 0x1]\n\
+ lsls r0, 2\n\
+ add r0, sp\n\
+ ldr r0, [r0]\n\
+ ldr r1, _08093F44 @ =0x06004800\n\
+ movs r2, 0xA0\n\
+ lsls r2, 1\n\
+ bl CpuFastSet\n\
+ add sp, 0x8\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_08093F3C: .4byte gUnknown_083B5EEC\n\
_08093F40: .4byte 0x02000000\n\
_08093F44: .4byte 0x06004800\n\
.syntax divided\n");
}
-static void sub_8093F48(void) {
- CpuFastSet(gUnknown_08E8CFC0, (void *) (VRAM + 0x4800), 320);
+static void sub_8093F48(void)
+{
+ CpuFastSet(gUnknown_08E8CFC0, (void *)(VRAM + 0x4800), 320);
}
-static void sub_8093F64(void) {
- CpuFastSet(gUnknown_08E8D9C0, (void *) (VRAM + 0x5000), 320);
+static void sub_8093F64(void)
+{
+ CpuFastSet(gUnknown_08E8D9C0, (void *)(VRAM + 0x5000), 320);
}
__attribute__((naked))
-static void sub_8093F80(void) {
+static void sub_8093F80(void)
+{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- movs r5, 0xC4\n\
- ldr r7, _08093FCC @ =0x06004000\n\
- movs r1, 0x5\n\
- movs r0, 0xA0\n\
- lsls r0, 7\n\
- adds r6, r0, 0\n\
+ push {r4-r7,lr}\n\
+ movs r5, 0xC4\n\
+ ldr r7, _08093FCC @ =0x06004000\n\
+ movs r1, 0x5\n\
+ movs r0, 0xA0\n\
+ lsls r0, 7\n\
+ adds r6, r0, 0\n\
_08093F8E:\n\
- movs r0, 0x13\n\
- lsls r3, r1, 16\n\
- asrs r4, r3, 11\n\
+ movs r0, 0x13\n\
+ lsls r3, r1, 16\n\
+ asrs r4, r3, 11\n\
_08093F94:\n\
- lsls r2, r0, 16\n\
- asrs r2, 16\n\
- adds r1, r4, r2\n\
- lsls r1, 1\n\
- adds r1, r7\n\
- adds r0, r5, 0\n\
- orrs r0, r6\n\
- strh r0, [r1]\n\
- adds r2, 0x1\n\
- lsls r2, 16\n\
- adds r0, r5, 0x1\n\
- lsls r0, 16\n\
- lsrs r5, r0, 16\n\
- lsrs r0, r2, 16\n\
- asrs r2, 16\n\
- cmp r2, 0x1A\n\
- ble _08093F94\n\
- movs r1, 0x80\n\
- lsls r1, 9\n\
- adds r0, r3, r1\n\
- lsrs r1, r0, 16\n\
- asrs r0, 16\n\
- cmp r0, 0xC\n\
- ble _08093F8E\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ lsls r2, r0, 16\n\
+ asrs r2, 16\n\
+ adds r1, r4, r2\n\
+ lsls r1, 1\n\
+ adds r1, r7\n\
+ adds r0, r5, 0\n\
+ orrs r0, r6\n\
+ strh r0, [r1]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ adds r0, r5, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r5, r0, 16\n\
+ lsrs r0, r2, 16\n\
+ asrs r2, 16\n\
+ cmp r2, 0x1A\n\
+ ble _08093F94\n\
+ movs r1, 0x80\n\
+ lsls r1, 9\n\
+ adds r0, r3, r1\n\
+ lsrs r1, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0xC\n\
+ ble _08093F8E\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_08093FCC: .4byte 0x06004000\n\
.syntax divided\n");
}
__attribute__((naked))
-static void sub_8093FD0(void) {
+static void sub_8093FD0(void)
+{
asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- ldr r4, _0809402C @ =0x06004000\n\
- movs r2, 0xF\n\
- ldr r0, _08094030 @ =0x02000000\n\
- ldrb r0, [r0, 0x2]\n\
- adds r0, 0xF\n\
- cmp r2, r0\n\
- bge _08094002\n\
- movs r6, 0xC0\n\
- lsls r6, 1\n\
- ldr r1, _08094034 @ =0x0000408f\n\
- adds r5, r1, 0\n\
- adds r3, r0, 0\n\
+ push {r4-r6,lr}\n\
+ ldr r4, _0809402C @ =0x06004000\n\
+ movs r2, 0xF\n\
+ ldr r0, _08094030 @ =0x02000000\n\
+ ldrb r0, [r0, 0x2]\n\
+ adds r0, 0xF\n\
+ cmp r2, r0\n\
+ bge _08094002\n\
+ movs r6, 0xC0\n\
+ lsls r6, 1\n\
+ ldr r1, _08094034 @ =0x0000408f\n\
+ adds r5, r1, 0\n\
+ adds r3, r0, 0\n\
_08093FEA:\n\
- lsls r1, r2, 16\n\
- asrs r1, 16\n\
- lsls r0, r1, 1\n\
- adds r0, r4\n\
- adds r0, r6\n\
- strh r5, [r0]\n\
- adds r1, 0x1\n\
- lsls r1, 16\n\
- lsrs r2, r1, 16\n\
- asrs r1, 16\n\
- cmp r1, r3\n\
- blt _08093FEA\n\
+ lsls r1, r2, 16\n\
+ asrs r1, 16\n\
+ lsls r0, r1, 1\n\
+ adds r0, r4\n\
+ adds r0, r6\n\
+ strh r5, [r0]\n\
+ adds r1, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r2, r1, 16\n\
+ asrs r1, 16\n\
+ cmp r1, r3\n\
+ blt _08093FEA\n\
_08094002:\n\
- lsls r1, r2, 16\n\
- asrs r0, r1, 16\n\
- cmp r0, 0x12\n\
- bgt _08094024\n\
- movs r3, 0xC0\n\
- lsls r3, 1\n\
- movs r2, 0\n\
+ lsls r1, r2, 16\n\
+ asrs r0, r1, 16\n\
+ cmp r0, 0x12\n\
+ bgt _08094024\n\
+ movs r3, 0xC0\n\
+ lsls r3, 1\n\
+ movs r2, 0\n\
_08094010:\n\
- asrs r0, r1, 16\n\
- lsls r1, r0, 1\n\
- adds r1, r4\n\
- adds r1, r3\n\
- strh r2, [r1]\n\
- adds r0, 0x1\n\
- lsls r1, r0, 16\n\
- asrs r0, r1, 16\n\
- cmp r0, 0x12\n\
- ble _08094010\n\
+ asrs r0, r1, 16\n\
+ lsls r1, r0, 1\n\
+ adds r1, r4\n\
+ adds r1, r3\n\
+ strh r2, [r1]\n\
+ adds r0, 0x1\n\
+ lsls r1, r0, 16\n\
+ asrs r0, r1, 16\n\
+ cmp r0, 0x12\n\
+ ble _08094010\n\
_08094024:\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_0809402C: .4byte 0x06004000\n\
_08094030: .4byte 0x02000000\n\
_08094034: .4byte 0x0000408f\n\
@@ -1629,87 +1728,88 @@ _08094034: .4byte 0x0000408f\n\
}
__attribute__((naked))
-static void sub_8094038(void) {
+static void sub_8094038(void)
+{
asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- ldr r1, _080940D0 @ =0x02000000\n\
- ldrb r0, [r1, 0x1]\n\
- cmp r0, 0\n\
- bne _080940C2\n\
- ldr r0, _080940D4 @ =0x06004000\n\
- mov r9, r0\n\
- movs r0, 0\n\
- movs r2, 0x4\n\
- adds r1, 0xE\n\
- mov r8, r1\n\
- ldr r7, _080940D8 @ =gUnknown_083B5F8C\n\
- movs r1, 0xC0\n\
- lsls r1, 6\n\
- adds r6, r1, 0\n\
- adds r1, r7, 0x6\n\
- mov r12, r1\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ ldr r1, _080940D0 @ =0x02000000\n\
+ ldrb r0, [r1, 0x1]\n\
+ cmp r0, 0\n\
+ bne _080940C2\n\
+ ldr r0, _080940D4 @ =0x06004000\n\
+ mov r9, r0\n\
+ movs r0, 0\n\
+ movs r2, 0x4\n\
+ adds r1, 0xE\n\
+ mov r8, r1\n\
+ ldr r7, _080940D8 @ =gUnknown_083B5F8C\n\
+ movs r1, 0xC0\n\
+ lsls r1, 6\n\
+ adds r6, r1, 0\n\
+ adds r1, r7, 0x6\n\
+ mov r12, r1\n\
_08094060:\n\
- lsls r0, 16\n\
- asrs r4, r0, 16\n\
- mov r1, r8\n\
- adds r0, r4, r1\n\
- ldrb r0, [r0]\n\
- lsls r5, r2, 16\n\
- cmp r0, 0\n\
- beq _080940AE\n\
- asrs r1, r5, 15\n\
- add r1, r9\n\
- movs r2, 0xF0\n\
- lsls r2, 2\n\
- adds r3, r1, r2\n\
- lsls r2, r4, 3\n\
- adds r0, r2, r7\n\
- ldrh r0, [r0]\n\
- orrs r0, r6\n\
- strh r0, [r3]\n\
- ldr r0, _080940DC @ =0x000003c2\n\
- adds r3, r1, r0\n\
- adds r0, r7, 0x2\n\
- adds r0, r2, r0\n\
- ldrh r0, [r0]\n\
- orrs r0, r6\n\
- strh r0, [r3]\n\
- movs r0, 0x80\n\
- lsls r0, 3\n\
- adds r3, r1, r0\n\
- adds r0, r7, 0x4\n\
- adds r0, r2, r0\n\
- ldrh r0, [r0]\n\
- orrs r0, r6\n\
- strh r0, [r3]\n\
- ldr r0, _080940E0 @ =0x00000402\n\
- adds r1, r0\n\
- add r2, r12\n\
- ldrh r0, [r2]\n\
- orrs r0, r6\n\
- strh r0, [r1]\n\
+ lsls r0, 16\n\
+ asrs r4, r0, 16\n\
+ mov r1, r8\n\
+ adds r0, r4, r1\n\
+ ldrb r0, [r0]\n\
+ lsls r5, r2, 16\n\
+ cmp r0, 0\n\
+ beq _080940AE\n\
+ asrs r1, r5, 15\n\
+ add r1, r9\n\
+ movs r2, 0xF0\n\
+ lsls r2, 2\n\
+ adds r3, r1, r2\n\
+ lsls r2, r4, 3\n\
+ adds r0, r2, r7\n\
+ ldrh r0, [r0]\n\
+ orrs r0, r6\n\
+ strh r0, [r3]\n\
+ ldr r0, _080940DC @ =0x000003c2\n\
+ adds r3, r1, r0\n\
+ adds r0, r7, 0x2\n\
+ adds r0, r2, r0\n\
+ ldrh r0, [r0]\n\
+ orrs r0, r6\n\
+ strh r0, [r3]\n\
+ movs r0, 0x80\n\
+ lsls r0, 3\n\
+ adds r3, r1, r0\n\
+ adds r0, r7, 0x4\n\
+ adds r0, r2, r0\n\
+ ldrh r0, [r0]\n\
+ orrs r0, r6\n\
+ strh r0, [r3]\n\
+ ldr r0, _080940E0 @ =0x00000402\n\
+ adds r1, r0\n\
+ add r2, r12\n\
+ ldrh r0, [r2]\n\
+ orrs r0, r6\n\
+ strh r0, [r1]\n\
_080940AE:\n\
- adds r1, r4, 0x1\n\
- lsls r1, 16\n\
- movs r2, 0xC0\n\
- lsls r2, 10\n\
- adds r0, r5, r2\n\
- lsrs r2, r0, 16\n\
- lsrs r0, r1, 16\n\
- asrs r1, 16\n\
- cmp r1, 0x7\n\
- ble _08094060\n\
+ adds r1, r4, 0x1\n\
+ lsls r1, 16\n\
+ movs r2, 0xC0\n\
+ lsls r2, 10\n\
+ adds r0, r5, r2\n\
+ lsrs r2, r0, 16\n\
+ lsrs r0, r1, 16\n\
+ asrs r1, 16\n\
+ cmp r1, 0x7\n\
+ ble _08094060\n\
_080940C2:\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\
+ 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\
_080940D0: .4byte 0x02000000\n\
_080940D4: .4byte 0x06004000\n\
_080940D8: .4byte gUnknown_083B5F8C\n\
@@ -1719,66 +1819,69 @@ _080940E0: .4byte 0x00000402\n\
}
__attribute__((naked))
-static void sub_80940E4() {
+static void sub_80940E4()
+{
asm(".syntax unified\n\
- push {r4,lr}\n\
- movs r2, 0\n\
- ldr r1, _08094108 @ =0x06004000\n\
- movs r4, 0\n\
- ldr r3, _0809410C @ =0x000003ff\n\
+ push {r4,lr}\n\
+ movs r2, 0\n\
+ ldr r1, _08094108 @ =0x06004000\n\
+ movs r4, 0\n\
+ ldr r3, _0809410C @ =0x000003ff\n\
_080940EE:\n\
- strh r4, [r1]\n\
- lsls r0, r2, 16\n\
- movs r2, 0x80\n\
- lsls r2, 9\n\
- adds r0, r2\n\
- adds r1, 0x2\n\
- lsrs r2, r0, 16\n\
- asrs r0, 16\n\
- cmp r0, r3\n\
- ble _080940EE\n\
- pop {r4}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ strh r4, [r1]\n\
+ lsls r0, r2, 16\n\
+ movs r2, 0x80\n\
+ lsls r2, 9\n\
+ adds r0, r2\n\
+ adds r1, 0x2\n\
+ lsrs r2, r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, r3\n\
+ ble _080940EE\n\
+ pop {r4}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_08094108: .4byte 0x06004000\n\
_0809410C: .4byte 0x000003ff\n\
.syntax divided\n");
}
__attribute__((naked))
-static void sub_8094110() {
+static void sub_8094110()
+{
asm(".syntax unified\n\
- push {r4-r6,lr}\n\
- ldr r6, _0809413C @ =0x06004800\n\
- movs r2, 0x3\n\
- movs r5, 0xA0\n\
- lsls r5, 2\n\
- movs r3, 0x1\n\
- movs r4, 0xB0\n\
- lsls r4, 2\n\
+ push {r4-r6,lr}\n\
+ ldr r6, _0809413C @ =0x06004800\n\
+ movs r2, 0x3\n\
+ movs r5, 0xA0\n\
+ lsls r5, 2\n\
+ movs r3, 0x1\n\
+ movs r4, 0xB0\n\
+ lsls r4, 2\n\
_08094120:\n\
- lsls r0, r2, 1\n\
- adds r0, r6\n\
- adds r1, r0, r5\n\
- strh r3, [r1]\n\
- adds r0, r4\n\
- strh r3, [r0]\n\
- adds r0, r2, 0x1\n\
- lsls r0, 16\n\
- lsrs r2, r0, 16\n\
- cmp r2, 0x10\n\
- bls _08094120\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n\
- .align 2, 0\n\
+ lsls r0, r2, 1\n\
+ adds r0, r6\n\
+ adds r1, r0, r5\n\
+ strh r3, [r1]\n\
+ adds r0, r4\n\
+ strh r3, [r0]\n\
+ adds r0, r2, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r2, r0, 16\n\
+ cmp r2, 0x10\n\
+ bls _08094120\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
_0809413C: .4byte 0x06004800\n\
.syntax divided\n");
}
-static void sub_8094140(void) {
+static void sub_8094140(void)
+{
u8 *buffer;
BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values);
@@ -1794,7 +1897,8 @@ static void sub_8094140(void) {
sub_809429C();
}
-static void sub_8094188(void) {
+static void sub_8094188(void)
+{
BasicInitMenuWindow(&WindowConfig_TrainerCard_Back_Values);
TrainerCard_Back_PrintName();
TrainerCard_Back_PrintHallOfFameTime_Label();
@@ -1813,21 +1917,25 @@ static void sub_8094188(void) {
TrainerCard_Back_PrintPokemonTrades();
}
-static void TrainerCard_Front_PrintTrainerID(void) {
+static void TrainerCard_Front_PrintTrainerID(void)
+{
u8 buffer[8];
ConvertIntToDecimalStringN(buffer, unk_2000000.var_64.trainerId, STR_CONV_MODE_LEADING_ZEROS, 5);
MenuPrint(buffer, 20, 2);
}
-static void TrainerCard_Front_PrintMoney(void) {
+static void TrainerCard_Front_PrintMoney(void)
+{
sub_80B7AEC(unk_2000000.var_64.money, 16, 8);
}
-static void TrainerCard_Front_PrintPokedexCount(void) {
+static void TrainerCard_Front_PrintPokedexCount(void)
+{
u8 buffer[16];
- if (unk_2000000.var_7 == FALSE) {
+ if (unk_2000000.var_7 == FALSE)
+ {
sub_8094110();
return;
}
@@ -1836,7 +1944,8 @@ static void TrainerCard_Front_PrintPokedexCount(void) {
MenuPrint_RightAligned(buffer, 16, 10);
}
-static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon) {
+static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon)
+{
u8 buffer[16];
u16 playTimeHours;
u16 playTimeMinutes;
@@ -1844,7 +1953,8 @@ static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon) {
playTimeHours = gSaveBlock2.playTimeHours;
playTimeMinutes = gSaveBlock2.playTimeMinutes;
- if (unk_2000000.var_1 != 0) {
+ if (unk_2000000.var_1 != 0)
+ {
playTimeHours = unk_2000000.var_64.playTimeHours;
playTimeMinutes = unk_2000000.var_64.playTimeMinutes;
}
@@ -1853,80 +1963,88 @@ static void TrainerCard_Front_PrintPlayTime(u8 *arg1, s16 colon) {
sub_8072C74(arg1, buffer, 48, 1);
}
-static void sub_809429C(void) {
- u8 *bufferPtr;
+static void sub_809429C(void)
+{
+ u8 *str;
- if (unk_2000000.var_1 == FALSE) {
+ if (unk_2000000.var_1 == FALSE)
+ {
return;
}
- bufferPtr = gStringVar1;
- bufferPtr = StringCopy(bufferPtr, unk_2000000.var_20[0]);
- bufferPtr[0] = 00;
- bufferPtr++;
- bufferPtr = StringCopy(bufferPtr, unk_2000000.var_20[1]);
+ str = gStringVar1;
+ str = StringCopy(str, unk_2000000.var_20[0]);
+ str[0] = 00;
+ str++;
+ str = StringCopy(str, unk_2000000.var_20[1]);
MenuPrint(gStringVar1, 2, 14);
- bufferPtr = gStringVar1;
- bufferPtr = StringCopy(bufferPtr, unk_2000000.var_20[2]);
- bufferPtr[0] = 00;
- bufferPtr++;
- bufferPtr = StringCopy(bufferPtr, unk_2000000.var_20[3]);
+ str = gStringVar1;
+ str = StringCopy(str, unk_2000000.var_20[2]);
+ str[0] = 00;
+ str++;
+ str = StringCopy(str, unk_2000000.var_20[3]);
MenuPrint(gStringVar1, 2, 16);
}
-static void TrainerCard_Back_PrintName(void) {
- u8 *bufferPtr;
+static void TrainerCard_Back_PrintName(void)
+{
+ u8 *str;
- bufferPtr = gStringVar1;
- StringCopy(bufferPtr, unk_2000000.var_64.playerName);
- ConvertInternationalString(bufferPtr, unk_2000000.language);
+ str = gStringVar1;
+ StringCopy(str, unk_2000000.var_64.playerName);
+ ConvertInternationalString(str, unk_2000000.language);
- StringAppend(bufferPtr, gOtherText_TrainersTrainerCard);
+ StringAppend(str, gOtherText_TrainersTrainerCard);
MenuPrint_RightAligned(gStringVar1, 28, 2);
}
-static void TrainerCard_Back_PrintHallOfFameTime_Label(void) {
- if (unk_2000000.var_8 == FALSE) {
+static void TrainerCard_Back_PrintHallOfFameTime_Label(void)
+{
+ if (unk_2000000.var_8 == FALSE)
+ {
return;
}
MenuPrint(gOtherText_FirstHOF, 3, 5);
}
-static void TrainerCard_Back_PrintHallOfFameTime(void) {
- u8 *bufferPtr;
+static void TrainerCard_Back_PrintHallOfFameTime(void)
+{
+ u8 *str;
- if (unk_2000000.var_8 == FALSE) {
+ if (unk_2000000.var_8 == FALSE)
+ {
return;
}
- bufferPtr = gStringVar1;
- bufferPtr = ConvertIntToDecimalStringN(bufferPtr, unk_2000000.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN,
- 3);
- bufferPtr = StringCopy(bufferPtr, gUnknown_083B5EF4);
- bufferPtr = ConvertIntToDecimalStringN(bufferPtr, unk_2000000.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS,
- 2);
- bufferPtr = StringCopy(bufferPtr, gUnknown_083B5EF4);
- bufferPtr = ConvertIntToDecimalStringN(bufferPtr, unk_2000000.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS,
- 2);
+ str = gStringVar1;
+ str = ConvertIntToDecimalStringN(str, unk_2000000.var_64.firstHallOfFameA, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ str = StringCopy(str, gUnknown_083B5EF4);
+ str = ConvertIntToDecimalStringN(str, unk_2000000.var_64.firstHallOfFameB, STR_CONV_MODE_LEADING_ZEROS, 2);
+ str = StringCopy(str, gUnknown_083B5EF4);
+ str = ConvertIntToDecimalStringN(str, unk_2000000.var_64.firstHallOfFameC, STR_CONV_MODE_LEADING_ZEROS, 2);
MenuPrint_RightAligned(gStringVar1, 28, 5);
}
-static void TrainerCard_Back_PrintLinkBattlesLabel(void) {
- if (unk_2000000.var_9 == FALSE) {
+static void TrainerCard_Back_PrintLinkBattlesLabel(void)
+{
+ if (unk_2000000.var_9 == FALSE)
+ {
return;
}
MenuPrint(gOtherText_LinkCableBattles, 3, 7);
}
-static void TrainerCard_Back_PrintLinkBattles(void) {
+static void TrainerCard_Back_PrintLinkBattles(void)
+{
u8 buffer[16];
- if (unk_2000000.var_9 == FALSE) {
+ if (unk_2000000.var_9 == FALSE)
+ {
return;
}
@@ -1937,18 +2055,22 @@ static void TrainerCard_Back_PrintLinkBattles(void) {
MenuPrint_RightAligned(buffer, 28, 7);
}
-static void TrainerCard_Back_PrintBattleTower_Label(void) {
- if (unk_2000000.var_a == FALSE) {
+static void TrainerCard_Back_PrintBattleTower_Label(void)
+{
+ if (unk_2000000.var_a == FALSE)
+ {
return;
}
MenuPrint(gOtherText_BattleTowerWinRecord, 3, 15);
}
-static void TrainerCard_Back_PrintBattleTower(void) {
+static void TrainerCard_Back_PrintBattleTower(void)
+{
u8 buffer[16];
- if (unk_2000000.var_a == FALSE) {
+ if (unk_2000000.var_a == FALSE)
+ {
return;
}
@@ -1959,18 +2081,22 @@ static void TrainerCard_Back_PrintBattleTower(void) {
MenuPrint_PixelCoords(buffer, 149, 120, 0);
}
-static void TrainerCard_Back_PrintLinkContests_Label(void) {
- if (unk_2000000.var_b == FALSE) {
+static void TrainerCard_Back_PrintLinkContests_Label(void)
+{
+ if (unk_2000000.var_b == FALSE)
+ {
return;
}
MenuPrint(gOtherText_ContestRecord, 3, 13);
}
-static void TrainerCard_Back_PrintLinkContests(void) {
+static void TrainerCard_Back_PrintLinkContests(void)
+{
u8 buffer[8];
- if (unk_2000000.var_b == FALSE) {
+ if (unk_2000000.var_b == FALSE)
+ {
return;
}
@@ -1978,18 +2104,22 @@ static void TrainerCard_Back_PrintLinkContests(void) {
MenuPrint_RightAligned(buffer, 28, 13);
}
-static void TrainerCard_Back_PrintLinkPokeblocks_Label(void) {
- if (unk_2000000.var_c == FALSE) {
+static void TrainerCard_Back_PrintLinkPokeblocks_Label(void)
+{
+ if (unk_2000000.var_c == FALSE)
+ {
return;
}
MenuPrint(gOtherText_MixingRecord, 3, 11);
}
-static void TrainerCard_Back_PrintLinkPokeblocks(void) {
+static void TrainerCard_Back_PrintLinkPokeblocks(void)
+{
u8 buffer[8];
- if (unk_2000000.var_c == FALSE) {
+ if (unk_2000000.var_c == FALSE)
+ {
return;
}
@@ -1997,18 +2127,22 @@ static void TrainerCard_Back_PrintLinkPokeblocks(void) {
MenuPrint_RightAligned(buffer, 28, 11);
}
-static void TrainerCard_Back_PrintPokemonTrades_Label(void) {
- if (unk_2000000.var_d == FALSE) {
+static void TrainerCard_Back_PrintPokemonTrades_Label(void)
+{
+ if (unk_2000000.var_d == FALSE)
+ {
return;
}
MenuPrint(gOtherText_TradeRecord, 3, 9);
}
-static void TrainerCard_Back_PrintPokemonTrades(void) {
+static void TrainerCard_Back_PrintPokemonTrades(void)
+{
u8 buffer[8];
- if (unk_2000000.var_d == FALSE) {
+ if (unk_2000000.var_d == FALSE)
+ {
return;
}
@@ -2016,12 +2150,14 @@ static void TrainerCard_Back_PrintPokemonTrades(void) {
MenuPrint_RightAligned(buffer, 28, 9);
}
-void unref_sub_8094588(u16 left, u16 top) {
+void unref_sub_8094588(u16 left, u16 top)
+{
u8 *text = gOtherText_Boy;
- if (gSaveBlock2.playerGender == FEMALE) {
+ if (gSaveBlock2.playerGender == FEMALE)
+ {
text = gOtherText_Girl;
}
- MenuPrint(text, (u8) left, (u8) top);
+ MenuPrint(text, (u8)left, (u8)top);
}
diff --git a/src/trainer_see.c b/src/trainer_see.c
index c6cdc5658..56085f9be 100644
--- a/src/trainer_see.c
+++ b/src/trainer_see.c
@@ -1,14 +1,14 @@
#include "global.h"
-#include "trainer_see.h"
#include "asm.h"
-#include "battle_setup.h"
-#include "field_player_avatar.h"
-#include "field_map_obj.h"
#include "asm_fieldmap.h"
-#include "task.h"
-#include "sprite.h"
+#include "battle_setup.h"
#include "field_effect.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
#include "script.h"
+#include "sprite.h"
+#include "task.h"
+#include "trainer_see.h"
extern bool8 (*gIsTrainerInRange[])(struct MapObject *, u16, s16, s16);
extern bool8 (*gTrainerSeeFuncList[])(u8, struct Task *, struct MapObject *);
@@ -23,7 +23,7 @@ bool8 CheckTrainers(void)
{
u8 i;
- for(i = 0; i < 16; i++)
+ for (i = 0; i < 16; i++)
{
if ( gMapObjects[i].active )
if ( gMapObjects[i].trainerType == 1 || gMapObjects[i].trainerType == 3 )
@@ -37,14 +37,14 @@ bool8 CheckTrainer(u8 trainer)
{
u8 *scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(trainer);
- if(GetTrainerFlagFromScriptPointer(scriptPtr))
+ if (GetTrainerFlagFromScriptPointer(scriptPtr))
return FALSE;
else
{
struct MapObject *trainerObj = &gMapObjects[trainer];
u8 canApproach = TrainerCanApproachPlayer(trainerObj);
- if(canApproach != 0)
+ if (canApproach != 0)
{
TrainerWantsBattle(trainer, scriptPtr);
sub_80842C8(trainerObj, (canApproach - 1));
@@ -71,7 +71,7 @@ bool8 TrainerCanApproachPlayer(struct MapObject *trainerObj)
}
else // spinners
{
- for(i = 0; i < 4; i++)
+ for (i = 0; i < 4; i++)
{
playerCoord = gIsTrainerInRange[i](trainerObj, trainerObj->trainerRange_berryTreeId, x, y);
if ( CheckPathBetweenTrainerAndPlayer((struct MapObject2 *)trainerObj, playerCoord, i + 1) ) // directions are 1-4 instead of 0-3. south north west east
@@ -233,7 +233,7 @@ s8 sub_808441C(u8 taskId, struct Task *task, struct MapObject *trainerObj)
{
if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
{
- if(task->data[3])
+ if (task->data[3])
{
FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18));
task->data[3]--;
@@ -282,7 +282,7 @@ s8 sub_8084534(u8 taskId, struct Task *task, struct MapObject *trainerObj) // te
s8 sub_8084578(u8 taskId, struct Task *task, struct MapObject *trainerObj)
{
- if(!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
|| FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
{
FieldObjectSetSpecialAnim(trainerObj, 0x59);
@@ -301,7 +301,7 @@ s8 sub_80845AC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
s8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj)
{
- if(!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)
|| FieldObjectClearAnimIfSpecialAnimFinished(trainerObj))
{
FieldObjectSetSpecialAnim(trainerObj, 0x3E);
@@ -312,7 +312,7 @@ s8 sub_80845C8(u8 taskId, struct Task *task, struct MapObject *trainerObj)
s8 sub_80845FC(u8 taskId, struct Task *task, struct MapObject *trainerObj)
{
- if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj))
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj))
{
gUnknown_0202FF84[0] = trainerObj->coords2.x;
gUnknown_0202FF84[1] = trainerObj->coords2.y;
@@ -328,7 +328,7 @@ s8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj)
{
struct Sprite *sprite;
- if(gSprites[task->data[4]].animCmdIndex == 2)
+ if (gSprites[task->data[4]].animCmdIndex == 2)
{
trainerObj->mapobj_bit_26 = 0;
trainerObj->mapobj_bit_2 = 1;
@@ -344,7 +344,7 @@ s8 sub_8084654(u8 taskId, struct Task *task, struct MapObject *trainerObj)
s8 sub_80846C8(u8 taskId, struct Task *task, struct MapObject *trainerObj)
{
- if(!FieldEffectActiveListContains(49))
+ if (!FieldEffectActiveListContains(49))
task->data[0] = 3;
return 0;
@@ -357,13 +357,13 @@ void sub_80846E4(u8 taskId)
// another mapObj loaded into by loadword?
LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj);
- if(!task->data[7])
+ if (!task->data[7])
{
FieldObjectClearAnim(mapObj);
task->data[7]++;
}
gTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj);
- if(task->data[0] == 3 && !FieldEffectActiveListContains(49))
+ if (task->data[0] == 3 && !FieldEffectActiveListContains(49))
{
npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
sub_805C774(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18));
@@ -395,7 +395,7 @@ u8 FldEff_ExclamationMarkIcon1(void)
if (spriteId != 64)
sub_8084894(&gSprites[spriteId], 0, 0);
-
+
return 0;
}
@@ -405,7 +405,7 @@ u8 FldEff_ExclamationMarkIcon2(void)
if (spriteId != 64)
sub_8084894(&gSprites[spriteId], 33, 1);
-
+
return 0;
}
@@ -415,7 +415,7 @@ u8 FldEff_HeartIcon(void)
if (spriteId != 64)
sub_8084894(&gSprites[spriteId], 46, 0);
-
+
return 0;
}
@@ -423,13 +423,13 @@ void sub_8084894(struct Sprite *sprite, u16 a2, u8 a3)
{
sprite->oam.priority = 1;
sprite->coordOffsetEnabled = 1;
-
+
sprite->data0 = gUnknown_0202FF84[0];
sprite->data1 = gUnknown_0202FF84[1];
sprite->data2 = gUnknown_0202FF84[2];
sprite->data3 = -5;
sprite->data7 = a2;
-
+
StartSpriteAnim(sprite, a3);
}
diff --git a/src/tv.c b/src/tv.c
index d2a54a539..dd523594d 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -3,12 +3,12 @@
#include "event_data.h"
#include "field_message_box.h"
#include "flags.h"
-#include "global.h"
#include "rng.h"
#include "string_util.h"
#include "text.h"
-enum {
+enum
+{
TVSHOW_FAN_CLUB_LETTER = 1,
TVSHOW_RECENT_HAPPENINGS = 2,
TVSHOW_PKMN_FAN_CLUB_OPINIONS = 3,
@@ -16,15 +16,17 @@ enum {
TVSHOW_MASS_OUTBREAK = 41,
};
-struct UnkTvStruct {
+struct UnkTvStruct
+{
s8 var0;
};
-struct OutbreakPokemon {
- /* 0x00 */ u16 species;
- /* 0x02 */ u16 moves[4];
- /* 0x0A */ u8 level;
- /* 0x0B */ u8 location;
+struct OutbreakPokemon
+{
+ /*0x00*/ u16 species;
+ /*0x02*/ u16 moves[4];
+ /*0x0A*/ u8 level;
+ /*0x0B*/ u8 location;
};
extern u16 gSpecialVar_0x8004;
@@ -38,26 +40,30 @@ extern u8 gSpeciesNames[][11];
extern u8 *gTVPokemonOutbreakTextGroup[];
extern struct OutbreakPokemon gPokeOutbreakSpeciesList[5];
-void sub_80BE478(void) {
+void sub_80BE478(void)
+{
u16 playerNameLength;
u16 pokemonNicknameLength;
TVShow *tvShow;
sub_80BF478();
- if (gScriptResult == 1) {
+ if (gScriptResult == 1)
+ {
return;
}
GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar1);
playerNameLength = StringLength(gSaveBlock2.playerName);
- if (playerNameLength <= 1) {
+ if (playerNameLength <= 1)
+ {
return;
}
pokemonNicknameLength = StringLength(gStringVar1);
- if (pokemonNicknameLength <= 1) {
+ if (pokemonNicknameLength <= 1)
+ {
return;
}
@@ -84,7 +90,8 @@ void sub_80BE478(void) {
StripExtCtrlCodes(tvShow->nameRaterShow.pokemonName);
}
-void StartMassOutbreak(void) {
+void StartMassOutbreak(void)
+{
TVShow *tvShow;
tvShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004];
@@ -104,7 +111,8 @@ void StartMassOutbreak(void) {
gSaveBlock1.outbreakUnk5 = 2;
}
-void sub_80BE5FC(void) {
+void sub_80BE5FC(void)
+{
TVShow *tvShow;
u16 species;
@@ -120,7 +128,8 @@ void sub_80BE5FC(void) {
tvShow->fanclubLetter.var18 = GAME_LANGUAGE;
}
-void sub_80BE65C(void) {
+void sub_80BE65C(void)
+{
TVShow *tvShow;
tvShow = &gSaveBlock1.tvShows[gUnknown_03005D38.var0];
@@ -134,7 +143,8 @@ void sub_80BE65C(void) {
tvShow->recentHappenings.var18 = GAME_LANGUAGE;
}
-void sub_80BE6A0(void) {
+void sub_80BE6A0(void)
+{
TVShow *tvShow;
u8 monIndex;
@@ -160,30 +170,36 @@ void sub_80BE6A0(void) {
StripExtCtrlCodes(tvShow->fanclubOpinions.var10);
}
-void nullsub_21(void) {
-
+void nullsub_21(void)
+{
}
-void sub_80BE778(void) {
+void sub_80BE778(void)
+{
u8 i;
- if (!FlagGet(SYS_GAME_CLEAR)) {
+ if (!FlagGet(SYS_GAME_CLEAR))
+ {
return;
}
- for (i = 0; i < 24; i++) {
- if (gSaveBlock1.tvShows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK) {
+ for (i = 0; i < 24; i++)
+ {
+ if (gSaveBlock1.tvShows[i].massOutbreak.var00 == TVSHOW_MASS_OUTBREAK)
+ {
return;
}
}
- if (sub_80BF77C(0x147)) {
+ if (sub_80BF77C(0x147))
+ {
return;
}
gUnknown_03005D38.var0 = sub_80BF720(gSaveBlock1.tvShows);
- if (gUnknown_03005D38.var0 == -1) {
+ if (gUnknown_03005D38.var0 == -1)
+ {
return;
}
{
@@ -223,7 +239,8 @@ void sub_80BE778(void) {
}
}
-void EndMassOutbreak(void) {
+void EndMassOutbreak(void)
+{
gSaveBlock1.outbreakPokemonSpecies = 0;
gSaveBlock1.outbreakLocationMapNum = 0;
gSaveBlock1.outbreakLocationMapGroup = 0;
@@ -239,7 +256,8 @@ void EndMassOutbreak(void) {
gSaveBlock1.outbreakUnk5 = 0;
}
-void sub_80BE8C4(u16 arg0) {
+void sub_80BE8C4(u16 arg0)
+{
sub_80BE8EC(arg0);
UpdateMassOutbreakTimeLeft(arg0);
sub_80BEE84(arg0);
@@ -248,14 +266,16 @@ void sub_80BE8C4(u16 arg0) {
asm(".section .text_b");
-u8 sub_80BF4F4(u8 arg0) {
+u8 sub_80BF4F4(u8 arg0)
+{
u32 species;
GetMonData(&gPlayerParty[arg0], MON_DATA_NICKNAME, &gStringVar1);
species = GetMonData(&gPlayerParty[arg0], MON_DATA_SPECIES, NULL);
- if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1) == FALSE) {
+ if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1) == FALSE)
+ {
return FALSE;
}
@@ -264,7 +284,8 @@ u8 sub_80BF4F4(u8 arg0) {
asm(".section .text_c");
-void DoTVShowPokemonNewsMassOutbreak(void) {
+void DoTVShowPokemonNewsMassOutbreak(void)
+{
TVShow *tvShow;
tvShow = &gSaveBlock1.tvShows[gSpecialVar_0x8004];
@@ -281,13 +302,15 @@ void DoTVShowPokemonNewsMassOutbreak(void) {
asm(".section .text_d");
-void TVShowDone(void) {
+void TVShowDone(void)
+{
gScriptResult = 1;
gUnknown_020387E8 = 0;
gSaveBlock1.tvShows[gSpecialVar_0x8004].common.var01 = 0;
}
-void sub_80C2014(void) {
+void sub_80C2014(void)
+{
gUnknown_020387E8 = 0;
}
diff --git a/src/unknown_debug_menu.c b/src/unknown_debug_menu.c
new file mode 100644
index 000000000..bbaeef63a
--- /dev/null
+++ b/src/unknown_debug_menu.c
@@ -0,0 +1,52 @@
+#include "global.h"
+#include "menu.h"
+
+extern u8 gUnknown_02024D1E[];
+
+extern u8 (*gCallback_03004AE8)(void);
+
+extern const struct MenuAction gUnknown_0842C29C[];
+
+u8 sub_814A464(void);
+
+int unref_sub_814A414(void)
+{
+ MenuZeroFillScreen();
+ MenuDrawTextWindow(0, 0, 16, 18);
+ PrintMenuItems(2, 1, 8, gUnknown_0842C29C);
+ InitMenu(0, 1, 1, 8, 0, 15);
+ gCallback_03004AE8 = sub_814A464;
+ return 0;
+}
+
+u8 sub_814A464(void)
+{
+ s8 result = ProcessMenuInput();
+ if (result == -2)
+ {
+ return 0;
+ }
+ else if (result == -1)
+ {
+ CloseMenu();
+ return 1;
+ }
+ else
+ {
+ gUnknown_02024D1E[0] = result;
+ gCallback_03004AE8 = gUnknown_0842C29C[result].func;
+ return 0;
+ }
+}
+
+u8 sub_814A4B8(void)
+{
+ gSaveBlock2.filler_A8.var_4AE = 3;
+ gSaveBlock2.filler_A8.var_4AF = 3;
+ gSaveBlock2.filler_A8.var_4B4 = gUnknown_02024D1E[0] + 1;
+ gSaveBlock2.filler_A8.var_4B6 = gUnknown_02024D1E[0] + 1;
+ gSaveBlock2.filler_A8.var_4B0 = 1;
+ gSaveBlock2.filler_A8.var_4B2 = 1;
+ CloseMenu();
+ return 1;
+}
diff --git a/src/wallclock.c b/src/wallclock.c
index 147a68d31..2f4d694a6 100644
--- a/src/wallclock.c
+++ b/src/wallclock.c
@@ -7,26 +7,147 @@
#include "palette.h"
#include "rtc.h"
#include "songs.h"
+#include "sound.h"
#include "task.h"
#include "trig.h"
-#include "sound.h"
extern u16 gSpecialVar_0x8004;
-extern u16 gMiscClockMale_Pal[];
-extern u16 gMiscClockFemale_Pal[];
extern u8 gMiscClock_Gfx[];
-extern struct SpriteSheet gUnknown_083F7A90;
-extern struct SpritePalette gUnknown_083F7AA0;
extern u8 gUnknown_08E95774[];
extern u8 gUnknown_08E954B0[];
extern u8 gOtherText_CorrectTimePrompt[];
extern const struct MenuAction gMenuYesNoItems[];
-extern s8 gClockHandCoords[][2];
+extern u16 gMiscClockMale_Pal[];
+extern u16 gMiscClockFemale_Pal[];
-extern struct SpriteTemplate gSpriteTemplate_83F7AD8;
-extern struct SpriteTemplate gSpriteTemplate_83F7AF0;
-extern struct SpriteTemplate gSpriteTemplate_83F7B28;
-extern struct SpriteTemplate gSpriteTemplate_83F7B40;
+//--------------------------------------------------
+// Graphics Data
+//--------------------------------------------------
+
+static const u8 ClockGfx_Misc[] = INCBIN_U8("graphics/misc/clock_misc.4bpp.lz");
+static const struct SpriteSheet gUnknown_083F7A90[] =
+{
+ {ClockGfx_Misc, 0x2000, 0x1000},
+ {NULL},
+};
+static const struct SpritePalette gUnknown_083F7AA0[] =
+{
+ {gMiscClockMale_Pal, 0x1000},
+ {gMiscClockFemale_Pal, 0x1001},
+ {NULL},
+};
+static const struct OamData gOamData_83F7AB8 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_83F7AC0[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_83F7AC8[] =
+{
+ ANIMCMD_FRAME(64, 30),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_83F7AD0[] =
+{
+ gSpriteAnim_83F7AC0,
+};
+static const union AnimCmd *const gSpriteAnimTable_83F7AD4[] =
+{
+ gSpriteAnim_83F7AC8,
+};
+static void sub_810B05C(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_83F7AD8 =
+{
+ .tileTag = 0x1000,
+ .paletteTag = 0x1000,
+ .oam = &gOamData_83F7AB8,
+ .anims = gSpriteAnimTable_83F7AD0,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_810B05C,
+};
+static void sub_810B0F4(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_83F7AF0 =
+{
+ .tileTag = 0x1000,
+ .paletteTag = 0x1000,
+ .oam = &gOamData_83F7AB8,
+ .anims = gSpriteAnimTable_83F7AD4,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_810B0F4,
+};
+static const struct OamData gOamData_83F7B08 =
+{
+ .y = 160,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 1,
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+static const union AnimCmd gSpriteAnim_83F7B10[] =
+{
+ ANIMCMD_FRAME(132, 30),
+ ANIMCMD_END,
+};
+static const union AnimCmd gSpriteAnim_83F7B18[] =
+{
+ ANIMCMD_FRAME(128, 30),
+ ANIMCMD_END,
+};
+static const union AnimCmd *const gSpriteAnimTable_83F7B20[] =
+{
+ gSpriteAnim_83F7B10,
+};
+static const union AnimCmd *const gSpriteAnimTable_83F7B24[] =
+{
+ gSpriteAnim_83F7B18,
+};
+static void sub_810B18C(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_83F7B28 =
+{
+ .tileTag = 0x1000,
+ .paletteTag = 0x1000,
+ .oam = &gOamData_83F7B08,
+ .anims = gSpriteAnimTable_83F7B20,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_810B18C,
+};
+static void sub_810B230(struct Sprite *sprite);
+static const struct SpriteTemplate gSpriteTemplate_83F7B40 =
+{
+ .tileTag = 0x1000,
+ .paletteTag = 0x1000,
+ .oam = &gOamData_83F7B08,
+ .anims = gSpriteAnimTable_83F7B24,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = sub_810B230,
+};
static void WallClockVblankCallback(void);
static void LoadWallClockGraphics(void);
@@ -48,25 +169,17 @@ static u8 AdvanceClock(u8 taskId, u8 direction);
static void UpdateClockPeriod(u8 taskId, u8 direction);
static void InitClockWithRtc(u8 taskId);
-//Task data
-enum {
- TD_MHAND_ANGLE,
- TD_HHAND_ANGLE,
- TD_HOURS,
- TD_MINUTES,
- TD_SETDIRECTION, //Movement direction when setting the clock
- TD_PERIOD, //Whether the time is AM or PM
- TD_SETSPEED, //Movement speed when setting the clock
-};
-
-enum {
- AM,
- PM
+enum
+{
+ PERIOD_AM,
+ PERIOD_PM,
};
-enum {
- BACKWARD = 1,
- FORWARD
+enum
+{
+ MVMT_NONE,
+ MVMT_BACKWARD,
+ MVMT_FORWARD,
};
static void WallClockVblankCallback(void)
@@ -80,7 +193,7 @@ static void LoadWallClockGraphics(void)
{
u8 *addr;
u32 size;
-
+
SetVBlankCallback(0);
REG_DISPCNT = 0;
REG_BG3CNT = 0;
@@ -95,15 +208,15 @@ static void LoadWallClockGraphics(void)
REG_BG1VOFS = 0;
REG_BG0HOFS = 0;
REG_BG0VOFS = 0;
-
+
addr = (void *)VRAM;
size = 0x18000;
- while(1)
+ while (1)
{
DmaFill16(3, 0, addr, 0x1000);
addr += 0x1000;
size -= 0x1000;
- if(size <= 0x1000)
+ if (size <= 0x1000)
{
DmaFill16(3, 0, addr, size);
break;
@@ -111,9 +224,9 @@ static void LoadWallClockGraphics(void)
}
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
-
+
LZ77UnCompVram(gMiscClock_Gfx, (void *)VRAM);
- if(gSpecialVar_0x8004 == MALE)
+ if (gSpecialVar_0x8004 == MALE)
LoadPalette(gMiscClockMale_Pal, 0, 32);
else
LoadPalette(gMiscClockFemale_Pal, 0, 32);
@@ -122,8 +235,8 @@ static void LoadWallClockGraphics(void)
ResetSpriteData();
ResetPaletteFade();
FreeAllSpritePalettes();
- LoadCompressedObjectPic(&gUnknown_083F7A90);
- LoadSpritePalettes(&gUnknown_083F7AA0);
+ LoadCompressedObjectPic(&gUnknown_083F7A90[0]);
+ LoadSpritePalettes(gUnknown_083F7AA0);
SetUpWindowConfig(&gWindowConfig_81E6C3C);
InitMenuWindow(&gWindowConfig_81E6CE4);
}
@@ -131,7 +244,7 @@ static void LoadWallClockGraphics(void)
static void WallClockInit(void)
{
u16 ime;
-
+
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
ime = REG_IME;
REG_IME = 0;
@@ -149,42 +262,50 @@ static void WallClockInit(void)
DISPCNT_BG3_ON | DISPCNT_OBJ_ON;
}
+#define tMinuteHandAngle data[0]
+#define tHourHandAngle data[1]
+#define tHours data[2]
+#define tMinutes data[3]
+#define tMvmtDir data[4]
+#define tPeriod data[5]
+#define tMvmtSpeed data[6]
+
//Allow player to set the clock
void CB2_StartWallClock(void)
{
u8 taskId;
u8 spriteId;
-
+
LoadWallClockGraphics();
LZ77UnCompVram(&gUnknown_08E954B0, (void *)(VRAM + 0x3800));
-
+
taskId = CreateTask(Task_SetClock1, 0);
- gTasks[taskId].data[TD_HOURS] = 10;
- gTasks[taskId].data[TD_MINUTES] = 0;
- gTasks[taskId].data[TD_SETDIRECTION] = 0;
- gTasks[taskId].data[TD_PERIOD] = AM;
- gTasks[taskId].data[TD_SETSPEED] = 0;
- gTasks[taskId].data[TD_MHAND_ANGLE] = 0;
- gTasks[taskId].data[TD_HHAND_ANGLE] = 300;
-
- spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, 0x78, 0x50, 1);
+ gTasks[taskId].tHours = 10;
+ gTasks[taskId].tMinutes = 0;
+ gTasks[taskId].tMvmtDir = MVMT_NONE;
+ gTasks[taskId].tPeriod = PERIOD_AM;
+ gTasks[taskId].tMvmtSpeed = 0;
+ gTasks[taskId].tMinuteHandAngle = 0;
+ gTasks[taskId].tHourHandAngle = 300;
+
+ spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 1);
gSprites[spriteId].data0 = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 0;
-
- spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, 0x78, 0x50, 0);
+
+ spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 0);
gSprites[spriteId].data0 = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 1;
-
- spriteId = CreateSprite(&gSpriteTemplate_83F7B28, 0x78, 0x50, 2);
+
+ spriteId = CreateSprite(&gSpriteTemplate_83F7B28, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2);
gSprites[spriteId].data0 = taskId;
gSprites[spriteId].data1 = 45;
-
- spriteId = CreateSprite(&gSpriteTemplate_83F7B40, 0x78, 0x50, 2);
+
+ spriteId = CreateSprite(&gSpriteTemplate_83F7B40, DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, 2);
gSprites[spriteId].data0 = taskId;
gSprites[spriteId].data1 = 90;
-
+
WallClockInit();
}
@@ -195,13 +316,13 @@ void CB2_ViewWallClock(void)
s16 angle1;
s16 angle2;
u8 spriteId;
-
+
LoadWallClockGraphics();
LZ77UnCompVram(gUnknown_08E95774, (void *)(VRAM + 0x3800));
-
+
taskId = CreateTask(Task_ViewClock1, 0);
InitClockWithRtc(taskId);
- if(gTasks[taskId].data[TD_PERIOD] == 0)
+ if (gTasks[taskId].tPeriod == PERIOD_AM)
{
angle1 = 45;
angle2 = 90;
@@ -211,25 +332,25 @@ void CB2_ViewWallClock(void)
angle1 = 90;
angle2 = 135;
}
-
+
spriteId = CreateSprite(&gSpriteTemplate_83F7AD8, 120, 80, 1);
gSprites[spriteId].data0 = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 0;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83F7AF0, 120, 80, 0);
gSprites[spriteId].data0 = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 1;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83F7B28, 120, 80, 2);
gSprites[spriteId].data0 = taskId;
gSprites[spriteId].data1 = angle1;
-
+
spriteId = CreateSprite(&gSpriteTemplate_83F7B40, 120, 80, 2);
gSprites[spriteId].data0 = taskId;
gSprites[spriteId].data1 = angle2;
-
+
WallClockInit();
}
@@ -243,49 +364,49 @@ static void WallClockMainCallback(void)
static void Task_SetClock1(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
gTasks[taskId].func = Task_SetClock2;
}
//Handle keypresses when setting clock
static void Task_SetClock2(u8 taskId)
{
- if(gTasks[taskId].data[TD_MHAND_ANGLE] % 6)
+ if (gTasks[taskId].tMinuteHandAngle % 6)
{
- gTasks[taskId].data[TD_MHAND_ANGLE] = CalcNewMinHandAngle(
- gTasks[taskId].data[TD_MHAND_ANGLE],
- gTasks[taskId].data[TD_SETDIRECTION],
- gTasks[taskId].data[TD_SETSPEED]);
+ gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle(
+ gTasks[taskId].tMinuteHandAngle,
+ gTasks[taskId].tMvmtDir,
+ gTasks[taskId].tMvmtSpeed);
}
else
{
- gTasks[taskId].data[TD_MHAND_ANGLE] = gTasks[taskId].data[TD_MINUTES] * 6;
- gTasks[taskId].data[TD_HHAND_ANGLE] = (gTasks[taskId].data[TD_HOURS] % 12) * 30 + (gTasks[taskId].data[TD_MINUTES] / 10) * 5;
- if(gMain.newKeys & A_BUTTON)
+ gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6;
+ gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5;
+ if (gMain.newKeys & A_BUTTON)
{
gTasks[taskId].func = Task_SetClock3;
return;
}
else
{
- gTasks[taskId].data[TD_SETDIRECTION] = gMain.newKeys & A_BUTTON;
- if(gMain.heldKeys & DPAD_LEFT)
- gTasks[taskId].data[TD_SETDIRECTION] = BACKWARD;
- if(gMain.heldKeys & DPAD_RIGHT)
- gTasks[taskId].data[TD_SETDIRECTION] = FORWARD;
- if(gTasks[taskId].data[TD_SETDIRECTION])
+ gTasks[taskId].tMvmtDir = gMain.newKeys & A_BUTTON;
+ if (gMain.heldKeys & DPAD_LEFT)
+ gTasks[taskId].tMvmtDir = MVMT_BACKWARD;
+ if (gMain.heldKeys & DPAD_RIGHT)
+ gTasks[taskId].tMvmtDir = MVMT_FORWARD;
+ if (gTasks[taskId].tMvmtDir)
{
- if(gTasks[taskId].data[TD_SETSPEED] <= 0xFE)
- gTasks[taskId].data[TD_SETSPEED]++;
- gTasks[taskId].data[TD_MHAND_ANGLE] = CalcNewMinHandAngle(
- gTasks[taskId].data[TD_MHAND_ANGLE],
- gTasks[taskId].data[TD_SETDIRECTION],
- gTasks[taskId].data[TD_SETSPEED]);
- AdvanceClock(taskId, gTasks[taskId].data[TD_SETDIRECTION]);
+ if (gTasks[taskId].tMvmtSpeed < 0xFF)
+ gTasks[taskId].tMvmtSpeed++;
+ gTasks[taskId].tMinuteHandAngle = CalcNewMinHandAngle(
+ gTasks[taskId].tMinuteHandAngle,
+ gTasks[taskId].tMvmtDir,
+ gTasks[taskId].tMvmtSpeed);
+ AdvanceClock(taskId, gTasks[taskId].tMvmtDir);
}
else
{
- gTasks[taskId].data[TD_SETSPEED] = 0;
+ gTasks[taskId].tMvmtSpeed = 0;
}
}
}
@@ -305,7 +426,7 @@ static void Task_SetClock3(u8 taskId)
//Get menu selection
static void Task_SetClock4(u8 taskId)
{
- switch(ProcessMenuInputNoWrap_())
+ switch (ProcessMenuInputNoWrap_())
{
case 0: //YES
PlaySE(SE_SELECT);
@@ -324,20 +445,20 @@ static void Task_SetClock4(u8 taskId)
//Set the time offset based on the wall clock's time
static void Task_SetClock5(u8 taskId)
{
- RtcInitLocalTimeOffset(gTasks[taskId].data[TD_HOURS], gTasks[taskId].data[TD_MINUTES]);
+ RtcInitLocalTimeOffset(gTasks[taskId].tHours, gTasks[taskId].tMinutes);
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
gTasks[taskId].func = Task_SetClock6;
}
static void Task_SetClock6(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
SetMainCallback2((MainCallback)gMain.savedCallback);
}
static void Task_ViewClock1(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
gTasks[taskId].func = Task_ViewClock2;
}
@@ -345,7 +466,7 @@ static void Task_ViewClock1(u8 taskId)
static void Task_ViewClock2(u8 taskId)
{
InitClockWithRtc(taskId);
- if(gMain.newKeys & (A_BUTTON | B_BUTTON))
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
gTasks[taskId].func = Task_ViewClock3;
}
@@ -357,37 +478,37 @@ static void Task_ViewClock3(u8 taskId)
static void Task_ViewClock4(u8 taskId)
{
- if(!gPaletteFade.active)
+ if (!gPaletteFade.active)
SetMainCallback2((MainCallback)gMain.savedCallback);
}
static u8 CalcMinHandDelta(u16 speed)
{
- if(speed > 60)
+ if (speed > 60)
return 6;
- else if(speed > 30)
+ else if (speed > 30)
return 3;
- else if(speed > 10)
+ else if (speed > 10)
return 2;
else
return 1;
}
-//Calculates the new position of the minute hand when setting the clock
+//Calculates the new angle of the minute hand when setting the clock
static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed)
{
u8 delta = CalcMinHandDelta(speed);
-
- switch(direction)
+
+ switch (direction)
{
- case BACKWARD:
- if(angle)
+ case MVMT_BACKWARD:
+ if (angle)
angle = angle - delta;
else
angle = 360 - delta;
break;
- case FORWARD:
- if(angle < 360 - delta)
+ case MVMT_FORWARD:
+ if (angle < 360 - delta)
angle = angle + delta;
else
angle = 0;
@@ -399,31 +520,31 @@ static u16 CalcNewMinHandAngle(u16 angle, u8 direction, u8 speed)
//Advances clock forward or backward by 1 minute
static u8 AdvanceClock(u8 taskId, u8 direction)
{
- switch(direction)
+ switch (direction)
{
- case BACKWARD:
- if(gTasks[taskId].data[TD_MINUTES] > 0)
- gTasks[taskId].data[TD_MINUTES]--;
+ case MVMT_BACKWARD:
+ if (gTasks[taskId].tMinutes > 0)
+ gTasks[taskId].tMinutes--;
else
{
- gTasks[taskId].data[TD_MINUTES] = 59;
- if(gTasks[taskId].data[TD_HOURS] > 0)
- gTasks[taskId].data[TD_HOURS]--;
+ gTasks[taskId].tMinutes = 59;
+ if (gTasks[taskId].tHours > 0)
+ gTasks[taskId].tHours--;
else
- gTasks[taskId].data[TD_HOURS] = 23;
+ gTasks[taskId].tHours = 23;
UpdateClockPeriod(taskId, direction);
}
break;
- case FORWARD:
- if(gTasks[taskId].data[TD_MINUTES] <= 58)
- gTasks[taskId].data[TD_MINUTES]++;
+ case MVMT_FORWARD:
+ if (gTasks[taskId].tMinutes < 59)
+ gTasks[taskId].tMinutes++;
else
{
- gTasks[taskId].data[TD_MINUTES] = 0;
- if(gTasks[taskId].data[TD_HOURS] <= 22)
- gTasks[taskId].data[TD_HOURS]++;
+ gTasks[taskId].tMinutes = 0;
+ if (gTasks[taskId].tHours < 23)
+ gTasks[taskId].tHours++;
else
- gTasks[taskId].data[TD_HOURS] = 0;
+ gTasks[taskId].tHours = 0;
UpdateClockPeriod(taskId, direction);
}
break;
@@ -434,29 +555,29 @@ static u8 AdvanceClock(u8 taskId, u8 direction)
//Updates the clock period (AM/PM) if it needs to change
static void UpdateClockPeriod(u8 taskId, u8 direction)
{
- u8 hours = gTasks[taskId].data[TD_HOURS];
-
- switch(direction)
+ u8 hours = gTasks[taskId].tHours;
+
+ switch (direction)
{
- case BACKWARD:
- switch(hours)
+ case MVMT_BACKWARD:
+ switch (hours)
{
case 11:
- gTasks[taskId].data[TD_PERIOD] = AM;
+ gTasks[taskId].tPeriod = PERIOD_AM;
break;
case 23:
- gTasks[taskId].data[TD_PERIOD] = PM;
+ gTasks[taskId].tPeriod = PERIOD_PM;
break;
}
break;
- case FORWARD:
- switch(hours)
+ case MVMT_FORWARD:
+ switch (hours)
{
case 0:
- gTasks[taskId].data[TD_PERIOD] = AM;
+ gTasks[taskId].tPeriod = PERIOD_AM;
break;
case 12:
- gTasks[taskId].data[TD_PERIOD] = PM;
+ gTasks[taskId].tPeriod = PERIOD_PM;
break;
}
break;
@@ -466,83 +587,447 @@ static void UpdateClockPeriod(u8 taskId, u8 direction)
static void InitClockWithRtc(u8 taskId)
{
RtcCalcLocalTime();
- gTasks[taskId].data[TD_HOURS] = gLocalTime.hours;
- gTasks[taskId].data[TD_MINUTES] = gLocalTime.minutes;
- gTasks[taskId].data[TD_MHAND_ANGLE] = gTasks[taskId].data[TD_MINUTES] * 6;
- gTasks[taskId].data[TD_HHAND_ANGLE] = (gTasks[taskId].data[TD_HOURS] % 12) * 30 + (gTasks[taskId].data[TD_MINUTES] / 10) * 5;
- if(gLocalTime.hours <= 11)
- gTasks[taskId].data[TD_PERIOD] = AM;
+ gTasks[taskId].tHours = gLocalTime.hours;
+ gTasks[taskId].tMinutes = gLocalTime.minutes;
+ gTasks[taskId].tMinuteHandAngle = gTasks[taskId].tMinutes * 6;
+ gTasks[taskId].tHourHandAngle = (gTasks[taskId].tHours % 12) * 30 + (gTasks[taskId].tMinutes / 10) * 5;
+ if (gLocalTime.hours <= 11)
+ gTasks[taskId].tPeriod = PERIOD_AM;
else
- gTasks[taskId].data[TD_PERIOD] = PM;
+ gTasks[taskId].tPeriod = PERIOD_PM;
}
-void sub_810B05C(struct Sprite *sprite)
+static const s8 gClockHandCoords[][2] =
+{
+ { 0, -24},
+ { 1, -25},
+ { 1, -25},
+ { 2, -25},
+ { 2, -25},
+ { 2, -25},
+ { 3, -24},
+ { 3, -25},
+ { 4, -25},
+ { 4, -25},
+ { 4, -25},
+ { 5, -25},
+ { 5, -25},
+ { 6, -24},
+ { 6, -24},
+ { 6, -24},
+ { 7, -24},
+ { 7, -24},
+ { 7, -24},
+ { 8, -24},
+ { 8, -24},
+ { 9, -24},
+ { 9, -24},
+ { 10, -23},
+ { 10, -23},
+ { 11, -22},
+ { 11, -22},
+ { 11, -22},
+ { 12, -22},
+ { 12, -21},
+ { 13, -21},
+ { 13, -21},
+ { 13, -21},
+ { 14, -21},
+ { 14, -21},
+ { 14, -20},
+ { 14, -20},
+ { 15, -20},
+ { 15, -19},
+ { 16, -19},
+ { 16, -19},
+ { 16, -19},
+ { 16, -18},
+ { 16, -18},
+ { 17, -18},
+ { 17, -17},
+ { 17, -17},
+ { 18, -17},
+ { 18, -17},
+ { 18, -16},
+ { 18, -16},
+ { 19, -16},
+ { 19, -15},
+ { 19, -15},
+ { 20, -15},
+ { 20, -14},
+ { 20, -14},
+ { 20, -13},
+ { 20, -13},
+ { 21, -13},
+ { 21, -13},
+ { 21, -12},
+ { 22, -12},
+ { 22, -12},
+ { 22, -11},
+ { 22, -11},
+ { 22, -10},
+ { 23, -10},
+ { 23, -9},
+ { 23, -9},
+ { 23, -9},
+ { 23, -9},
+ { 23, -8},
+ { 23, -8},
+ { 23, -7},
+ { 23, -7},
+ { 23, -6},
+ { 24, -6},
+ { 24, -6},
+ { 25, -5},
+ { 25, -5},
+ { 24, -4},
+ { 25, -4},
+ { 24, -3},
+ { 25, -3},
+ { 25, -3},
+ { 25, -2},
+ { 25, -2},
+ { 24, -1},
+ { 25, -1},
+ { 24, 0},
+ { 24, 0},
+ { 24, 0},
+ { 24, 1},
+ { 24, 1},
+ { 25, 2},
+ { 24, 2},
+ { 25, 2},
+ { 24, 3},
+ { 24, 3},
+ { 25, 4},
+ { 24, 4},
+ { 24, 5},
+ { 24, 5},
+ { 24, 5},
+ { 24, 6},
+ { 23, 6},
+ { 23, 6},
+ { 23, 7},
+ { 23, 8},
+ { 23, 8},
+ { 23, 8},
+ { 23, 9},
+ { 23, 9},
+ { 23, 10},
+ { 22, 10},
+ { 22, 10},
+ { 22, 11},
+ { 22, 11},
+ { 22, 11},
+ { 22, 12},
+ { 21, 12},
+ { 21, 12},
+ { 21, 13},
+ { 20, 13},
+ { 20, 13},
+ { 19, 13},
+ { 19, 13},
+ { 19, 14},
+ { 19, 14},
+ { 19, 15},
+ { 19, 15},
+ { 18, 15},
+ { 18, 16},
+ { 17, 16},
+ { 17, 16},
+ { 17, 17},
+ { 17, 17},
+ { 16, 17},
+ { 16, 18},
+ { 16, 18},
+ { 15, 18},
+ { 14, 18},
+ { 15, 19},
+ { 14, 19},
+ { 14, 19},
+ { 13, 19},
+ { 13, 20},
+ { 13, 20},
+ { 13, 20},
+ { 12, 20},
+ { 12, 20},
+ { 12, 21},
+ { 11, 21},
+ { 11, 21},
+ { 11, 21},
+ { 10, 21},
+ { 10, 22},
+ { 10, 22},
+ { 9, 22},
+ { 9, 22},
+ { 8, 22},
+ { 7, 22},
+ { 7, 23},
+ { 7, 23},
+ { 6, 23},
+ { 6, 23},
+ { 5, 23},
+ { 5, 23},
+ { 5, 24},
+ { 4, 24},
+ { 4, 24},
+ { 4, 24},
+ { 3, 24},
+ { 2, 24},
+ { 2, 24},
+ { 1, 24},
+ { 1, 24},
+ { 0, 24},
+ { 0, 24},
+ { -1, 23},
+ { 0, 24},
+ { 0, 24},
+ { -1, 24},
+ { -1, 24},
+ { -2, 24},
+ { -2, 24},
+ { -3, 24},
+ { -3, 24},
+ { -4, 24},
+ { -4, 24},
+ { -5, 24},
+ { -5, 23},
+ { -5, 23},
+ { -6, 23},
+ { -6, 23},
+ { -7, 23},
+ { -7, 23},
+ { -7, 23},
+ { -8, 23},
+ { -8, 22},
+ { -9, 22},
+ { -9, 22},
+ {-10, 22},
+ {-10, 22},
+ {-10, 21},
+ {-11, 21},
+ {-11, 21},
+ {-11, 21},
+ {-11, 20},
+ {-12, 20},
+ {-12, 20},
+ {-13, 20},
+ {-13, 20},
+ {-13, 19},
+ {-14, 19},
+ {-14, 19},
+ {-14, 19},
+ {-14, 18},
+ {-15, 18},
+ {-15, 18},
+ {-15, 17},
+ {-16, 17},
+ {-16, 17},
+ {-17, 17},
+ {-17, 16},
+ {-17, 16},
+ {-18, 16},
+ {-17, 15},
+ {-18, 15},
+ {-18, 15},
+ {-19, 15},
+ {-19, 14},
+ {-19, 14},
+ {-19, 13},
+ {-19, 13},
+ {-20, 13},
+ {-20, 12},
+ {-20, 12},
+ {-21, 12},
+ {-21, 12},
+ {-21, 11},
+ {-21, 11},
+ {-21, 10},
+ {-21, 10},
+ {-21, 9},
+ {-22, 9},
+ {-22, 9},
+ {-22, 8},
+ {-22, 8},
+ {-22, 7},
+ {-23, 7},
+ {-23, 7},
+ {-23, 6},
+ {-23, 6},
+ {-23, 5},
+ {-24, 5},
+ {-23, 4},
+ {-23, 4},
+ {-24, 4},
+ {-24, 4},
+ {-24, 3},
+ {-24, 3},
+ {-24, 2},
+ {-24, 2},
+ {-24, 1},
+ {-24, 1},
+ {-24, 1},
+ {-24, 0},
+ {-25, 0},
+ {-24, -1},
+ {-25, -1},
+ {-24, -1},
+ {-24, -2},
+ {-24, -2},
+ {-24, -3},
+ {-24, -3},
+ {-24, -4},
+ {-24, -4},
+ {-24, -4},
+ {-24, -5},
+ {-24, -5},
+ {-24, -6},
+ {-24, -6},
+ {-23, -6},
+ {-23, -7},
+ {-23, -7},
+ {-23, -8},
+ {-23, -8},
+ {-23, -9},
+ {-23, -9},
+ {-22, -9},
+ {-22, -9},
+ {-22, -10},
+ {-22, -10},
+ {-21, -10},
+ {-21, -11},
+ {-22, -11},
+ {-22, -12},
+ {-21, -12},
+ {-21, -13},
+ {-21, -13},
+ {-20, -13},
+ {-21, -14},
+ {-20, -14},
+ {-20, -14},
+ {-19, -14},
+ {-19, -15},
+ {-19, -15},
+ {-18, -16},
+ {-18, -16},
+ {-18, -16},
+ {-18, -17},
+ {-18, -17},
+ {-17, -17},
+ {-17, -18},
+ {-17, -18},
+ {-16, -18},
+ {-16, -18},
+ {-16, -19},
+ {-16, -19},
+ {-15, -19},
+ {-15, -19},
+ {-15, -20},
+ {-14, -20},
+ {-14, -20},
+ {-14, -21},
+ {-13, -21},
+ {-13, -21},
+ {-13, -21},
+ {-12, -21},
+ {-12, -22},
+ {-11, -22},
+ {-11, -22},
+ {-11, -22},
+ {-10, -22},
+ {-10, -22},
+ { -9, -22},
+ { -9, -23},
+ { -9, -23},
+ { -8, -23},
+ { -8, -23},
+ { -7, -23},
+ { -7, -23},
+ { -7, -24},
+ { -6, -24},
+ { -6, -24},
+ { -5, -24},
+ { -5, -24},
+ { -4, -24},
+ { -4, -24},
+ { -4, -24},
+ { -4, -25},
+ { -3, -25},
+ { -2, -25},
+ { -2, -24},
+ { -2, -24},
+ { -1, -25},
+ { -1, -25},
+ { 0, -25},
+};
+
+static void sub_810B05C(struct Sprite *sprite)
{
u16 angle;
s16 sin;
s16 cos;
u16 x;
u16 y;
-
- angle = gTasks[sprite->data0].data[TD_MHAND_ANGLE];
+
+ angle = gTasks[sprite->data0].tMinuteHandAngle;
sin = Sin2(angle) / 16;
cos = Cos2(angle) / 16;
SetOamMatrix(0, cos, sin, -sin, cos);
x = gClockHandCoords[angle][0];
y = gClockHandCoords[angle][1];
-
+
//Manual sign extension
- if(x > 0x80)
+ if (x > 0x80)
x |= 0xFF00;
- if(y > 0x80)
+ if (y > 0x80)
y |= 0xFF00;
-
+
sprite->pos2.x = x;
sprite->pos2.y = y;
}
-void sub_810B0F4(struct Sprite *sprite)
+static void sub_810B0F4(struct Sprite *sprite)
{
u16 angle;
s16 sin;
s16 cos;
u16 x;
u16 y;
-
- angle = gTasks[sprite->data0].data[TD_HHAND_ANGLE];
+
+ angle = gTasks[sprite->data0].tHourHandAngle;
sin = Sin2(angle) / 16;
cos = Cos2(angle) / 16;
SetOamMatrix(1, cos, sin, -sin, cos);
x = gClockHandCoords[angle][0];
y = gClockHandCoords[angle][1];
-
+
//Manual sign extension
- if(x > 0x80)
+ if (x > 0x80)
x |= 0xFF00;
- if(y > 0x80)
+ if (y > 0x80)
y |= 0xFF00;
-
+
sprite->pos2.x = x;
sprite->pos2.y = y;
}
-void sub_810B18C(struct Sprite *sprite)
+static void sub_810B18C(struct Sprite *sprite)
{
s16 sin;
s16 cos;
-
- if(gTasks[sprite->data0].data[TD_PERIOD] != AM)
+
+ if (gTasks[sprite->data0].tPeriod != PERIOD_AM)
{
- if((u16)(sprite->data1 - 60) <= 29)
+ if (sprite->data1 >= 60 && sprite->data1 < 90)
sprite->data1 += 5;
- if(sprite->data1 <= 59)
+ if (sprite->data1 < 60)
sprite->data1++;
}
else
{
- if((u16)(sprite->data1 - 46) <= 29)
+ if (sprite->data1 > 45 && sprite->data1 <= 75)
sprite->data1 -= 5;
- if(sprite->data1 > 75)
+ if (sprite->data1 > 75)
sprite->data1--;
}
cos = Cos2((u16)sprite->data1);
@@ -551,23 +1036,23 @@ void sub_810B18C(struct Sprite *sprite)
sprite->pos2.y = sin * 30 / 4096;
}
-void sub_810B230(struct Sprite *sprite)
+static void sub_810B230(struct Sprite *sprite)
{
s16 sin;
s16 cos;
-
- if(gTasks[sprite->data0].data[TD_PERIOD] != AM)
+
+ if (gTasks[sprite->data0].tPeriod != PERIOD_AM)
{
- if(sprite->data1 >= 105 && sprite->data1 < 135)
+ if (sprite->data1 >= 105 && sprite->data1 < 135)
sprite->data1 += 5;
- if(sprite->data1 < 105)
+ if (sprite->data1 < 105)
sprite->data1++;
}
else
{
- if(sprite->data1 > 90 && sprite->data1 <= 120)
+ if (sprite->data1 > 90 && sprite->data1 <= 120)
sprite->data1 -= 5;
- if(sprite->data1 > 120)
+ if (sprite->data1 > 120)
sprite->data1--;
}
cos = Cos2((u16)sprite->data1);
diff --git a/src/weather.c b/src/weather.c
index 520185441..5d9553836 100644
--- a/src/weather.c
+++ b/src/weather.c
@@ -1,53 +1,54 @@
#include "global.h"
#include "weather.h"
#include "asm.h"
-#include "task.h"
-#include "sprite.h"
#include "palette.h"
+#include "sprite.h"
+#include "task.h"
-struct Weather {
- u8 filler_000[0x200];
- u8 unknown_200[2][32];
- u8 filler_240[0x480];
- s8 unknown_6C0;
- s8 unknown_6C1;
- u8 unknown_6C2;
- u8 unknown_6C3;
- u16 unknown_6C4;
- u8 unknown_6C6;
- u8 unknown_6C7;
- u8 unknown_6C8;
- u8 unknown_6C9;
- u8 unknown_6CA;
- u8 unknown_6CB;
- u8 filler_6CC[2];
- u16 unknown_6CE;
- u8 unknown_6D0;
- u8 unknown_6D1;
- u8 filler_6D2[1];
- u8 unknown_6D3;
- u8 unknown_6D4;
- u8 unknown_6D5;
- u8 filler_6D6[2];
- u8 unknown_6D8;
- u8 filler_6D9[1];
- u8 unknown_6DA;
- u8 filler_6DB[3];
- u8 unknown_6DE;
- u8 filler_6DF[5];
- u8 unknown_6E4;
- u8 filler_6E5[0x15];
- u8 unknown_6FA;
- u8 unknown_6FB;
- u8 filler_6FC[4];
- u8 unknown_700;
- u8 filler_701[0x15];
- u8 unknown_716;
- u8 unknown_717;
- u8 filler_718[0xc];
- u8 unknown_724;
- u8 filler_725[9];
- u8 unknown_72E;
+struct Weather
+{
+ u8 filler_000[0x200];
+ u8 unknown_200[2][32];
+ u8 filler_240[0x480];
+ s8 unknown_6C0;
+ s8 unknown_6C1;
+ u8 unknown_6C2;
+ u8 unknown_6C3;
+ u16 unknown_6C4;
+ u8 unknown_6C6;
+ u8 unknown_6C7;
+ u8 unknown_6C8;
+ u8 unknown_6C9;
+ u8 unknown_6CA;
+ u8 unknown_6CB;
+ u8 filler_6CC[2];
+ u16 unknown_6CE;
+ u8 unknown_6D0;
+ u8 unknown_6D1;
+ u8 filler_6D2[1];
+ u8 unknown_6D3;
+ u8 unknown_6D4;
+ u8 unknown_6D5;
+ u8 filler_6D6[2];
+ u8 unknown_6D8;
+ u8 filler_6D9[1];
+ u8 unknown_6DA;
+ u8 filler_6DB[3];
+ u8 unknown_6DE;
+ u8 filler_6DF[5];
+ u8 unknown_6E4;
+ u8 filler_6E5[0x15];
+ u8 unknown_6FA;
+ u8 unknown_6FB;
+ u8 filler_6FC[4];
+ u8 unknown_700;
+ u8 filler_701[0x15];
+ u8 unknown_716;
+ u8 unknown_717;
+ u8 filler_718[0xc];
+ u8 unknown_724;
+ u8 filler_725[9];
+ u8 unknown_72E;
};
#define gWeather gUnknown_0202F7E8
@@ -61,247 +62,307 @@ extern u8 (*gUnknown_0202FC48)[32];
extern u8 gUnknown_0202F9E8[32];
-void sub_807C828(void) {
- u8 index;
- if (!FuncIsActiveTask(&sub_807CA34)) {
- index = AllocSpritePalette(0x1200);
- CpuCopy32(&gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
- sub_807CB10();
- gWeather.unknown_6D5 = index;
- gWeather.unknown_6D4 = AllocSpritePalette(0x1201);
- gWeather.unknown_6DA = 0;
- gWeather.unknown_6D8 = 0;
- gWeather.unknown_6DE = 0;
- gWeather.unknown_6E4 = 0;
- gWeather.unknown_700 = 0;
- gWeather.unknown_6FB = 0;
- gWeather.unknown_724 = 0;
- gWeather.unknown_716 = 0;
- gWeather.unknown_717 = 0;
- gWeather.unknown_72E = 0;
- gWeather.unknown_6FA = 0;
- sub_807DB64(16, 0);
- gWeather.unknown_6D0 = 0;
- gWeather.unknown_6C6 = 3;
- gWeather.unknown_6C8 = 0;
- gWeather.unknown_6D3 = 1;
- gWeather.unknown_6C9 = CreateTask(&sub_807C9E4, 80);
- }
+void sub_807C828(void)
+{
+ u8 index;
+ if (!FuncIsActiveTask(&sub_807CA34))
+ {
+ index = AllocSpritePalette(0x1200);
+ CpuCopy32(&gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32);
+ sub_807CB10();
+ gWeather.unknown_6D5 = index;
+ gWeather.unknown_6D4 = AllocSpritePalette(0x1201);
+ gWeather.unknown_6DA = 0;
+ gWeather.unknown_6D8 = 0;
+ gWeather.unknown_6DE = 0;
+ gWeather.unknown_6E4 = 0;
+ gWeather.unknown_700 = 0;
+ gWeather.unknown_6FB = 0;
+ gWeather.unknown_724 = 0;
+ gWeather.unknown_716 = 0;
+ gWeather.unknown_717 = 0;
+ gWeather.unknown_72E = 0;
+ gWeather.unknown_6FA = 0;
+ sub_807DB64(16, 0);
+ gWeather.unknown_6D0 = 0;
+ gWeather.unknown_6C6 = 3;
+ gWeather.unknown_6C8 = 0;
+ gWeather.unknown_6D3 = 1;
+ gWeather.unknown_6C9 = CreateTask(&sub_807C9E4, 80);
+ }
}
-void DoWeatherEffect(u8 effect) {
- if (effect != 3 && effect != 5 && effect != 13) {
- PlayRainSoundEffect();
- }
- if (gWeather.unknown_6D1 != effect && gWeather.unknown_6D0 == effect) {
- gUnknown_08396FC8[effect][0]();
- }
- gWeather.unknown_6D3 = 0;
- gWeather.unknown_6D1 = effect;
- gWeather.unknown_6CE = 0;
+void DoWeatherEffect(u8 effect)
+{
+ if (effect != 3 && effect != 5 && effect != 13)
+ {
+ PlayRainSoundEffect();
+ }
+ if (gWeather.unknown_6D1 != effect && gWeather.unknown_6D0 == effect)
+ {
+ gUnknown_08396FC8[effect][0]();
+ }
+ gWeather.unknown_6D3 = 0;
+ gWeather.unknown_6D1 = effect;
+ gWeather.unknown_6CE = 0;
}
-void sub_807C988(u8 effect) {
- PlayRainSoundEffect();
- gWeather.unknown_6D0 = effect;
- gWeather.unknown_6D1 = effect;
+void sub_807C988(u8 effect)
+{
+ PlayRainSoundEffect();
+ gWeather.unknown_6D0 = effect;
+ gWeather.unknown_6D1 = effect;
}
-void sub_807C9B4(u8 effect) {
- PlayRainSoundEffect();
- gWeather.unknown_6D0 = effect;
- gWeather.unknown_6D1 = effect;
- gWeather.unknown_6C8 = 1;
+void sub_807C9B4(u8 effect)
+{
+ PlayRainSoundEffect();
+ gWeather.unknown_6D0 = effect;
+ gWeather.unknown_6D1 = effect;
+ gWeather.unknown_6C8 = 1;
}
-void sub_807C9E4(u8 task) {
- if (gWeather.unknown_6C8) {
- gUnknown_08396FC8[gWeather.unknown_6D0][2]();
- gTasks[task].func = &sub_807CA34;
- }
+void sub_807C9E4(u8 task)
+{
+ if (gWeather.unknown_6C8)
+ {
+ gUnknown_08396FC8[gWeather.unknown_6D0][2]();
+ gTasks[task].func = &sub_807CA34;
+ }
}
-void sub_807CA34(u8 task) {
- u8 v1;
- if (gWeather.unknown_6D0 != gWeather.unknown_6D1) {
- v1 = gUnknown_08396FC8[gWeather.unknown_6D0][3]();
- if (!v1) {
- gUnknown_08396FC8[gWeather.unknown_6D1][0]();
- gWeather.unknown_6C3 = 0; // compiler reuses v1
- gWeather.unknown_6C6 = 0; // compiler reuses v1
- gWeather.unknown_6D0 = gWeather.unknown_6D1;
- gWeather.unknown_6D3 = 1;
- }
- } else {
- gUnknown_08396FC8[gWeather.unknown_6D0][1]();
- }
- gUnknown_083970B8[gWeather.unknown_6C6]();
+void sub_807CA34(u8 task)
+{
+ u8 v1;
+ if (gWeather.unknown_6D0 != gWeather.unknown_6D1)
+ {
+ v1 = gUnknown_08396FC8[gWeather.unknown_6D0][3]();
+ if (!v1)
+ {
+ gUnknown_08396FC8[gWeather.unknown_6D1][0]();
+ gWeather.unknown_6C3 = 0; // compiler reuses v1
+ gWeather.unknown_6C6 = 0; // compiler reuses v1
+ gWeather.unknown_6D0 = gWeather.unknown_6D1;
+ gWeather.unknown_6D3 = 1;
+ }
+ }
+ else
+ {
+ gUnknown_08396FC8[gWeather.unknown_6D0][1]();
+ }
+ gUnknown_083970B8[gWeather.unknown_6C6]();
}
-void sub_807CAE8(void) {
- gWeather.unknown_6C1 = 0;
- gWeather.unknown_6C2 = 0;
+void sub_807CAE8(void)
+{
+ gWeather.unknown_6C1 = 0;
+ gWeather.unknown_6C2 = 0;
}
-void nullsub_38(void) {
+void nullsub_38(void)
+{
}
-u32 sub_807CB0C(void) {
- return 0;
+u32 sub_807CB0C(void)
+{
+ return 0;
}
-void sub_807CB10(void) {
- u16 v0;
- u8 (*v1)[32];
- u16 v2;
- u16 v4;
- u16 v5;
- u16 v6;
- u16 v9;
- u32 v10;
- u16 v11;
- s16 dunno;
+void sub_807CB10(void)
+{
+ u16 v0;
+ u8(*v1)[32];
+ u16 v2;
+ u16 v4;
+ u16 v5;
+ u16 v6;
+ u16 v9;
+ u32 v10;
+ u16 v11;
+ s16 dunno;
- gUnknown_030006DC = &gUnknown_083970C8;
- for (v0 = 0; v0 <= 1; v0++) {
- if (v0 == 0) {
- v1 = &gUnknown_0202F9E8;
- } else {
- v1 = &gUnknown_0202F9E8 + 19;
- }
- for (v2 = 0; (u16)v2 <= 0x1f; v2++) {
- v4 = v2 << 8;
- if (v0 == 0) {
- v5 = (v2 << 8) / 16;
- } else {
- v5 = 0;
- }
- v6 = 0;
- for (; v6 <= 2; v6++) {
- v4 = (v4 - v5);
- v1[v6][v2] = v4 >> 8;
- }
- v9 = v4;
- v10 = 0x1f00 - v4;
- if ((0x1f00 - v4) < 0) {
- v10 += 0xf;
- }
- v11 = v10 >> 4;
- if (v2 <= 0xb) {
- for (; v6 <= 0x12; v6++) {
- v4 += v11;
- dunno = v4 - v9;
- if (dunno > 0) {
- v4 -= (dunno + ((u16)dunno >> 15)) >> 1;
- }
- v1[v6][v2] = v4 >> 8;
- if (v1[v6][v2] > 0x1f) {
- v1[v6][v2] = 0x1f;
- }
- }
- } else {
- for (; v6 <= 0x12; v6++) {
- v4 += v11;
- v1[v6][v2] = v4 >> 8;
- if (v1[v6][v2] > 0x1f) {
- v1[v6][v2] = 0x1f;
- }
- }
- }
- }
- }
+ gUnknown_030006DC = &gUnknown_083970C8;
+ for (v0 = 0; v0 <= 1; v0++)
+ {
+ if (v0 == 0)
+ {
+ v1 = &gUnknown_0202F9E8;
+ }
+ else
+ {
+ v1 = &gUnknown_0202F9E8 + 19;
+ }
+ for (v2 = 0; (u16)v2 <= 0x1f; v2++)
+ {
+ v4 = v2 << 8;
+ if (v0 == 0)
+ {
+ v5 = (v2 << 8) / 16;
+ }
+ else
+ {
+ v5 = 0;
+ }
+ v6 = 0;
+ for (; v6 <= 2; v6++)
+ {
+ v4 = (v4 - v5);
+ v1[v6][v2] = v4 >> 8;
+ }
+ v9 = v4;
+ v10 = 0x1f00 - v4;
+ if ((0x1f00 - v4) < 0)
+ {
+ v10 += 0xf;
+ }
+ v11 = v10 >> 4;
+ if (v2 <= 0xb)
+ {
+ for (; v6 <= 0x12; v6++)
+ {
+ v4 += v11;
+ dunno = v4 - v9;
+ if (dunno > 0)
+ {
+ v4 -= (dunno + ((u16)dunno >> 15)) >> 1;
+ }
+ v1[v6][v2] = v4 >> 8;
+ if (v1[v6][v2] > 0x1f)
+ {
+ v1[v6][v2] = 0x1f;
+ }
+ }
+ }
+ else
+ {
+ for (; v6 <= 0x12; v6++)
+ {
+ v4 += v11;
+ v1[v6][v2] = v4 >> 8;
+ if (v1[v6][v2] > 0x1f)
+ {
+ v1[v6][v2] = 0x1f;
+ }
+ }
+ }
+ }
+ }
}
-void sub_807CC24(void) {
- if (gWeather.unknown_6C0 == gWeather.unknown_6C1) {
- gWeather.unknown_6C6 = 3;
- } else {
- if (++gWeather.unknown_6C3 >= gWeather.unknown_6C2) {
- gWeather.unknown_6C3 = 0;
- if (gWeather.unknown_6C0 < gWeather.unknown_6C1) {
- gWeather.unknown_6C0++;
- } else {
- gWeather.unknown_6C0--;
- }
- sub_807CEBC(0, 0x20, gWeather.unknown_6C0);
- }
- }
+void sub_807CC24(void)
+{
+ if (gWeather.unknown_6C0 == gWeather.unknown_6C1)
+ {
+ gWeather.unknown_6C6 = 3;
+ }
+ else
+ {
+ if (++gWeather.unknown_6C3 >= gWeather.unknown_6C2)
+ {
+ gWeather.unknown_6C3 = 0;
+ if (gWeather.unknown_6C0 < gWeather.unknown_6C1)
+ {
+ gWeather.unknown_6C0++;
+ }
+ else
+ {
+ gWeather.unknown_6C0--;
+ }
+ sub_807CEBC(0, 0x20, gWeather.unknown_6C0);
+ }
+ }
}
-void sub_807CCAC(void) {
- if (++gWeather.unknown_6CB > 1) {
- gWeather.unknown_6CA = 0;
- }
- switch (gWeather.unknown_6D0) {
- case 3:
- case 4:
- case 5:
- case 11:
- case 13:
- if (sub_807CDC4() == 0) {
- gWeather.unknown_6C0 = 3;
- gWeather.unknown_6C6 = 3;
- }
- break;
- case 12:
- if (sub_807CE24() == 0) {
- gWeather.unknown_6C0 = -6;
- gWeather.unknown_6C6 = 3;
- }
- break;
- case 6:
- if (sub_807CE7C() == 0) {
- gWeather.unknown_6C0 = 0;
- gWeather.unknown_6C6 = 3;
- }
- break;
- case 7:
- case 8:
- case 9:
- case 10:
- default:
- if (!gPaletteFade.active) {
- gWeather.unknown_6C0 = gWeather.unknown_6C1;
- gWeather.unknown_6C6 = 3;
- }
- break;
- }
+void sub_807CCAC(void)
+{
+ if (++gWeather.unknown_6CB > 1)
+ {
+ gWeather.unknown_6CA = 0;
+ }
+ switch (gWeather.unknown_6D0)
+ {
+ case 3:
+ case 4:
+ case 5:
+ case 11:
+ case 13:
+ if (sub_807CDC4() == 0)
+ {
+ gWeather.unknown_6C0 = 3;
+ gWeather.unknown_6C6 = 3;
+ }
+ break;
+ case 12:
+ if (sub_807CE24() == 0)
+ {
+ gWeather.unknown_6C0 = -6;
+ gWeather.unknown_6C6 = 3;
+ }
+ break;
+ case 6:
+ if (sub_807CE7C() == 0)
+ {
+ gWeather.unknown_6C0 = 0;
+ gWeather.unknown_6C6 = 3;
+ }
+ break;
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ default:
+ if (!gPaletteFade.active)
+ {
+ gWeather.unknown_6C0 = gWeather.unknown_6C1;
+ gWeather.unknown_6C6 = 3;
+ }
+ break;
+ }
}
-u8 sub_807CDC4(void) {
- if (gWeather.unknown_6C7 == 0x10) {
- return 0;
- }
- if (++gWeather.unknown_6C7 >= 0x10) {
- sub_807CEBC(0, 0x20, 3);
- gWeather.unknown_6C7 = 0x10;
- return 0;
- }
- sub_807D1BC(0, 0x20, 3, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
- return 1;
+u8 sub_807CDC4(void)
+{
+ if (gWeather.unknown_6C7 == 0x10)
+ {
+ return 0;
+ }
+ if (++gWeather.unknown_6C7 >= 0x10)
+ {
+ sub_807CEBC(0, 0x20, 3);
+ gWeather.unknown_6C7 = 0x10;
+ return 0;
+ }
+ sub_807D1BC(0, 0x20, 3, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
+ return 1;
}
-u8 sub_807CE24(void) {
- if (gWeather.unknown_6C7 == 0x10) {
- return 0;
- }
- if (++gWeather.unknown_6C7 >= 0x10) {
- sub_807CEBC(0, 0x20, -6);
- gWeather.unknown_6C7 = 0x10;
- return 0;
- }
- sub_807D304(-6, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
- return 1;
+u8 sub_807CE24(void)
+{
+ if (gWeather.unknown_6C7 == 0x10)
+ {
+ return 0;
+ }
+ if (++gWeather.unknown_6C7 >= 0x10)
+ {
+ sub_807CEBC(0, 0x20, -6);
+ gWeather.unknown_6C7 = 0x10;
+ return 0;
+ }
+ sub_807D304(-6, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
+ return 1;
}
-u8 sub_807CE7C(void) {
- if (gWeather.unknown_6C7 == 0x10) {
- return 0;
- }
- ++gWeather.unknown_6C7;
- sub_807D424(0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
- return 1;
+u8 sub_807CE7C(void)
+{
+ if (gWeather.unknown_6C7 == 0x10)
+ {
+ return 0;
+ }
+ ++gWeather.unknown_6C7;
+ sub_807D424(0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4);
+ return 1;
}
-void nullsub_39(void) {
+void nullsub_39(void)
+{
}
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index 8e983c300..408dc69ce 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -1,15 +1,16 @@
#include "global.h"
#include "wild_encounter.h"
+#include "abilities.h"
#include "asm.h"
-#include "field_player_avatar.h"
-#include "safari_zone.h"
#include "battle_setup.h"
-#include "abilities.h"
-#include "rng.h"
-#include "script.h"
#include "event_data.h"
-#include "rom4.h"
+#include "field_player_avatar.h"
#include "metatile_behavior.h"
+#include "rng.h"
+#include "rom4.h"
+#include "safari_zone.h"
+#include "script.h"
+#include "species.h"
struct WildPokemon
{
@@ -21,7 +22,7 @@ struct WildPokemon
struct WildPokemonInfo
{
u8 encounterRate;
- struct WildPokemon *wildPokemon;
+ const struct WildPokemon *wildPokemon;
};
struct WildPokemonHeader
@@ -34,6 +35,2890 @@ struct WildPokemonHeader
struct WildPokemonInfo *fishingMonsInfo;
};
+
+const struct WildPokemon PetalburgCity_WaterMons [] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+};
+const struct WildPokemonInfo PetalburgCity_WaterMonsInfo = {1, PetalburgCity_WaterMons};
+
+const struct WildPokemon PetalburgCity_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_CORPHISH},
+ {25, 30, SPECIES_CORPHISH},
+ {30, 35, SPECIES_CORPHISH},
+ {20, 25, SPECIES_CORPHISH},
+ {35, 40, SPECIES_CORPHISH},
+ {40, 45, SPECIES_CORPHISH},
+};
+const struct WildPokemonInfo PetalburgCity_FishingMonsInfo = {10, PetalburgCity_FishingMons};
+
+const struct WildPokemon SlateportCity_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo SlateportCity_WaterMonsInfo = {4, SlateportCity_WaterMons};
+
+const struct WildPokemon SlateportCity_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo SlateportCity_FishingMonsInfo = {10, SlateportCity_FishingMons};
+
+const struct WildPokemon LilycoveCity_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo LilycoveCity_WaterMonsInfo = {4, LilycoveCity_WaterMons};
+
+const struct WildPokemon LilycoveCity_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_STARYU},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo LilycoveCity_FishingMonsInfo = {10, LilycoveCity_FishingMons};
+
+const struct WildPokemon MossdeepCity_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo MossdeepCity_WaterMonsInfo = {4, MossdeepCity_WaterMons};
+
+const struct WildPokemon MossdeepCity_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo MossdeepCity_FishingMonsInfo = {10, MossdeepCity_FishingMons};
+
+const struct WildPokemon SootopolisCity_WaterMons [] =
+{
+ {5, 35, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_MAGIKARP},
+ {15, 25, SPECIES_MAGIKARP},
+ {25, 30, SPECIES_MAGIKARP},
+ {25, 30, SPECIES_MAGIKARP},
+};
+const struct WildPokemonInfo SootopolisCity_WaterMonsInfo = {1, SootopolisCity_WaterMons};
+
+const struct WildPokemon SootopolisCity_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+#ifdef SAPPHIRE
+ {5, 10, SPECIES_TENTACOOL},
+#else
+ {10, 15, SPECIES_MAGIKARP},
+#endif
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_MAGIKARP},
+ {30, 35, SPECIES_MAGIKARP},
+ {30, 35, SPECIES_MAGIKARP},
+ {35, 40, SPECIES_GYARADOS},
+ {35, 45, SPECIES_GYARADOS},
+ {5, 45, SPECIES_GYARADOS},
+};
+const struct WildPokemonInfo SootopolisCity_FishingMonsInfo = {10, SootopolisCity_FishingMons};
+
+const struct WildPokemon EverGrandeCity_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo EverGrandeCity_WaterMonsInfo = {4, EverGrandeCity_WaterMons};
+
+const struct WildPokemon EverGrandeCity_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_LUVDISC},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_LUVDISC},
+ {30, 35, SPECIES_WAILMER},
+ {30, 35, SPECIES_CORSOLA},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo EverGrandeCity_FishingMonsInfo = {10, EverGrandeCity_FishingMons};
+
+const struct WildPokemon MeteorFalls_1F_1R_LandMons [] =
+{
+ {16, 16, SPECIES_ZUBAT},
+ {17, 17, SPECIES_ZUBAT},
+ {18, 18, SPECIES_ZUBAT},
+ {15, 15, SPECIES_ZUBAT},
+ {14, 14, SPECIES_ZUBAT},
+#ifdef SAPPHIRE
+ {16, 16, SPECIES_LUNATONE},
+ {18, 18, SPECIES_LUNATONE},
+ {14, 14, SPECIES_LUNATONE},
+#else
+ {16, 16, SPECIES_SOLROCK},
+ {18, 18, SPECIES_SOLROCK},
+ {14, 14, SPECIES_SOLROCK},
+#endif
+ {19, 19, SPECIES_ZUBAT},
+ {20, 20, SPECIES_ZUBAT},
+ {19, 19, SPECIES_ZUBAT},
+ {20, 20, SPECIES_ZUBAT},
+};
+const struct WildPokemonInfo MeteorFalls_1F_1R_LandMonsInfo = {10, MeteorFalls_1F_1R_LandMons};
+
+const struct WildPokemon MeteorFalls_1F_1R_WaterMons [] =
+{
+ {5, 35, SPECIES_ZUBAT},
+ {30, 35, SPECIES_ZUBAT},
+#ifdef SAPPHIRE
+ {25, 35, SPECIES_LUNATONE},
+ {15, 25, SPECIES_LUNATONE},
+ {5, 15, SPECIES_LUNATONE},
+#else
+ {25, 35, SPECIES_SOLROCK},
+ {15, 25, SPECIES_SOLROCK},
+ {5, 15, SPECIES_SOLROCK},
+#endif
+};
+const struct WildPokemonInfo MeteorFalls_1F_1R_WaterMonsInfo = {4, MeteorFalls_1F_1R_WaterMons};
+
+const struct WildPokemon MeteorFalls_1F_1R_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_BARBOACH},
+ {25, 30, SPECIES_BARBOACH},
+ {30, 35, SPECIES_BARBOACH},
+ {20, 25, SPECIES_BARBOACH},
+ {35, 40, SPECIES_BARBOACH},
+ {40, 45, SPECIES_BARBOACH},
+};
+const struct WildPokemonInfo MeteorFalls_1F_1R_FishingMonsInfo = {30, MeteorFalls_1F_1R_FishingMons};
+
+const struct WildPokemon MeteorFalls_1F_2R_LandMons [] =
+{
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {35, 35, SPECIES_LUNATONE},
+ {33, 33, SPECIES_LUNATONE},
+ {37, 37, SPECIES_LUNATONE},
+#else
+ {35, 35, SPECIES_SOLROCK},
+ {33, 33, SPECIES_SOLROCK},
+ {37, 37, SPECIES_SOLROCK},
+#endif
+ {35, 35, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {39, 39, SPECIES_LUNATONE},
+#else
+ {39, 39, SPECIES_SOLROCK},
+#endif
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo MeteorFalls_1F_2R_LandMonsInfo = {10, MeteorFalls_1F_2R_LandMons};
+
+const struct WildPokemon MeteorFalls_1F_2R_WaterMons [] =
+{
+ {30, 35, SPECIES_GOLBAT},
+ {30, 35, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {25, 35, SPECIES_LUNATONE},
+ {15, 25, SPECIES_LUNATONE},
+ {5, 15, SPECIES_LUNATONE},
+#else
+ {25, 35, SPECIES_SOLROCK},
+ {15, 25, SPECIES_SOLROCK},
+ {5, 15, SPECIES_SOLROCK},
+#endif
+};
+const struct WildPokemonInfo MeteorFalls_1F_2R_WaterMonsInfo = {4, MeteorFalls_1F_2R_WaterMons};
+
+const struct WildPokemon MeteorFalls_1F_2R_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_BARBOACH},
+ {25, 30, SPECIES_BARBOACH},
+ {30, 35, SPECIES_BARBOACH},
+ {30, 35, SPECIES_WHISCASH},
+ {35, 40, SPECIES_WHISCASH},
+ {40, 45, SPECIES_WHISCASH},
+};
+const struct WildPokemonInfo MeteorFalls_1F_2R_FishingMonsInfo = {30, MeteorFalls_1F_2R_FishingMons};
+
+const struct WildPokemon MeteorFalls_B1F_1R_LandMons [] =
+{
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {35, 35, SPECIES_LUNATONE},
+ {33, 33, SPECIES_LUNATONE},
+ {37, 37, SPECIES_LUNATONE},
+#else
+ {35, 35, SPECIES_SOLROCK},
+ {33, 33, SPECIES_SOLROCK},
+ {37, 37, SPECIES_SOLROCK},
+#endif
+ {35, 35, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {39, 39, SPECIES_LUNATONE},
+#else
+ {39, 39, SPECIES_SOLROCK},
+#endif
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo MeteorFalls_B1F_1R_LandMonsInfo = {10, MeteorFalls_B1F_1R_LandMons};
+
+const struct WildPokemon MeteorFalls_B1F_1R_WaterMons [] =
+{
+ {30, 35, SPECIES_GOLBAT},
+ {30, 35, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {25, 35, SPECIES_LUNATONE},
+ {15, 25, SPECIES_LUNATONE},
+ {5, 15, SPECIES_LUNATONE},
+#else
+ {25, 35, SPECIES_SOLROCK},
+ {15, 25, SPECIES_SOLROCK},
+ {5, 15, SPECIES_SOLROCK},
+#endif
+};
+const struct WildPokemonInfo MeteorFalls_B1F_1R_WaterMonsInfo = {4, MeteorFalls_B1F_1R_WaterMons};
+
+const struct WildPokemon MeteorFalls_B1F_1R_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_BARBOACH},
+ {25, 30, SPECIES_BARBOACH},
+ {30, 35, SPECIES_BARBOACH},
+ {30, 35, SPECIES_WHISCASH},
+ {35, 40, SPECIES_WHISCASH},
+ {40, 45, SPECIES_WHISCASH},
+};
+const struct WildPokemonInfo MeteorFalls_B1F_1R_FishingMonsInfo = {30, MeteorFalls_B1F_1R_FishingMons};
+
+const struct WildPokemon MeteorFalls_B1F_2R_LandMons [] =
+{
+ {33, 33, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {30, 30, SPECIES_BAGON},
+#ifdef SAPPHIRE
+ {35, 35, SPECIES_LUNATONE},
+#else
+ {35, 35, SPECIES_SOLROCK},
+#endif
+ {35, 35, SPECIES_BAGON},
+#ifdef SAPPHIRE
+ {37, 37, SPECIES_LUNATONE},
+#else
+ {37, 37, SPECIES_SOLROCK},
+#endif
+ {25, 25, SPECIES_BAGON},
+#ifdef SAPPHIRE
+ {39, 39, SPECIES_LUNATONE},
+#else
+ {39, 39, SPECIES_SOLROCK},
+#endif
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+ {38, 38, SPECIES_GOLBAT},
+ {40, 40, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo MeteorFalls_B1F_2R_LandMonsInfo = {10, MeteorFalls_B1F_2R_LandMons};
+
+const struct WildPokemon MeteorFalls_B1F_2R_WaterMons [] =
+{
+ {30, 35, SPECIES_GOLBAT},
+ {30, 35, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {25, 35, SPECIES_LUNATONE},
+ {15, 25, SPECIES_LUNATONE},
+ {5, 15, SPECIES_LUNATONE},
+#else
+ {25, 35, SPECIES_SOLROCK},
+ {15, 25, SPECIES_SOLROCK},
+ {5, 15, SPECIES_SOLROCK},
+#endif
+};
+const struct WildPokemonInfo MeteorFalls_B1F_2R_WaterMonsInfo = {4, MeteorFalls_B1F_2R_WaterMons};
+
+const struct WildPokemon MeteorFalls_B1F_2R_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_BARBOACH},
+ {25, 30, SPECIES_BARBOACH},
+ {30, 35, SPECIES_BARBOACH},
+ {30, 35, SPECIES_WHISCASH},
+ {35, 40, SPECIES_WHISCASH},
+ {40, 45, SPECIES_WHISCASH},
+};
+const struct WildPokemonInfo MeteorFalls_B1F_2R_FishingMonsInfo = {30, MeteorFalls_B1F_2R_FishingMons};
+
+const struct WildPokemon RusturfTunnel_LandMons [] =
+{
+ {6, 6, SPECIES_WHISMUR},
+ {7, 7, SPECIES_WHISMUR},
+ {6, 6, SPECIES_WHISMUR},
+ {6, 6, SPECIES_WHISMUR},
+ {7, 7, SPECIES_WHISMUR},
+ {7, 7, SPECIES_WHISMUR},
+ {5, 5, SPECIES_WHISMUR},
+ {8, 8, SPECIES_WHISMUR},
+ {5, 5, SPECIES_WHISMUR},
+ {8, 8, SPECIES_WHISMUR},
+ {5, 5, SPECIES_WHISMUR},
+ {8, 8, SPECIES_WHISMUR},
+};
+const struct WildPokemonInfo RusturfTunnel_LandMonsInfo = {10, RusturfTunnel_LandMons};
+
+const struct WildPokemon GraniteCave_1F_LandMons [] =
+{
+ {7, 7, SPECIES_ZUBAT},
+ {8, 8, SPECIES_MAKUHITA},
+ {7, 7, SPECIES_MAKUHITA},
+ {8, 8, SPECIES_ZUBAT},
+ {9, 9, SPECIES_MAKUHITA},
+ {8, 8, SPECIES_ABRA},
+ {10, 10, SPECIES_MAKUHITA},
+ {6, 6, SPECIES_MAKUHITA},
+ {7, 7, SPECIES_GEODUDE},
+ {8, 8, SPECIES_GEODUDE},
+ {6, 6, SPECIES_GEODUDE},
+ {9, 9, SPECIES_GEODUDE},
+};
+const struct WildPokemonInfo GraniteCave_1F_LandMonsInfo = {10, GraniteCave_1F_LandMons};
+
+const struct WildPokemon GraniteCave_B1F_LandMons [] =
+{
+ {9, 9, SPECIES_ZUBAT},
+ {10, 10, SPECIES_ARON},
+ {9, 9, SPECIES_ARON},
+ {11, 11, SPECIES_ARON},
+ {10, 10, SPECIES_ZUBAT},
+ {9, 9, SPECIES_ABRA},
+ {10, 10, SPECIES_MAKUHITA},
+ {11, 11, SPECIES_MAKUHITA},
+#ifdef SAPPHIRE
+ {10, 10, SPECIES_SABLEYE},
+ {10, 10, SPECIES_SABLEYE},
+ {9, 9, SPECIES_SABLEYE},
+ {11, 11, SPECIES_SABLEYE},
+#else
+ {10, 10, SPECIES_MAWILE},
+ {10, 10, SPECIES_MAWILE},
+ {9, 9, SPECIES_MAWILE},
+ {11, 11, SPECIES_MAWILE},
+#endif
+};
+const struct WildPokemonInfo GraniteCave_B1F_LandMonsInfo = {10, GraniteCave_B1F_LandMons};
+
+const struct WildPokemon GraniteCave_B2F_LandMons [] =
+{
+ {10, 10, SPECIES_ZUBAT},
+ {11, 11, SPECIES_ARON},
+ {10, 10, SPECIES_ARON},
+ {11, 11, SPECIES_ZUBAT},
+ {12, 12, SPECIES_ARON},
+ {10, 10, SPECIES_ABRA},
+#ifdef SAPPHIRE
+ {10, 10, SPECIES_SABLEYE},
+ {11, 11, SPECIES_SABLEYE},
+ {12, 12, SPECIES_SABLEYE},
+ {10, 10, SPECIES_SABLEYE},
+ {12, 12, SPECIES_SABLEYE},
+ {10, 10, SPECIES_SABLEYE},
+#else
+ {10, 10, SPECIES_MAWILE},
+ {11, 11, SPECIES_MAWILE},
+ {12, 12, SPECIES_MAWILE},
+ {10, 10, SPECIES_MAWILE},
+ {12, 12, SPECIES_MAWILE},
+ {10, 10, SPECIES_MAWILE},
+#endif
+};
+const struct WildPokemonInfo GraniteCave_B2F_LandMonsInfo = {10, GraniteCave_B2F_LandMons};
+
+const struct WildPokemon GraniteCave_B2F_RockSmashMons [] =
+{
+ {10, 15, SPECIES_GEODUDE},
+ {10, 20, SPECIES_NOSEPASS},
+ {5, 10, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+};
+const struct WildPokemonInfo GraniteCave_B2F_RockSmashMonsInfo = {20, GraniteCave_B2F_RockSmashMons};
+
+const struct WildPokemon GraniteCave_StevensRoom_LandMons [] =
+{
+ {7, 7, SPECIES_ZUBAT},
+ {8, 8, SPECIES_MAKUHITA},
+ {7, 7, SPECIES_MAKUHITA},
+ {8, 8, SPECIES_ZUBAT},
+ {9, 9, SPECIES_MAKUHITA},
+ {8, 8, SPECIES_ABRA},
+ {10, 10, SPECIES_MAKUHITA},
+ {6, 6, SPECIES_MAKUHITA},
+ {7, 7, SPECIES_ARON},
+ {8, 8, SPECIES_ARON},
+ {7, 7, SPECIES_ARON},
+ {8, 8, SPECIES_ARON},
+};
+const struct WildPokemonInfo GraniteCave_StevensRoom_LandMonsInfo = {10, GraniteCave_StevensRoom_LandMons};
+
+const struct WildPokemon PetalburgWoods_LandMons [] =
+{
+ {5, 5, SPECIES_ZIGZAGOON},
+ {5, 5, SPECIES_WURMPLE},
+ {5, 5, SPECIES_SHROOMISH},
+ {6, 6, SPECIES_ZIGZAGOON},
+ {5, 5, SPECIES_SILCOON},
+ {5, 5, SPECIES_CASCOON},
+ {6, 6, SPECIES_WURMPLE},
+ {6, 6, SPECIES_SHROOMISH},
+ {5, 5, SPECIES_TAILLOW},
+ {5, 5, SPECIES_SLAKOTH},
+ {6, 6, SPECIES_TAILLOW},
+ {6, 6, SPECIES_SLAKOTH},
+};
+const struct WildPokemonInfo PetalburgWoods_LandMonsInfo = {20, PetalburgWoods_LandMons};
+
+//Jagged Pass Pokemon are 2 levels higher on Sapphire
+#ifdef SAPPHIRE
+#define JAGGED_PASS_LEVEL_DIFF 2
+#else
+#define JAGGED_PASS_LEVEL_DIFF 0
+#endif
+
+const struct WildPokemon JaggedPass_LandMons [] =
+{
+ {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL},
+ {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL},
+ {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP},
+ {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL},
+ {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK},
+ {18 + JAGGED_PASS_LEVEL_DIFF, 18 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP},
+ {19 + JAGGED_PASS_LEVEL_DIFF, 19 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK},
+ {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_MACHOP},
+ {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL},
+ {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK},
+ {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_NUMEL},
+ {20 + JAGGED_PASS_LEVEL_DIFF, 20 + JAGGED_PASS_LEVEL_DIFF, SPECIES_SPOINK},
+};
+const struct WildPokemonInfo JaggedPass_LandMonsInfo = {20, JaggedPass_LandMons};
+
+const struct WildPokemon FieryPath_LandMons [] =
+{
+ {15, 15, SPECIES_NUMEL},
+#ifdef SAPPHIRE
+ {15, 15, SPECIES_GRIMER},
+#else
+ {15, 15, SPECIES_KOFFING},
+#endif
+ {16, 16, SPECIES_NUMEL},
+ {15, 15, SPECIES_MACHOP},
+ {15, 15, SPECIES_TORKOAL},
+ {15, 15, SPECIES_SLUGMA},
+#ifdef SAPPHIRE
+ {16, 16, SPECIES_GRIMER},
+#else
+ {16, 16, SPECIES_KOFFING},
+#endif
+ {16, 16, SPECIES_MACHOP},
+ {14, 14, SPECIES_TORKOAL},
+ {16, 16, SPECIES_TORKOAL},
+#ifdef SAPPHIRE
+ {14, 14, SPECIES_KOFFING},
+ {14, 14, SPECIES_KOFFING},
+#else
+ {14, 14, SPECIES_GRIMER},
+ {14, 14, SPECIES_GRIMER},
+#endif
+};
+const struct WildPokemonInfo FieryPath_LandMonsInfo = {10, FieryPath_LandMons};
+
+const struct WildPokemon MtPyre_1F_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {27, 27, SPECIES_SHUPPET},
+ {28, 28, SPECIES_SHUPPET},
+ {26, 26, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {23, 23, SPECIES_SHUPPET},
+ {22, 22, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+#else
+ {27, 27, SPECIES_DUSKULL},
+ {28, 28, SPECIES_DUSKULL},
+ {26, 26, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {23, 23, SPECIES_DUSKULL},
+ {22, 22, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+#endif
+};
+const struct WildPokemonInfo MtPyre_1F_LandMonsInfo = {10, MtPyre_1F_LandMons};
+
+const struct WildPokemon MtPyre_2F_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {27, 27, SPECIES_SHUPPET},
+ {28, 28, SPECIES_SHUPPET},
+ {26, 26, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {23, 23, SPECIES_SHUPPET},
+ {22, 22, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+#else
+ {27, 27, SPECIES_DUSKULL},
+ {28, 28, SPECIES_DUSKULL},
+ {26, 26, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {23, 23, SPECIES_DUSKULL},
+ {22, 22, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+#endif
+};
+const struct WildPokemonInfo MtPyre_2F_LandMonsInfo = {10, MtPyre_2F_LandMons};
+
+const struct WildPokemon MtPyre_3F_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {27, 27, SPECIES_SHUPPET},
+ {28, 28, SPECIES_SHUPPET},
+ {26, 26, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {23, 23, SPECIES_SHUPPET},
+ {22, 22, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+#else
+ {27, 27, SPECIES_DUSKULL},
+ {28, 28, SPECIES_DUSKULL},
+ {26, 26, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {23, 23, SPECIES_DUSKULL},
+ {22, 22, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+#endif
+};
+const struct WildPokemonInfo MtPyre_3F_LandMonsInfo = {10, MtPyre_3F_LandMons};
+
+const struct WildPokemon MtPyre_4F_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {27, 27, SPECIES_SHUPPET},
+ {28, 28, SPECIES_SHUPPET},
+ {26, 26, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {23, 23, SPECIES_SHUPPET},
+ {22, 22, SPECIES_SHUPPET},
+ {27, 27, SPECIES_DUSKULL},
+ {27, 27, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+#else
+ {27, 27, SPECIES_DUSKULL},
+ {28, 28, SPECIES_DUSKULL},
+ {26, 26, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {23, 23, SPECIES_DUSKULL},
+ {22, 22, SPECIES_DUSKULL},
+ {27, 27, SPECIES_SHUPPET},
+ {27, 27, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+#endif
+};
+const struct WildPokemonInfo MtPyre_4F_LandMonsInfo = {10, MtPyre_4F_LandMons};
+
+const struct WildPokemon MtPyre_5F_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {27, 27, SPECIES_SHUPPET},
+ {28, 28, SPECIES_SHUPPET},
+ {26, 26, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {23, 23, SPECIES_SHUPPET},
+ {22, 22, SPECIES_SHUPPET},
+ {27, 27, SPECIES_DUSKULL},
+ {27, 27, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+#else
+ {27, 27, SPECIES_DUSKULL},
+ {28, 28, SPECIES_DUSKULL},
+ {26, 26, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {23, 23, SPECIES_DUSKULL},
+ {22, 22, SPECIES_DUSKULL},
+ {27, 27, SPECIES_SHUPPET},
+ {27, 27, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+#endif
+};
+const struct WildPokemonInfo MtPyre_5F_LandMonsInfo = {10, MtPyre_5F_LandMons};
+
+const struct WildPokemon MtPyre_6F_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {27, 27, SPECIES_SHUPPET},
+ {28, 28, SPECIES_SHUPPET},
+ {26, 26, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {23, 23, SPECIES_SHUPPET},
+ {22, 22, SPECIES_SHUPPET},
+ {27, 27, SPECIES_DUSKULL},
+ {27, 27, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+#else
+ {27, 27, SPECIES_DUSKULL},
+ {28, 28, SPECIES_DUSKULL},
+ {26, 26, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {23, 23, SPECIES_DUSKULL},
+ {22, 22, SPECIES_DUSKULL},
+ {27, 27, SPECIES_SHUPPET},
+ {27, 27, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+#endif
+};
+const struct WildPokemonInfo MtPyre_6F_LandMonsInfo = {10, MtPyre_6F_LandMons};
+
+const struct WildPokemon MtPyre_Exterior_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {27, 27, SPECIES_SHUPPET},
+#else
+ {27, 27, SPECIES_DUSKULL},
+#endif
+ {27, 27, SPECIES_MEDITITE},
+#ifdef SAPPHIRE
+ {28, 28, SPECIES_SHUPPET},
+#else
+ {28, 28, SPECIES_DUSKULL},
+#endif
+ {29, 29, SPECIES_MEDITITE},
+#ifdef SAPPHIRE
+ {29, 29, SPECIES_SHUPPET},
+#else
+ {29, 29, SPECIES_DUSKULL},
+#endif
+ {27, 27, SPECIES_VULPIX},
+ {29, 29, SPECIES_VULPIX},
+ {25, 25, SPECIES_VULPIX},
+ {27, 27, SPECIES_WINGULL},
+ {27, 27, SPECIES_WINGULL},
+ {26, 26, SPECIES_WINGULL},
+ {28, 28, SPECIES_WINGULL},
+};
+const struct WildPokemonInfo MtPyre_Exterior_LandMonsInfo = {10, MtPyre_Exterior_LandMons};
+
+const struct WildPokemon MtPyre_Summit_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {28, 28, SPECIES_SHUPPET},
+ {29, 29, SPECIES_SHUPPET},
+ {27, 27, SPECIES_SHUPPET},
+ {26, 26, SPECIES_SHUPPET},
+ {30, 30, SPECIES_SHUPPET},
+ {25, 25, SPECIES_SHUPPET},
+ {24, 24, SPECIES_SHUPPET},
+ {28, 28, SPECIES_DUSKULL},
+ {26, 26, SPECIES_DUSKULL},
+ {30, 30, SPECIES_DUSKULL},
+#else
+ {28, 28, SPECIES_DUSKULL},
+ {29, 29, SPECIES_DUSKULL},
+ {27, 27, SPECIES_DUSKULL},
+ {26, 26, SPECIES_DUSKULL},
+ {30, 30, SPECIES_DUSKULL},
+ {25, 25, SPECIES_DUSKULL},
+ {24, 24, SPECIES_DUSKULL},
+ {28, 28, SPECIES_SHUPPET},
+ {26, 26, SPECIES_SHUPPET},
+ {30, 30, SPECIES_SHUPPET},
+#endif
+ {28, 28, SPECIES_CHIMECHO},
+ {28, 28, SPECIES_CHIMECHO},
+};
+const struct WildPokemonInfo MtPyre_Summit_LandMonsInfo = {10, MtPyre_Summit_LandMons};
+
+const struct WildPokemon SeafloorCavern_Entrance_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_ZUBAT},
+ {30, 35, SPECIES_ZUBAT},
+ {30, 35, SPECIES_GOLBAT},
+ {30, 35, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Entrance_WaterMonsInfo = {4, SeafloorCavern_Entrance_WaterMons};
+
+const struct WildPokemon SeafloorCavern_Entrance_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo SeafloorCavern_Entrance_FishingMonsInfo = {10, SeafloorCavern_Entrance_FishingMons};
+
+const struct WildPokemon SeafloorCavern_Room1_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {33, 33, SPECIES_ZUBAT},
+ {28, 28, SPECIES_ZUBAT},
+ {29, 29, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {35, 35, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room1_LandMonsInfo = {4, SeafloorCavern_Room1_LandMons};
+
+const struct WildPokemon SeafloorCavern_Room2_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {33, 33, SPECIES_ZUBAT},
+ {28, 28, SPECIES_ZUBAT},
+ {29, 29, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {35, 35, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room2_LandMonsInfo = {4, SeafloorCavern_Room2_LandMons};
+
+const struct WildPokemon SeafloorCavern_Room3_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {33, 33, SPECIES_ZUBAT},
+ {28, 28, SPECIES_ZUBAT},
+ {29, 29, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {35, 35, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room3_LandMonsInfo = {4, SeafloorCavern_Room3_LandMons};
+
+const struct WildPokemon SeafloorCavern_Room4_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {33, 33, SPECIES_ZUBAT},
+ {28, 28, SPECIES_ZUBAT},
+ {29, 29, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {35, 35, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room4_LandMonsInfo = {4, SeafloorCavern_Room4_LandMons};
+
+const struct WildPokemon SeafloorCavern_Room5_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {33, 33, SPECIES_ZUBAT},
+ {28, 28, SPECIES_ZUBAT},
+ {29, 29, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {35, 35, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room5_LandMonsInfo = {4, SeafloorCavern_Room5_LandMons};
+
+const struct WildPokemon SeafloorCavern_Room6_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {33, 33, SPECIES_ZUBAT},
+ {28, 28, SPECIES_ZUBAT},
+ {29, 29, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {35, 35, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room6_LandMonsInfo = {4, SeafloorCavern_Room6_LandMons};
+
+const struct WildPokemon SeafloorCavern_Room6_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_ZUBAT},
+ {30, 35, SPECIES_ZUBAT},
+ {30, 35, SPECIES_GOLBAT},
+ {30, 35, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room6_WaterMonsInfo = {4, SeafloorCavern_Room6_WaterMons};
+
+const struct WildPokemon SeafloorCavern_Room6_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo SeafloorCavern_Room6_FishingMonsInfo = {10, SeafloorCavern_Room6_FishingMons};
+
+const struct WildPokemon SeafloorCavern_Room7_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {33, 33, SPECIES_ZUBAT},
+ {28, 28, SPECIES_ZUBAT},
+ {29, 29, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {35, 35, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room7_LandMonsInfo = {4, SeafloorCavern_Room7_LandMons};
+
+const struct WildPokemon SeafloorCavern_Room7_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_ZUBAT},
+ {30, 35, SPECIES_ZUBAT},
+ {30, 35, SPECIES_GOLBAT},
+ {30, 35, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room7_WaterMonsInfo = {4, SeafloorCavern_Room7_WaterMons};
+
+const struct WildPokemon SeafloorCavern_Room7_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo SeafloorCavern_Room7_FishingMonsInfo = {10, SeafloorCavern_Room7_FishingMons};
+
+const struct WildPokemon SeafloorCavern_Room8_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {33, 33, SPECIES_ZUBAT},
+ {28, 28, SPECIES_ZUBAT},
+ {29, 29, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {35, 35, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo SeafloorCavern_Room8_LandMonsInfo = {4, SeafloorCavern_Room8_LandMons};
+
+const struct WildPokemon CaveOfOrigin_Entrance_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+ {33, 33, SPECIES_ZUBAT},
+ {28, 28, SPECIES_ZUBAT},
+ {29, 29, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {35, 35, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo CaveOfOrigin_Entrance_LandMonsInfo = {4, CaveOfOrigin_Entrance_LandMons};
+
+const struct WildPokemon CaveOfOrigin_1F_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+#ifdef SAPPHIRE
+ {30, 30, SPECIES_SABLEYE},
+ {32, 32, SPECIES_SABLEYE},
+ {34, 34, SPECIES_SABLEYE},
+#else
+ {30, 30, SPECIES_MAWILE},
+ {32, 32, SPECIES_MAWILE},
+ {34, 34, SPECIES_MAWILE},
+#endif
+ {33, 33, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo CaveOfOrigin_1F_LandMonsInfo = {4, CaveOfOrigin_1F_LandMons};
+
+const struct WildPokemon CaveOfOrigin_B1F_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+#ifdef SAPPHIRE
+ {30, 30, SPECIES_SABLEYE},
+ {32, 32, SPECIES_SABLEYE},
+ {34, 34, SPECIES_SABLEYE},
+#else
+ {30, 30, SPECIES_MAWILE},
+ {32, 32, SPECIES_MAWILE},
+ {34, 34, SPECIES_MAWILE},
+#endif
+ {33, 33, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo CaveOfOrigin_B1F_LandMonsInfo = {4, CaveOfOrigin_B1F_LandMons};
+
+const struct WildPokemon CaveOfOrigin_B2F_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+#ifdef SAPPHIRE
+ {30, 30, SPECIES_SABLEYE},
+ {32, 32, SPECIES_SABLEYE},
+ {34, 34, SPECIES_SABLEYE},
+#else
+ {30, 30, SPECIES_MAWILE},
+ {32, 32, SPECIES_MAWILE},
+ {34, 34, SPECIES_MAWILE},
+#endif
+ {33, 33, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo CaveOfOrigin_B2F_LandMonsInfo = {4, CaveOfOrigin_B2F_LandMons};
+
+const struct WildPokemon CaveOfOrigin_B3F_LandMons [] =
+{
+ {30, 30, SPECIES_ZUBAT},
+ {31, 31, SPECIES_ZUBAT},
+ {32, 32, SPECIES_ZUBAT},
+#ifdef SAPPHIRE
+ {30, 30, SPECIES_SABLEYE},
+ {32, 32, SPECIES_SABLEYE},
+ {34, 34, SPECIES_SABLEYE},
+#else
+ {30, 30, SPECIES_MAWILE},
+ {32, 32, SPECIES_MAWILE},
+ {34, 34, SPECIES_MAWILE},
+#endif
+ {33, 33, SPECIES_ZUBAT},
+ {34, 34, SPECIES_ZUBAT},
+ {34, 34, SPECIES_GOLBAT},
+ {35, 35, SPECIES_GOLBAT},
+ {33, 33, SPECIES_GOLBAT},
+ {36, 36, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo CaveOfOrigin_B3F_LandMonsInfo = {4, CaveOfOrigin_B3F_LandMons};
+
+const struct WildPokemon VictoryRoad_1F_LandMons [] =
+{
+ {40, 40, SPECIES_GOLBAT},
+ {40, 40, SPECIES_HARIYAMA},
+ {40, 40, SPECIES_LAIRON},
+ {40, 40, SPECIES_LOUDRED},
+ {36, 36, SPECIES_ZUBAT},
+ {36, 36, SPECIES_MAKUHITA},
+ {38, 38, SPECIES_GOLBAT},
+ {38, 38, SPECIES_HARIYAMA},
+ {36, 36, SPECIES_ARON},
+ {36, 36, SPECIES_WHISMUR},
+ {36, 36, SPECIES_ARON},
+ {36, 36, SPECIES_WHISMUR},
+};
+const struct WildPokemonInfo VictoryRoad_1F_LandMonsInfo = {10, VictoryRoad_1F_LandMons};
+
+const struct WildPokemon VictoryRoad_B1F_LandMons [] =
+{
+ {40, 40, SPECIES_GOLBAT},
+ {40, 40, SPECIES_HARIYAMA},
+ {40, 40, SPECIES_LAIRON},
+ {40, 40, SPECIES_MEDICHAM},
+ {38, 38, SPECIES_GOLBAT},
+ {38, 38, SPECIES_HARIYAMA},
+ {42, 42, SPECIES_GOLBAT},
+ {42, 42, SPECIES_HARIYAMA},
+ {42, 42, SPECIES_LAIRON},
+ {38, 38, SPECIES_MEDITITE},
+ {42, 42, SPECIES_LAIRON},
+ {38, 38, SPECIES_MEDITITE},
+};
+const struct WildPokemonInfo VictoryRoad_B1F_LandMonsInfo = {10, VictoryRoad_B1F_LandMons};
+
+const struct WildPokemon VictoryRoad_B1F_RockSmashMons [] =
+{
+ {30, 40, SPECIES_GRAVELER},
+ {30, 40, SPECIES_GEODUDE},
+ {35, 40, SPECIES_GRAVELER},
+ {35, 40, SPECIES_GRAVELER},
+ {35, 40, SPECIES_GRAVELER},
+};
+const struct WildPokemonInfo VictoryRoad_B1F_RockSmashMonsInfo = {20, VictoryRoad_B1F_RockSmashMons};
+
+const struct WildPokemon VictoryRoad_B2F_LandMons [] =
+{
+ {40, 40, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {40, 40, SPECIES_SABLEYE},
+#else
+ {40, 40, SPECIES_MAWILE},
+#endif
+ {40, 40, SPECIES_LAIRON},
+ {40, 40, SPECIES_MEDICHAM},
+ {42, 42, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {42, 42, SPECIES_SABLEYE},
+#else
+ {42, 42, SPECIES_MAWILE},
+#endif
+ {44, 44, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {44, 44, SPECIES_SABLEYE},
+#else
+ {44, 44, SPECIES_MAWILE},
+#endif
+ {42, 42, SPECIES_LAIRON},
+ {42, 42, SPECIES_MEDICHAM},
+ {44, 44, SPECIES_LAIRON},
+ {44, 44, SPECIES_MEDICHAM},
+};
+const struct WildPokemonInfo VictoryRoad_B2F_LandMonsInfo = {10, VictoryRoad_B2F_LandMons};
+
+const struct WildPokemon VictoryRoad_B2F_WaterMons [] =
+{
+ {30, 35, SPECIES_GOLBAT},
+ {25, 30, SPECIES_GOLBAT},
+ {35, 40, SPECIES_GOLBAT},
+ {35, 40, SPECIES_GOLBAT},
+ {35, 40, SPECIES_GOLBAT},
+};
+const struct WildPokemonInfo VictoryRoad_B2F_WaterMonsInfo = {4, VictoryRoad_B2F_WaterMons};
+
+const struct WildPokemon VictoryRoad_B2F_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_BARBOACH},
+ {25, 30, SPECIES_BARBOACH},
+ {30, 35, SPECIES_BARBOACH},
+ {30, 35, SPECIES_WHISCASH},
+ {35, 40, SPECIES_WHISCASH},
+ {40, 45, SPECIES_WHISCASH},
+};
+const struct WildPokemonInfo VictoryRoad_B2F_FishingMonsInfo = {30, VictoryRoad_B2F_FishingMons};
+
+const struct WildPokemon ShoalCave_LowTideEntranceRoom_LandMons [] =
+{
+ {26, 26, SPECIES_ZUBAT},
+ {26, 26, SPECIES_SPHEAL},
+ {28, 28, SPECIES_ZUBAT},
+ {28, 28, SPECIES_SPHEAL},
+ {30, 30, SPECIES_ZUBAT},
+ {30, 30, SPECIES_SPHEAL},
+ {32, 32, SPECIES_ZUBAT},
+ {32, 32, SPECIES_SPHEAL},
+ {32, 32, SPECIES_GOLBAT},
+ {32, 32, SPECIES_SPHEAL},
+ {32, 32, SPECIES_GOLBAT},
+ {32, 32, SPECIES_SPHEAL},
+};
+const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_LandMonsInfo = {10, ShoalCave_LowTideEntranceRoom_LandMons};
+
+const struct WildPokemon ShoalCave_LowTideEntranceRoom_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_ZUBAT},
+ {25, 30, SPECIES_SPHEAL},
+ {25, 30, SPECIES_SPHEAL},
+ {25, 35, SPECIES_SPHEAL},
+};
+const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_WaterMonsInfo = {4, ShoalCave_LowTideEntranceRoom_WaterMons};
+
+const struct WildPokemon ShoalCave_LowTideEntranceRoom_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo ShoalCave_LowTideEntranceRoom_FishingMonsInfo = {10, ShoalCave_LowTideEntranceRoom_FishingMons};
+
+const struct WildPokemon ShoalCave_LowTideInnerRoom_LandMons [] =
+{
+ {26, 26, SPECIES_ZUBAT},
+ {26, 26, SPECIES_SPHEAL},
+ {28, 28, SPECIES_ZUBAT},
+ {28, 28, SPECIES_SPHEAL},
+ {30, 30, SPECIES_ZUBAT},
+ {30, 30, SPECIES_SPHEAL},
+ {32, 32, SPECIES_ZUBAT},
+ {32, 32, SPECIES_SPHEAL},
+ {32, 32, SPECIES_GOLBAT},
+ {32, 32, SPECIES_SPHEAL},
+ {32, 32, SPECIES_GOLBAT},
+ {32, 32, SPECIES_SPHEAL},
+};
+const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_LandMonsInfo = {10, ShoalCave_LowTideInnerRoom_LandMons};
+
+const struct WildPokemon ShoalCave_LowTideInnerRoom_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_ZUBAT},
+ {25, 30, SPECIES_SPHEAL},
+ {25, 30, SPECIES_SPHEAL},
+ {25, 35, SPECIES_SPHEAL},
+};
+const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_WaterMonsInfo = {4, ShoalCave_LowTideInnerRoom_WaterMons};
+
+const struct WildPokemon ShoalCave_LowTideInnerRoom_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo ShoalCave_LowTideInnerRoom_FishingMonsInfo = {10, ShoalCave_LowTideInnerRoom_FishingMons};
+
+const struct WildPokemon ShoalCave_LowTideStairsRoom_LandMons [] =
+{
+ {26, 26, SPECIES_ZUBAT},
+ {26, 26, SPECIES_SPHEAL},
+ {28, 28, SPECIES_ZUBAT},
+ {28, 28, SPECIES_SPHEAL},
+ {30, 30, SPECIES_ZUBAT},
+ {30, 30, SPECIES_SPHEAL},
+ {32, 32, SPECIES_ZUBAT},
+ {32, 32, SPECIES_SPHEAL},
+ {32, 32, SPECIES_GOLBAT},
+ {32, 32, SPECIES_SPHEAL},
+ {32, 32, SPECIES_GOLBAT},
+ {32, 32, SPECIES_SPHEAL},
+};
+const struct WildPokemonInfo ShoalCave_LowTideStairsRoom_LandMonsInfo = {10, ShoalCave_LowTideStairsRoom_LandMons};
+
+const struct WildPokemon ShoalCave_LowTideLowerRoom_LandMons [] =
+{
+ {26, 26, SPECIES_ZUBAT},
+ {26, 26, SPECIES_SPHEAL},
+ {28, 28, SPECIES_ZUBAT},
+ {28, 28, SPECIES_SPHEAL},
+ {30, 30, SPECIES_ZUBAT},
+ {30, 30, SPECIES_SPHEAL},
+ {32, 32, SPECIES_ZUBAT},
+ {32, 32, SPECIES_SPHEAL},
+ {32, 32, SPECIES_GOLBAT},
+ {32, 32, SPECIES_SPHEAL},
+ {32, 32, SPECIES_GOLBAT},
+ {32, 32, SPECIES_SPHEAL},
+};
+const struct WildPokemonInfo ShoalCave_LowTideLowerRoom_LandMonsInfo = {10, ShoalCave_LowTideLowerRoom_LandMons};
+
+const struct WildPokemon ShoalCave_LowTideIceRoom_LandMons [] =
+{
+ {26, 26, SPECIES_ZUBAT},
+ {26, 26, SPECIES_SPHEAL},
+ {28, 28, SPECIES_ZUBAT},
+ {28, 28, SPECIES_SPHEAL},
+ {30, 30, SPECIES_ZUBAT},
+ {30, 30, SPECIES_SPHEAL},
+ {26, 26, SPECIES_SNORUNT},
+ {32, 32, SPECIES_SPHEAL},
+ {30, 30, SPECIES_GOLBAT},
+ {28, 28, SPECIES_SNORUNT},
+ {32, 32, SPECIES_GOLBAT},
+ {30, 30, SPECIES_SNORUNT},
+};
+const struct WildPokemonInfo ShoalCave_LowTideIceRoom_LandMonsInfo = {10, ShoalCave_LowTideIceRoom_LandMons};
+
+const struct WildPokemon NewMauville_Entrance_LandMons [] =
+{
+ {24, 24, SPECIES_VOLTORB},
+ {24, 24, SPECIES_MAGNEMITE},
+ {25, 25, SPECIES_VOLTORB},
+ {25, 25, SPECIES_MAGNEMITE},
+ {23, 23, SPECIES_VOLTORB},
+ {23, 23, SPECIES_MAGNEMITE},
+ {26, 26, SPECIES_VOLTORB},
+ {26, 26, SPECIES_MAGNEMITE},
+ {22, 22, SPECIES_VOLTORB},
+ {22, 22, SPECIES_MAGNEMITE},
+ {22, 22, SPECIES_VOLTORB},
+ {22, 22, SPECIES_MAGNEMITE},
+};
+const struct WildPokemonInfo NewMauville_Entrance_LandMonsInfo = {10, NewMauville_Entrance_LandMons};
+
+const struct WildPokemon NewMauville_Inside_LandMons [] =
+{
+ {24, 24, SPECIES_VOLTORB},
+ {24, 24, SPECIES_MAGNEMITE},
+ {25, 25, SPECIES_VOLTORB},
+ {25, 25, SPECIES_MAGNEMITE},
+ {23, 23, SPECIES_VOLTORB},
+ {23, 23, SPECIES_MAGNEMITE},
+ {26, 26, SPECIES_VOLTORB},
+ {26, 26, SPECIES_MAGNEMITE},
+ {22, 22, SPECIES_VOLTORB},
+ {22, 22, SPECIES_MAGNEMITE},
+ {26, 26, SPECIES_ELECTRODE},
+ {26, 26, SPECIES_MAGNETON},
+};
+const struct WildPokemonInfo NewMauville_Inside_LandMonsInfo = {10, NewMauville_Inside_LandMons};
+
+const struct WildPokemon AbandonedShip_Rooms_B1F_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_TENTACOOL},
+ {30, 35, SPECIES_TENTACRUEL},
+};
+const struct WildPokemonInfo AbandonedShip_Rooms_B1F_WaterMonsInfo = {4, AbandonedShip_Rooms_B1F_WaterMons};
+
+const struct WildPokemon AbandonedShip_Rooms_B1F_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_TENTACOOL},
+ {25, 30, SPECIES_TENTACOOL},
+ {30, 35, SPECIES_TENTACOOL},
+ {30, 35, SPECIES_TENTACRUEL},
+ {25, 30, SPECIES_TENTACRUEL},
+ {20, 25, SPECIES_TENTACRUEL},
+};
+const struct WildPokemonInfo AbandonedShip_Rooms_B1F_FishingMonsInfo = {20, AbandonedShip_Rooms_B1F_FishingMons};
+
+const struct WildPokemon AbandonedShip_HiddenFloorCorridors_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_TENTACOOL},
+ {5, 35, SPECIES_TENTACOOL},
+ {30, 35, SPECIES_TENTACRUEL},
+};
+const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_WaterMonsInfo = {4, AbandonedShip_HiddenFloorCorridors_WaterMons};
+
+const struct WildPokemon AbandonedShip_HiddenFloorCorridors_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_TENTACOOL},
+ {25, 30, SPECIES_TENTACOOL},
+ {30, 35, SPECIES_TENTACOOL},
+ {30, 35, SPECIES_TENTACRUEL},
+ {25, 30, SPECIES_TENTACRUEL},
+ {20, 25, SPECIES_TENTACRUEL},
+};
+const struct WildPokemonInfo AbandonedShip_HiddenFloorCorridors_FishingMonsInfo = {20, AbandonedShip_HiddenFloorCorridors_FishingMons};
+
+const struct WildPokemon SkyPillar_1F_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {48, 48, SPECIES_SABLEYE},
+#else
+ {48, 48, SPECIES_MAWILE},
+#endif
+ {48, 48, SPECIES_GOLBAT},
+ {50, 50, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {50, 50, SPECIES_SABLEYE},
+#else
+ {50, 50, SPECIES_MAWILE},
+#endif
+ {48, 48, SPECIES_CLAYDOL},
+#ifdef SAPPHIRE
+ {48, 48, SPECIES_BANETTE},
+ {50, 50, SPECIES_BANETTE},
+#else
+ {48, 48, SPECIES_DUSCLOPS},
+ {50, 50, SPECIES_DUSCLOPS},
+#endif
+ {49, 49, SPECIES_CLAYDOL},
+ {47, 47, SPECIES_CLAYDOL},
+ {50, 50, SPECIES_CLAYDOL},
+ {47, 47, SPECIES_CLAYDOL},
+ {50, 50, SPECIES_CLAYDOL},
+};
+const struct WildPokemonInfo SkyPillar_1F_LandMonsInfo = {10, SkyPillar_1F_LandMons};
+
+const struct WildPokemon SkyPillar_3F_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {51, 51, SPECIES_SABLEYE},
+#else
+ {51, 51, SPECIES_MAWILE},
+#endif
+ {51, 51, SPECIES_GOLBAT},
+ {53, 53, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {53, 53, SPECIES_SABLEYE},
+#else
+ {53, 53, SPECIES_MAWILE},
+#endif
+ {51, 51, SPECIES_CLAYDOL},
+#ifdef SAPPHIRE
+ {51, 51, SPECIES_BANETTE},
+ {53, 53, SPECIES_BANETTE},
+#else
+ {51, 51, SPECIES_DUSCLOPS},
+ {53, 53, SPECIES_DUSCLOPS},
+#endif
+ {52, 52, SPECIES_CLAYDOL},
+ {50, 50, SPECIES_CLAYDOL},
+ {53, 53, SPECIES_CLAYDOL},
+ {50, 50, SPECIES_CLAYDOL},
+ {53, 53, SPECIES_CLAYDOL},
+};
+const struct WildPokemonInfo SkyPillar_3F_LandMonsInfo = {10, SkyPillar_3F_LandMons};
+
+const struct WildPokemon SkyPillar_5F_LandMons [] =
+{
+#ifdef SAPPHIRE
+ {54, 54, SPECIES_SABLEYE},
+#else
+ {54, 54, SPECIES_MAWILE},
+#endif
+ {54, 54, SPECIES_GOLBAT},
+ {56, 56, SPECIES_GOLBAT},
+#ifdef SAPPHIRE
+ {56, 56, SPECIES_SABLEYE},
+#else
+ {56, 56, SPECIES_MAWILE},
+#endif
+ {54, 54, SPECIES_CLAYDOL},
+#ifdef SAPPHIRE
+ {54, 54, SPECIES_BANETTE},
+ {56, 56, SPECIES_BANETTE},
+#else
+ {54, 54, SPECIES_DUSCLOPS},
+ {56, 56, SPECIES_DUSCLOPS},
+#endif
+ {55, 55, SPECIES_CLAYDOL},
+ {56, 56, SPECIES_CLAYDOL},
+ {57, 57, SPECIES_ALTARIA},
+ {54, 54, SPECIES_ALTARIA},
+ {60, 60, SPECIES_ALTARIA},
+};
+const struct WildPokemonInfo SkyPillar_5F_LandMonsInfo = {10, SkyPillar_5F_LandMons};
+
+const struct WildPokemon Route101_LandMons [] =
+{
+ {2, 2, SPECIES_WURMPLE},
+ {2, 2, SPECIES_ZIGZAGOON},
+ {2, 2, SPECIES_WURMPLE},
+ {3, 3, SPECIES_WURMPLE},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_WURMPLE},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {2, 2, SPECIES_POOCHYENA},
+ {2, 2, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_POOCHYENA},
+};
+const struct WildPokemonInfo Route101_LandMonsInfo = {20, Route101_LandMons};
+
+const struct WildPokemon Route102_LandMons [] =
+{
+ {3, 3, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_WURMPLE},
+ {4, 4, SPECIES_ZIGZAGOON},
+ {4, 4, SPECIES_WURMPLE},
+#ifdef SAPPHIRE
+ {3, 3, SPECIES_LOTAD},
+ {4, 4, SPECIES_LOTAD},
+#else
+ {3, 3, SPECIES_SEEDOT},
+ {4, 4, SPECIES_SEEDOT},
+#endif
+ {3, 3, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_POOCHYENA},
+ {4, 4, SPECIES_POOCHYENA},
+ {4, 4, SPECIES_RALTS},
+ {4, 4, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_SURSKIT},
+};
+const struct WildPokemonInfo Route102_LandMonsInfo = {20, Route102_LandMons};
+
+const struct WildPokemon Route102_WaterMons [] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_SURSKIT},
+};
+const struct WildPokemonInfo Route102_WaterMonsInfo = {4, Route102_WaterMons};
+
+const struct WildPokemon Route102_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_CORPHISH},
+ {25, 30, SPECIES_CORPHISH},
+ {30, 35, SPECIES_CORPHISH},
+ {20, 25, SPECIES_CORPHISH},
+ {35, 40, SPECIES_CORPHISH},
+ {40, 45, SPECIES_CORPHISH},
+};
+const struct WildPokemonInfo Route102_FishingMonsInfo = {30, Route102_FishingMons};
+
+const struct WildPokemon Route103_LandMons [] =
+{
+ {2, 2, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {3, 3, SPECIES_ZIGZAGOON},
+ {4, 4, SPECIES_ZIGZAGOON},
+ {2, 2, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_POOCHYENA},
+ {4, 4, SPECIES_POOCHYENA},
+ {3, 3, SPECIES_WINGULL},
+ {3, 3, SPECIES_WINGULL},
+ {2, 2, SPECIES_WINGULL},
+ {4, 4, SPECIES_WINGULL},
+};
+const struct WildPokemonInfo Route103_LandMonsInfo = {20, Route103_LandMons};
+
+const struct WildPokemon Route103_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route103_WaterMonsInfo = {4, Route103_WaterMons};
+
+const struct WildPokemon Route103_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route103_FishingMonsInfo = {30, Route103_FishingMons};
+
+const struct WildPokemon Route104_LandMons [] =
+{
+ {4, 4, SPECIES_ZIGZAGOON},
+ {4, 4, SPECIES_WURMPLE},
+ {5, 5, SPECIES_ZIGZAGOON},
+ {5, 5, SPECIES_WURMPLE},
+ {4, 4, SPECIES_ZIGZAGOON},
+ {5, 5, SPECIES_ZIGZAGOON},
+ {4, 4, SPECIES_TAILLOW},
+ {5, 5, SPECIES_TAILLOW},
+ {4, 4, SPECIES_WINGULL},
+ {4, 4, SPECIES_WINGULL},
+ {3, 3, SPECIES_WINGULL},
+ {5, 5, SPECIES_WINGULL},
+};
+const struct WildPokemonInfo Route104_LandMonsInfo = {20, Route104_LandMons};
+
+const struct WildPokemon Route104_WaterMons [] =
+{
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route104_WaterMonsInfo = {4, Route104_WaterMons};
+
+const struct WildPokemon Route104_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_MAGIKARP},
+ {25, 30, SPECIES_MAGIKARP},
+ {30, 35, SPECIES_MAGIKARP},
+ {20, 25, SPECIES_MAGIKARP},
+ {35, 40, SPECIES_MAGIKARP},
+ {40, 45, SPECIES_MAGIKARP},
+};
+const struct WildPokemonInfo Route104_FishingMonsInfo = {30, Route104_FishingMons};
+
+const struct WildPokemon Route105_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route105_WaterMonsInfo = {4, Route105_WaterMons};
+
+const struct WildPokemon Route105_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route105_FishingMonsInfo = {30, Route105_FishingMons};
+
+const struct WildPokemon Route106_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route106_WaterMonsInfo = {4, Route106_WaterMons};
+
+const struct WildPokemon Route106_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route106_FishingMonsInfo = {30, Route106_FishingMons};
+
+const struct WildPokemon Route107_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route107_WaterMonsInfo = {4, Route107_WaterMons};
+
+const struct WildPokemon Route107_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route107_FishingMonsInfo = {30, Route107_FishingMons};
+
+const struct WildPokemon Route108_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route108_WaterMonsInfo = {4, Route108_WaterMons};
+
+const struct WildPokemon Route108_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route108_FishingMonsInfo = {30, Route108_FishingMons};
+
+const struct WildPokemon Route109_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route109_WaterMonsInfo = {4, Route109_WaterMons};
+
+const struct WildPokemon Route109_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route109_FishingMonsInfo = {30, Route109_FishingMons};
+
+const struct WildPokemon Route110_LandMons [] =
+{
+ {12, 12, SPECIES_ZIGZAGOON},
+ {12, 12, SPECIES_ELECTRIKE},
+ {12, 12, SPECIES_GULPIN},
+ {13, 13, SPECIES_ELECTRIKE},
+#ifdef SAPPHIRE
+ {13, 13, SPECIES_PLUSLE},
+#else
+ {13, 13, SPECIES_MINUN},
+#endif
+ {13, 13, SPECIES_ODDISH},
+#ifdef SAPPHIRE
+ {13, 13, SPECIES_PLUSLE},
+#else
+ {13, 13, SPECIES_MINUN},
+#endif
+ {13, 13, SPECIES_GULPIN},
+ {12, 12, SPECIES_WINGULL},
+ {12, 12, SPECIES_WINGULL},
+#ifdef SAPPHIRE
+ {12, 12, SPECIES_MINUN},
+ {13, 13, SPECIES_MINUN},
+#else
+ {12, 12, SPECIES_PLUSLE},
+ {13, 13, SPECIES_PLUSLE},
+#endif
+};
+const struct WildPokemonInfo Route110_LandMonsInfo = {20, Route110_LandMons};
+
+const struct WildPokemon Route110_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route110_WaterMonsInfo = {4, Route110_WaterMons};
+
+const struct WildPokemon Route110_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route110_FishingMonsInfo = {30, Route110_FishingMons};
+
+const struct WildPokemon Route111_LandMons [] =
+{
+ {20, 20, SPECIES_SANDSHREW},
+ {20, 20, SPECIES_TRAPINCH},
+ {21, 21, SPECIES_SANDSHREW},
+ {21, 21, SPECIES_TRAPINCH},
+ {19, 19, SPECIES_CACNEA},
+ {21, 21, SPECIES_CACNEA},
+ {19, 19, SPECIES_SANDSHREW},
+ {19, 19, SPECIES_TRAPINCH},
+ {20, 20, SPECIES_BALTOY},
+ {20, 20, SPECIES_BALTOY},
+ {22, 22, SPECIES_BALTOY},
+ {22, 22, SPECIES_BALTOY},
+};
+const struct WildPokemonInfo Route111_LandMonsInfo = {10, Route111_LandMons};
+
+const struct WildPokemon Route111_WaterMons [] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_SURSKIT},
+};
+const struct WildPokemonInfo Route111_WaterMonsInfo = {4, Route111_WaterMons};
+
+const struct WildPokemon Route111_RockSmashMons [] =
+{
+ {10, 15, SPECIES_GEODUDE},
+ {5, 10, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+};
+const struct WildPokemonInfo Route111_RockSmashMonsInfo = {20, Route111_RockSmashMons};
+
+const struct WildPokemon Route111_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_BARBOACH},
+ {25, 30, SPECIES_BARBOACH},
+ {30, 35, SPECIES_BARBOACH},
+ {20, 25, SPECIES_BARBOACH},
+ {35, 40, SPECIES_BARBOACH},
+ {40, 45, SPECIES_BARBOACH},
+};
+const struct WildPokemonInfo Route111_FishingMonsInfo = {30, Route111_FishingMons};
+
+const struct WildPokemon Route112_LandMons [] =
+{
+ {15, 15, SPECIES_NUMEL},
+ {15, 15, SPECIES_NUMEL},
+ {15, 15, SPECIES_MACHOP},
+ {14, 14, SPECIES_NUMEL},
+ {14, 14, SPECIES_NUMEL},
+ {14, 14, SPECIES_MACHOP},
+ {16, 16, SPECIES_NUMEL},
+ {16, 16, SPECIES_MACHOP},
+ {16, 16, SPECIES_NUMEL},
+ {16, 16, SPECIES_NUMEL},
+ {16, 16, SPECIES_NUMEL},
+ {16, 16, SPECIES_NUMEL},
+};
+const struct WildPokemonInfo Route112_LandMonsInfo = {20, Route112_LandMons};
+
+const struct WildPokemon Route113_LandMons [] =
+{
+ {15, 15, SPECIES_SPINDA},
+ {15, 15, SPECIES_SPINDA},
+ {15, 15, SPECIES_SANDSHREW},
+ {14, 14, SPECIES_SPINDA},
+ {14, 14, SPECIES_SPINDA},
+ {14, 14, SPECIES_SANDSHREW},
+ {16, 16, SPECIES_SPINDA},
+ {16, 16, SPECIES_SANDSHREW},
+ {16, 16, SPECIES_SPINDA},
+ {16, 16, SPECIES_SKARMORY},
+ {16, 16, SPECIES_SPINDA},
+ {16, 16, SPECIES_SKARMORY},
+};
+const struct WildPokemonInfo Route113_LandMonsInfo = {20, Route113_LandMons};
+
+const struct WildPokemon Route114_LandMons [] =
+{
+ {16, 16, SPECIES_SWABLU},
+#ifdef SAPPHIRE
+ {16, 16, SPECIES_LOTAD},
+#else
+ {16, 16, SPECIES_SEEDOT},
+#endif
+ {17, 17, SPECIES_SWABLU},
+ {15, 15, SPECIES_SWABLU},
+#ifdef SAPPHIRE
+ {15, 15, SPECIES_LOTAD},
+ {16, 16, SPECIES_SEVIPER},
+ {16, 16, SPECIES_LOMBRE},
+ {18, 18, SPECIES_LOMBRE},
+ {17, 17, SPECIES_SEVIPER},
+ {15, 15, SPECIES_SEVIPER},
+ {17, 17, SPECIES_SEVIPER},
+#else
+ {15, 15, SPECIES_SEEDOT},
+ {16, 16, SPECIES_ZANGOOSE},
+ {16, 16, SPECIES_NUZLEAF},
+ {18, 18, SPECIES_NUZLEAF},
+ {17, 17, SPECIES_ZANGOOSE},
+ {15, 15, SPECIES_ZANGOOSE},
+ {17, 17, SPECIES_ZANGOOSE},
+#endif
+ {15, 15, SPECIES_SURSKIT},
+};
+const struct WildPokemonInfo Route114_LandMonsInfo = {20, Route114_LandMons};
+
+const struct WildPokemon Route114_WaterMons [] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_SURSKIT},
+};
+const struct WildPokemonInfo Route114_WaterMonsInfo = {4, Route114_WaterMons};
+
+const struct WildPokemon Route114_RockSmashMons [] =
+{
+ {10, 15, SPECIES_GEODUDE},
+ {5, 10, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+};
+const struct WildPokemonInfo Route114_RockSmashMonsInfo = {20, Route114_RockSmashMons};
+
+const struct WildPokemon Route114_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_BARBOACH},
+ {25, 30, SPECIES_BARBOACH},
+ {30, 35, SPECIES_BARBOACH},
+ {20, 25, SPECIES_BARBOACH},
+ {35, 40, SPECIES_BARBOACH},
+ {40, 45, SPECIES_BARBOACH},
+};
+const struct WildPokemonInfo Route114_FishingMonsInfo = {30, Route114_FishingMons};
+
+const struct WildPokemon Route115_LandMons [] =
+{
+ {23, 23, SPECIES_SWABLU},
+ {23, 23, SPECIES_TAILLOW},
+ {25, 25, SPECIES_SWABLU},
+ {24, 24, SPECIES_TAILLOW},
+ {25, 25, SPECIES_TAILLOW},
+ {25, 25, SPECIES_SWELLOW},
+ {24, 24, SPECIES_JIGGLYPUFF},
+ {25, 25, SPECIES_JIGGLYPUFF},
+ {24, 24, SPECIES_WINGULL},
+ {24, 24, SPECIES_WINGULL},
+ {26, 26, SPECIES_WINGULL},
+ {25, 25, SPECIES_WINGULL},
+};
+const struct WildPokemonInfo Route115_LandMonsInfo = {20, Route115_LandMons};
+
+const struct WildPokemon Route115_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route115_WaterMonsInfo = {4, Route115_WaterMons};
+
+const struct WildPokemon Route115_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route115_FishingMonsInfo = {30, Route115_FishingMons};
+
+const struct WildPokemon Route116_LandMons [] =
+{
+ {6, 6, SPECIES_ZIGZAGOON},
+ {6, 6, SPECIES_WHISMUR},
+ {6, 6, SPECIES_NINCADA},
+ {7, 7, SPECIES_WHISMUR},
+ {7, 7, SPECIES_NINCADA},
+ {6, 6, SPECIES_TAILLOW},
+ {7, 7, SPECIES_TAILLOW},
+ {8, 8, SPECIES_TAILLOW},
+ {7, 7, SPECIES_ZIGZAGOON},
+ {8, 8, SPECIES_ZIGZAGOON},
+ {7, 7, SPECIES_SKITTY},
+ {8, 8, SPECIES_SKITTY},
+};
+const struct WildPokemonInfo Route116_LandMonsInfo = {20, Route116_LandMons};
+
+const struct WildPokemon Route117_LandMons [] =
+{
+ {13, 13, SPECIES_ZIGZAGOON},
+ {13, 13, SPECIES_ROSELIA},
+ {14, 14, SPECIES_ZIGZAGOON},
+ {14, 14, SPECIES_ROSELIA},
+ {13, 13, SPECIES_MARILL},
+ {13, 13, SPECIES_ODDISH},
+#ifdef SAPPHIRE
+ {13, 13, SPECIES_VOLBEAT},
+ {13, 13, SPECIES_VOLBEAT},
+ {14, 14, SPECIES_VOLBEAT},
+ {14, 14, SPECIES_VOLBEAT},
+ {13, 13, SPECIES_ILLUMISE},
+#else
+ {13, 13, SPECIES_ILLUMISE},
+ {13, 13, SPECIES_ILLUMISE},
+ {14, 14, SPECIES_ILLUMISE},
+ {14, 14, SPECIES_ILLUMISE},
+ {13, 13, SPECIES_VOLBEAT},
+#endif
+ {13, 13, SPECIES_SURSKIT},
+};
+const struct WildPokemonInfo Route117_LandMonsInfo = {20, Route117_LandMons};
+
+const struct WildPokemon Route117_WaterMons [] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_SURSKIT},
+};
+const struct WildPokemonInfo Route117_WaterMonsInfo = {4, Route117_WaterMons};
+
+const struct WildPokemon Route117_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_CORPHISH},
+ {25, 30, SPECIES_CORPHISH},
+ {30, 35, SPECIES_CORPHISH},
+ {20, 25, SPECIES_CORPHISH},
+ {35, 40, SPECIES_CORPHISH},
+ {40, 45, SPECIES_CORPHISH},
+};
+const struct WildPokemonInfo Route117_FishingMonsInfo = {30, Route117_FishingMons};
+
+const struct WildPokemon Route118_LandMons [] =
+{
+ {24, 24, SPECIES_ZIGZAGOON},
+ {24, 24, SPECIES_ELECTRIKE},
+ {26, 26, SPECIES_ZIGZAGOON},
+ {26, 26, SPECIES_ELECTRIKE},
+ {26, 26, SPECIES_LINOONE},
+ {26, 26, SPECIES_MANECTRIC},
+ {25, 25, SPECIES_WINGULL},
+ {25, 25, SPECIES_WINGULL},
+ {26, 26, SPECIES_WINGULL},
+ {26, 26, SPECIES_WINGULL},
+ {27, 27, SPECIES_WINGULL},
+ {25, 25, SPECIES_KECLEON},
+};
+const struct WildPokemonInfo Route118_LandMonsInfo = {20, Route118_LandMons};
+
+const struct WildPokemon Route118_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route118_WaterMonsInfo = {4, Route118_WaterMons};
+
+const struct WildPokemon Route118_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_CARVANHA},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_CARVANHA},
+ {20, 25, SPECIES_CARVANHA},
+ {35, 40, SPECIES_CARVANHA},
+ {40, 45, SPECIES_CARVANHA},
+};
+const struct WildPokemonInfo Route118_FishingMonsInfo = {30, Route118_FishingMons};
+
+const struct WildPokemon Route119_LandMons [] =
+{
+ {25, 25, SPECIES_ZIGZAGOON},
+ {25, 25, SPECIES_LINOONE},
+ {27, 27, SPECIES_ZIGZAGOON},
+ {25, 25, SPECIES_ODDISH},
+ {27, 27, SPECIES_LINOONE},
+ {26, 26, SPECIES_ODDISH},
+ {27, 27, SPECIES_ODDISH},
+ {24, 24, SPECIES_ODDISH},
+ {25, 25, SPECIES_TROPIUS},
+ {26, 26, SPECIES_TROPIUS},
+ {27, 27, SPECIES_TROPIUS},
+ {25, 25, SPECIES_KECLEON},
+};
+const struct WildPokemonInfo Route119_LandMonsInfo = {15, Route119_LandMons};
+
+const struct WildPokemon Route119_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route119_WaterMonsInfo = {4, Route119_WaterMons};
+
+const struct WildPokemon Route119_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_CARVANHA},
+ {25, 30, SPECIES_CARVANHA},
+ {30, 35, SPECIES_CARVANHA},
+ {20, 25, SPECIES_CARVANHA},
+ {35, 40, SPECIES_CARVANHA},
+ {40, 45, SPECIES_CARVANHA},
+};
+const struct WildPokemonInfo Route119_FishingMonsInfo = {30, Route119_FishingMons};
+
+const struct WildPokemon Route120_LandMons [] =
+{
+ {25, 25, SPECIES_ZIGZAGOON},
+ {25, 25, SPECIES_LINOONE},
+ {27, 27, SPECIES_LINOONE},
+ {25, 25, SPECIES_ODDISH},
+ {25, 25, SPECIES_MARILL},
+ {26, 26, SPECIES_ODDISH},
+ {27, 27, SPECIES_ODDISH},
+ {27, 27, SPECIES_MARILL},
+ {25, 25, SPECIES_ABSOL},
+ {27, 27, SPECIES_ABSOL},
+ {25, 25, SPECIES_KECLEON},
+ {25, 25, SPECIES_SURSKIT},
+};
+const struct WildPokemonInfo Route120_LandMonsInfo = {20, Route120_LandMons};
+
+const struct WildPokemon Route120_WaterMons [] =
+{
+ {20, 30, SPECIES_MARILL},
+ {10, 20, SPECIES_MARILL},
+ {30, 35, SPECIES_MARILL},
+ {5, 10, SPECIES_MARILL},
+ {20, 30, SPECIES_SURSKIT},
+};
+const struct WildPokemonInfo Route120_WaterMonsInfo = {4, Route120_WaterMons};
+
+const struct WildPokemon Route120_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_BARBOACH},
+ {25, 30, SPECIES_BARBOACH},
+ {30, 35, SPECIES_BARBOACH},
+ {20, 25, SPECIES_BARBOACH},
+ {35, 40, SPECIES_BARBOACH},
+ {40, 45, SPECIES_BARBOACH},
+};
+const struct WildPokemonInfo Route120_FishingMonsInfo = {30, Route120_FishingMons};
+
+const struct WildPokemon Route121_LandMons [] =
+{
+ {26, 26, SPECIES_ZIGZAGOON},
+#ifdef SAPPHIRE
+ {26, 26, SPECIES_SHUPPET},
+#else
+ {26, 26, SPECIES_DUSKULL},
+#endif
+ {26, 26, SPECIES_LINOONE},
+#ifdef SAPPHIRE
+ {28, 28, SPECIES_SHUPPET},
+#else
+ {28, 28, SPECIES_DUSKULL},
+#endif
+ {28, 28, SPECIES_LINOONE},
+ {26, 26, SPECIES_ODDISH},
+ {28, 28, SPECIES_ODDISH},
+ {28, 28, SPECIES_GLOOM},
+ {26, 26, SPECIES_WINGULL},
+ {27, 27, SPECIES_WINGULL},
+ {28, 28, SPECIES_WINGULL},
+ {25, 25, SPECIES_KECLEON},
+};
+const struct WildPokemonInfo Route121_LandMonsInfo = {20, Route121_LandMons};
+
+const struct WildPokemon Route121_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route121_WaterMonsInfo = {4, Route121_WaterMons};
+
+const struct WildPokemon Route121_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route121_FishingMonsInfo = {30, Route121_FishingMons};
+
+const struct WildPokemon Route122_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route122_WaterMonsInfo = {4, Route122_WaterMons};
+
+const struct WildPokemon Route122_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route122_FishingMonsInfo = {30, Route122_FishingMons};
+
+const struct WildPokemon Route123_LandMons [] =
+{
+ {26, 26, SPECIES_ZIGZAGOON},
+#ifdef SAPPHIRE
+ {26, 26, SPECIES_SHUPPET},
+#else
+ {26, 26, SPECIES_DUSKULL},
+#endif
+ {26, 26, SPECIES_LINOONE},
+#ifdef SAPPHIRE
+ {28, 28, SPECIES_SHUPPET},
+#else
+ {28, 28, SPECIES_DUSKULL},
+#endif
+ {28, 28, SPECIES_LINOONE},
+ {26, 26, SPECIES_ODDISH},
+ {28, 28, SPECIES_ODDISH},
+ {28, 28, SPECIES_GLOOM},
+ {26, 26, SPECIES_WINGULL},
+ {27, 27, SPECIES_WINGULL},
+ {28, 28, SPECIES_WINGULL},
+ {25, 25, SPECIES_KECLEON},
+};
+const struct WildPokemonInfo Route123_LandMonsInfo = {20, Route123_LandMons};
+
+const struct WildPokemon Route123_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route123_WaterMonsInfo = {4, Route123_WaterMons};
+
+const struct WildPokemon Route123_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route123_FishingMonsInfo = {30, Route123_FishingMons};
+
+const struct WildPokemon Route124_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route124_WaterMonsInfo = {4, Route124_WaterMons};
+
+const struct WildPokemon Route124_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route124_FishingMonsInfo = {30, Route124_FishingMons};
+
+const struct WildPokemon Route125_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route125_WaterMonsInfo = {4, Route125_WaterMons};
+
+const struct WildPokemon Route125_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route125_FishingMonsInfo = {30, Route125_FishingMons};
+
+const struct WildPokemon Route126_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route126_WaterMonsInfo = {4, Route126_WaterMons};
+
+const struct WildPokemon Route126_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route126_FishingMonsInfo = {30, Route126_FishingMons};
+
+const struct WildPokemon Route127_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route127_WaterMonsInfo = {4, Route127_WaterMons};
+
+const struct WildPokemon Route127_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route127_FishingMonsInfo = {30, Route127_FishingMons};
+
+const struct WildPokemon Route128_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route128_WaterMonsInfo = {4, Route128_WaterMons};
+
+const struct WildPokemon Route128_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_LUVDISC},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_LUVDISC},
+ {30, 35, SPECIES_WAILMER},
+ {30, 35, SPECIES_CORSOLA},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route128_FishingMonsInfo = {30, Route128_FishingMons};
+
+const struct WildPokemon Route129_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+#ifdef SAPPHIRE
+ {25, 30, SPECIES_WAILORD},
+#else
+ {35, 40, SPECIES_WAILORD},
+#endif
+};
+const struct WildPokemonInfo Route129_WaterMonsInfo = {4, Route129_WaterMons};
+
+const struct WildPokemon Route129_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route129_FishingMonsInfo = {30, Route129_FishingMons};
+
+const struct WildPokemon Route130_LandMons [] =
+{
+ {30, 30, SPECIES_WYNAUT},
+ {35, 35, SPECIES_WYNAUT},
+ {25, 25, SPECIES_WYNAUT},
+ {40, 40, SPECIES_WYNAUT},
+ {20, 20, SPECIES_WYNAUT},
+ {45, 45, SPECIES_WYNAUT},
+ {15, 15, SPECIES_WYNAUT},
+ {50, 50, SPECIES_WYNAUT},
+ {10, 10, SPECIES_WYNAUT},
+ {5, 5, SPECIES_WYNAUT},
+ {10, 10, SPECIES_WYNAUT},
+ {5, 5, SPECIES_WYNAUT},
+};
+const struct WildPokemonInfo Route130_LandMonsInfo = {20, Route130_LandMons};
+
+const struct WildPokemon Route130_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route130_WaterMonsInfo = {4, Route130_WaterMons};
+
+const struct WildPokemon Route130_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route130_FishingMonsInfo = {30, Route130_FishingMons};
+
+const struct WildPokemon Route131_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route131_WaterMonsInfo = {4, Route131_WaterMons};
+
+const struct WildPokemon Route131_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route131_FishingMonsInfo = {30, Route131_FishingMons};
+
+const struct WildPokemon Route132_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route132_WaterMonsInfo = {4, Route132_WaterMons};
+
+const struct WildPokemon Route132_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_HORSEA},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route132_FishingMonsInfo = {30, Route132_FishingMons};
+
+const struct WildPokemon Route133_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route133_WaterMonsInfo = {4, Route133_WaterMons};
+
+const struct WildPokemon Route133_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_HORSEA},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route133_FishingMonsInfo = {30, Route133_FishingMons};
+
+const struct WildPokemon Route134_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo Route134_WaterMonsInfo = {4, Route134_WaterMons};
+
+const struct WildPokemon Route134_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_HORSEA},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo Route134_FishingMonsInfo = {30, Route134_FishingMons};
+
+const struct WildPokemon SafariZone_Northwest_LandMons [] =
+{
+ {27, 27, SPECIES_RHYHORN},
+ {27, 27, SPECIES_ODDISH},
+ {29, 29, SPECIES_RHYHORN},
+ {29, 29, SPECIES_ODDISH},
+ {27, 27, SPECIES_DODUO},
+ {29, 29, SPECIES_GLOOM},
+ {31, 31, SPECIES_GLOOM},
+ {29, 29, SPECIES_DODUO},
+ {29, 29, SPECIES_DODRIO},
+ {27, 27, SPECIES_PINSIR},
+ {31, 31, SPECIES_DODRIO},
+ {29, 29, SPECIES_PINSIR},
+};
+const struct WildPokemonInfo SafariZone_Northwest_LandMonsInfo = {25, SafariZone_Northwest_LandMons};
+
+const struct WildPokemon SafariZone_Northwest_WaterMons [] =
+{
+ {20, 30, SPECIES_PSYDUCK},
+ {20, 30, SPECIES_PSYDUCK},
+ {30, 35, SPECIES_PSYDUCK},
+ {30, 35, SPECIES_GOLDUCK},
+ {25, 40, SPECIES_GOLDUCK},
+};
+const struct WildPokemonInfo SafariZone_Northwest_WaterMonsInfo = {9, SafariZone_Northwest_WaterMons};
+
+const struct WildPokemon SafariZone_Northwest_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 25, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_GOLDEEN},
+ {25, 30, SPECIES_GOLDEEN},
+ {30, 35, SPECIES_GOLDEEN},
+ {30, 35, SPECIES_SEAKING},
+ {35, 40, SPECIES_SEAKING},
+ {25, 30, SPECIES_SEAKING},
+};
+const struct WildPokemonInfo SafariZone_Northwest_FishingMonsInfo = {35, SafariZone_Northwest_FishingMons};
+
+const struct WildPokemon SafariZone_Northeast_LandMons [] =
+{
+ {27, 27, SPECIES_PHANPY},
+ {27, 27, SPECIES_ODDISH},
+ {29, 29, SPECIES_PHANPY},
+ {29, 29, SPECIES_ODDISH},
+ {27, 27, SPECIES_NATU},
+ {29, 29, SPECIES_GLOOM},
+ {31, 31, SPECIES_GLOOM},
+ {29, 29, SPECIES_NATU},
+ {29, 29, SPECIES_XATU},
+ {27, 27, SPECIES_HERACROSS},
+ {31, 31, SPECIES_XATU},
+ {29, 29, SPECIES_HERACROSS},
+};
+const struct WildPokemonInfo SafariZone_Northeast_LandMonsInfo = {25, SafariZone_Northeast_LandMons};
+
+const struct WildPokemon SafariZone_Northeast_RockSmashMons [] =
+{
+ {10, 15, SPECIES_GEODUDE},
+ {5, 10, SPECIES_GEODUDE},
+ {15, 20, SPECIES_GEODUDE},
+ {20, 25, SPECIES_GEODUDE},
+ {25, 30, SPECIES_GEODUDE},
+};
+const struct WildPokemonInfo SafariZone_Northeast_RockSmashMonsInfo = {25, SafariZone_Northeast_RockSmashMons};
+
+const struct WildPokemon SafariZone_Southwest_LandMons [] =
+{
+ {25, 25, SPECIES_ODDISH},
+ {27, 27, SPECIES_ODDISH},
+ {25, 25, SPECIES_GIRAFARIG},
+ {27, 27, SPECIES_GIRAFARIG},
+ {25, 25, SPECIES_NATU},
+#ifdef SAPPHIRE
+ {27, 27, SPECIES_DODUO},
+#else
+ {25, 25, SPECIES_DODUO},
+#endif
+ {25, 25, SPECIES_GLOOM},
+ {27, 27, SPECIES_WOBBUFFET},
+ {25, 25, SPECIES_PIKACHU},
+ {27, 27, SPECIES_WOBBUFFET},
+ {27, 27, SPECIES_PIKACHU},
+ {29, 29, SPECIES_WOBBUFFET},
+};
+const struct WildPokemonInfo SafariZone_Southwest_LandMonsInfo = {25, SafariZone_Southwest_LandMons};
+
+const struct WildPokemon SafariZone_Southwest_WaterMons [] =
+{
+ {20, 30, SPECIES_PSYDUCK},
+ {20, 30, SPECIES_PSYDUCK},
+ {30, 35, SPECIES_PSYDUCK},
+ {30, 35, SPECIES_PSYDUCK},
+ {30, 35, SPECIES_PSYDUCK},
+};
+const struct WildPokemonInfo SafariZone_Southwest_WaterMonsInfo = {9, SafariZone_Southwest_WaterMons};
+
+const struct WildPokemon SafariZone_Southwest_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 25, SPECIES_GOLDEEN},
+ {10, 30, SPECIES_GOLDEEN},
+ {25, 30, SPECIES_GOLDEEN},
+ {30, 35, SPECIES_GOLDEEN},
+ {30, 35, SPECIES_SEAKING},
+ {35, 40, SPECIES_SEAKING},
+ {25, 30, SPECIES_SEAKING},
+};
+const struct WildPokemonInfo SafariZone_Southwest_FishingMonsInfo = {35, SafariZone_Southwest_FishingMons};
+
+const struct WildPokemon SafariZone_Southeast_LandMons [] =
+{
+ {25, 25, SPECIES_ODDISH},
+ {27, 27, SPECIES_ODDISH},
+ {25, 25, SPECIES_GIRAFARIG},
+ {27, 27, SPECIES_GIRAFARIG},
+ {25, 25, SPECIES_NATU},
+ {25, 25, SPECIES_DODUO},
+ {25, 25, SPECIES_GLOOM},
+ {27, 27, SPECIES_WOBBUFFET},
+ {25, 25, SPECIES_PIKACHU},
+ {27, 27, SPECIES_WOBBUFFET},
+ {27, 27, SPECIES_PIKACHU},
+ {29, 29, SPECIES_WOBBUFFET},
+};
+const struct WildPokemonInfo SafariZone_Southeast_LandMonsInfo = {25, SafariZone_Southeast_LandMons};
+
+const struct WildPokemon DewfordTown_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo DewfordTown_WaterMonsInfo = {4, DewfordTown_WaterMons};
+
+const struct WildPokemon DewfordTown_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_WAILMER},
+ {20, 25, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo DewfordTown_FishingMonsInfo = {10, DewfordTown_FishingMons};
+
+const struct WildPokemon PacifidlogTown_WaterMons [] =
+{
+ {5, 35, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WINGULL},
+ {15, 25, SPECIES_WINGULL},
+ {25, 30, SPECIES_PELIPPER},
+ {25, 30, SPECIES_PELIPPER},
+};
+const struct WildPokemonInfo PacifidlogTown_WaterMonsInfo = {4, PacifidlogTown_WaterMons};
+
+const struct WildPokemon PacifidlogTown_FishingMons [] =
+{
+ {5, 10, SPECIES_MAGIKARP},
+ {5, 10, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_MAGIKARP},
+ {10, 30, SPECIES_TENTACOOL},
+ {10, 30, SPECIES_WAILMER},
+ {30, 35, SPECIES_SHARPEDO},
+ {30, 35, SPECIES_WAILMER},
+ {25, 30, SPECIES_WAILMER},
+ {35, 40, SPECIES_WAILMER},
+ {40, 45, SPECIES_WAILMER},
+};
+const struct WildPokemonInfo PacifidlogTown_FishingMonsInfo = {10, PacifidlogTown_FishingMons};
+
+const struct WildPokemon Underwater1_WaterMons [] =
+{
+ {20, 30, SPECIES_CLAMPERL},
+ {20, 30, SPECIES_CHINCHOU},
+ {30, 35, SPECIES_CLAMPERL},
+ {30, 35, SPECIES_RELICANTH},
+ {30, 35, SPECIES_RELICANTH},
+};
+const struct WildPokemonInfo Underwater1_WaterMonsInfo = {4, Underwater1_WaterMons};
+
+const struct WildPokemon Underwater2_WaterMons [] =
+{
+ {20, 30, SPECIES_CLAMPERL},
+ {20, 30, SPECIES_CHINCHOU},
+ {30, 35, SPECIES_CLAMPERL},
+ {30, 35, SPECIES_RELICANTH},
+ {30, 35, SPECIES_RELICANTH},
+};
+const struct WildPokemonInfo Underwater2_WaterMonsInfo = {4, Underwater2_WaterMons};
+
+
extern u16 gRoute119WaterTileData[];
extern struct WildPokemonHeader gWildMonHeaders[];
extern struct Pokemon gEnemyParty[6];
@@ -66,7 +2951,7 @@ static u16 GetRoute119WaterTileNum(s16 x, s16 y, u8 section)
u16 yMin = gRoute119WaterTileData[section * 3 + 0];
u16 yMax = gRoute119WaterTileData[section * 3 + 1];
u16 tileNum = gRoute119WaterTileData[section * 3 + 2];
-
+
for (yCur = yMin; yCur <= yMax; yCur++)
{
for (xCur = 0; xCur < gMapHeader.mapData->width; xCur++)
@@ -96,7 +2981,7 @@ static bool8 CheckFeebas(void)
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
x -= 7;
y -= 7;
-
+
#ifdef NONMATCHING
if (y >= gRoute119WaterTileData[3 * 1 + 0] && y <= gRoute119WaterTileData[3 * 1 + 1])
route119section = 1;
@@ -111,9 +2996,10 @@ static bool8 CheckFeebas(void)
route119section = 2;
}
#endif
-
+
if (Random() % 100 > 49) //50% chance of encountering Feebas
return FALSE;
+
FeebasSeedRng(gSaveBlock1.easyChatPairs[0].unk2);
for (i = 0; i != NUM_FEEBAS_SPOTS;)
{
@@ -185,7 +3071,7 @@ static u8 ChooseWildMonIndex_Water(void)
if (rand >= 90 && rand < 95) //5% chance
return 2;
if (rand >= 95 && rand < 99) //4% chance
- return 3;
+ return 3;
else //1% chance
return 4;
}
@@ -234,7 +3120,7 @@ static u8 ChooseWildMonIndex_Fishing(u8 rod)
return wildMonIndex;
}
-static u8 ChooseWildMonLevel(struct WildPokemon *wildPokemon)
+static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon)
{
u8 min;
u8 max;